From bafc3c8de87f834b84b4bd20b6a59fd9f2109d60 Mon Sep 17 00:00:00 2001 From: rayzhou-bit Date: Mon, 23 Jan 2023 14:51:21 -0500 Subject: [PATCH] Revert "feat: merge conflicts" This reverts commit 73ec807dd3b95768f1e8218446ab22e7aa783512, reversing changes made to 62cfecc45606ae34bfcd5e158b7256dc0915f45a. --- .github/workflows/release.yml | 2 +- README.md | 2 +- ...5-internal-editor-testability-decisions.md | 136 -- package-lock.json | 1836 ++++++++++++----- package.json | 5 +- src/editors/Editor.jsx | 2 +- .../__snapshots__/Editor.test.jsx.snap | 4 +- .../__snapshots__/index.test.jsx.snap | 115 +- .../__snapshots__/index.test.jsx.snap | 24 +- .../components/EditorFooter/index.jsx | 2 +- .../containers/EditorContainer/hooks.js | 22 +- .../containers/EditorContainer/hooks.test.jsx | 46 +- .../containers/EditorContainer/index.jsx | 44 +- .../containers/EditorContainer/index.test.jsx | 23 +- .../containers/EditorContainer/messages.js | 19 - .../AnswerWidget/AnswerOption.jsx | 178 +- .../AnswerWidget/AnswerOption.test.jsx | 27 +- .../AnswerWidget/AnswersContainer.jsx | 13 +- .../AnswerWidget/AnswersContainer.test.jsx | 90 - .../__snapshots__/AnswerOption.test.jsx.snap | 250 ++- .../AnswersContainer.test.jsx.snap | 59 - .../Checker/__snapshots__/index.test.jsx.snap | 23 - .../AnswerWidget/components/Checker/index.jsx | 32 - .../components/Checker/index.test.jsx | 22 - .../components/Feedback/FeedbackBox.jsx | 43 - .../components/Feedback/FeedbackBox.test.jsx | 22 - .../components/Feedback/FeedbackControl.jsx | 38 - .../Feedback/FeedbackControl.test.jsx | 26 - .../__snapshots__/FeedbackBox.test.jsx.snap | 66 - .../FeedbackControl.test.jsx.snap | 33 - .../components/Feedback/index.jsx | 2 - .../components/Feedback/messages.js | 34 - .../EditProblemView/AnswerWidget/hook.test.js | 12 - .../EditProblemView/AnswerWidget/hooks.js | 19 +- .../EditProblemView/AnswerWidget/index.jsx | 6 +- .../EditProblemView/AnswerWidget/index.scss | 39 +- .../EditProblemView/QuestionWidget/index.jsx | 15 +- .../EditProblemView/QuestionWidget/index.scss | 28 - .../SettingsWidget/SettingsOption.jsx | 2 +- .../SettingsOption.test.jsx.snap | 4 +- .../__snapshots__/index.test.jsx.snap | 320 ++- .../EditProblemView/SettingsWidget/hooks.js | 26 +- .../SettingsWidget/hooks.test.js | 48 +- .../EditProblemView/SettingsWidget/index.jsx | 118 +- .../SettingsWidget/messages.js | 55 +- .../settingsComponents/HintsCard.jsx | 2 +- .../settingsComponents/ScoringCard.jsx | 23 +- .../settingsComponents/ShowAnswerCard.jsx | 20 +- .../ShowAnswerCard.test.jsx | 34 +- .../SwitchToAdvancedEditorCard.jsx | 53 - .../SwitchToAdvancedEditorCard.test.jsx | 12 - .../settingsComponents/TypeCard.jsx | 22 +- .../settingsComponents/TypeCard.test.jsx | 4 - .../settingsComponents/TypeRow.jsx | 20 +- .../settingsComponents/TypeRow.test.jsx | 11 +- .../__snapshots__/HintRow.test.jsx.snap | 8 +- .../__snapshots__/HintsCard.test.jsx.snap | 8 +- .../__snapshots__/ScoringCard.test.jsx.snap | 75 +- .../ShowAnswerCard.test.jsx.snap | 2 +- .../SwitchToAdvancedEditorCard.test.jsx.snap | 50 - .../__snapshots__/TypeCard.test.jsx.snap | 37 +- .../__snapshots__/index.test.jsx.snap | 64 - .../components/EditProblemView/hooks.js | 14 - .../components/EditProblemView/hooks.test.js | 25 - .../components/EditProblemView/index.jsx | 41 +- .../components/EditProblemView/index.test.jsx | 20 - .../SelectTypeWrapper/SelectTypeFooter.jsx | 10 +- .../SelectTypeFooter.test.jsx | 8 +- .../SelectTypeFooter.test.jsx.snap | 7 +- .../__snapshots__/index.test.jsx.snap | 8 +- .../SelectTypeWrapper/index.jsx | 13 +- .../SelectTypeWrapper/index.test.jsx | 6 +- .../SelectTypeWrapper/messages.js | 5 - .../__snapshots__/index.test.jsx.snap | 16 +- .../content/AdvanceTypeSelect.jsx | 16 +- .../SelectTypeModal/content/Preview.jsx | 6 +- .../content/ProblemTypeSelect.jsx | 13 +- .../AdvanceTypeSelect.test.jsx.snap | 640 +++--- .../__snapshots__/Preview.test.jsx.snap | 80 +- .../ProblemTypeSelect.test.jsx.snap | 140 +- .../SelectTypeModal/content/messages.js | 13 +- .../components/SelectTypeModal/hooks.js | 12 +- .../components/SelectTypeModal/hooks.test.js | 29 +- .../components/SelectTypeModal/index.jsx | 16 +- .../ProblemEditor/data/OLXParser.js | 17 +- .../ProblemEditor/data/OLXParser.test.js | 12 - .../ProblemEditor/data/SettingsParser.js | 5 +- .../ProblemEditor/data/SettingsParser.test.js | 4 +- .../data/mockData/olxTestData.js | 42 +- .../data/mockData/problemTestData.js | 8 +- src/editors/containers/ProblemEditor/hooks.js | 14 +- .../containers/ProblemEditor/index.jsx | 4 +- .../__snapshots__/index.test.jsx.snap | 15 +- .../__snapshots__/index.test.jsx.snap | 0 .../components}/CodeEditor/constants.js | 0 .../components/CodeEditor/index.jsx | 109 + .../components}/CodeEditor/index.scss | 0 .../components}/CodeEditor/index.test.jsx | 25 +- .../components}/CodeEditor/messages.js | 0 .../__snapshots__/index.test.jsx.snap | 14 +- .../TextEditor/components/RawEditor/index.jsx | 38 + .../components}/RawEditor/index.test.jsx | 2 +- .../components/SourceCodeModal/index.jsx | 2 +- src/editors/containers/TextEditor/index.jsx | 4 +- .../__snapshots__/index.test.jsx.snap | 8 +- .../components/DurationWidget/hooks.js | 2 +- .../components/VideoSourceWidget/hooks.jsx | 83 +- .../VideoSourceWidget/hooks.test.jsx | 110 +- .../components/VideoSourceWidget/index.jsx | 29 +- .../VideoSourceWidget/index.test.jsx | 68 +- .../constants/advancedOlxTemplates/index.js | 11 - .../constants/basicOlxTemplates/dropdown.js | 13 - .../data/constants/basicOlxTemplates/index.js | 10 - .../basicOlxTemplates/multiSelect.js | 13 - .../constants/basicOlxTemplates/numeric.js | 10 - .../basicOlxTemplates/singleSelect.js | 12 - .../constants/basicOlxTemplates/textInput.js | 9 - .../circuitschematic.js | 2 +- .../customgrader.js | 2 +- .../constants/olxTemplates/drag_and_drop.js | 88 + .../formularesponse.js | 2 +- .../imageresponse.js | 2 +- .../jsinput_response.js | 2 +- .../problem_with_hint.js | 2 +- src/editors/data/constants/problem.js | 45 +- src/editors/data/constants/tinyMCEStyles.js | 428 ++-- src/editors/data/redux/problem/reducers.js | 29 +- .../data/redux/problem/reducers.test.js | 129 -- src/editors/data/redux/problem/selectors.js | 1 - .../data/redux/problem/selectors.test.js | 52 - .../data/redux/thunkActions/problem.js | 62 +- .../data/redux/thunkActions/problem.test.js | 51 - src/editors/data/redux/thunkActions/video.js | 36 +- .../data/redux/thunkActions/video.test.js | 51 +- src/editors/data/services/cms/api.js | 21 +- src/editors/data/services/cms/api.test.js | 37 +- src/editors/data/services/cms/mockApi.js | 7 +- .../sharedComponents/CodeEditor/hooks.js | 71 - .../sharedComponents/CodeEditor/index.jsx | 55 - .../sharedComponents/RawEditor/index.jsx | 55 - src/index.scss | 1 + src/setupTest.js | 1 - www/package-lock.json | 40 +- www/package.json | 2 +- 144 files changed, 3410 insertions(+), 4072 deletions(-) delete mode 100644 docs/decisions/0005-internal-editor-testability-decisions.md delete mode 100644 src/editors/containers/EditorContainer/messages.js delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswersContainer.test.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/__snapshots__/AnswersContainer.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/__snapshots__/index.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.test.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.test.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.test.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackBox.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackControl.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/index.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/messages.js delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.scss delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.test.jsx delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/SwitchToAdvancedEditorCard.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/__snapshots__/index.test.jsx.snap delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/hooks.js delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/hooks.test.js delete mode 100644 src/editors/containers/ProblemEditor/components/EditProblemView/index.test.jsx rename src/editors/{sharedComponents => containers/TextEditor/components}/CodeEditor/__snapshots__/index.test.jsx.snap (100%) rename src/editors/{sharedComponents => containers/TextEditor/components}/CodeEditor/constants.js (100%) create mode 100644 src/editors/containers/TextEditor/components/CodeEditor/index.jsx rename src/editors/{sharedComponents => containers/TextEditor/components}/CodeEditor/index.scss (100%) rename src/editors/{sharedComponents => containers/TextEditor/components}/CodeEditor/index.test.jsx (81%) rename src/editors/{sharedComponents => containers/TextEditor/components}/CodeEditor/messages.js (100%) rename src/editors/{sharedComponents => containers/TextEditor/components}/RawEditor/__snapshots__/index.test.jsx.snap (72%) create mode 100644 src/editors/containers/TextEditor/components/RawEditor/index.jsx rename src/editors/{sharedComponents => containers/TextEditor/components}/RawEditor/index.test.jsx (87%) delete mode 100644 src/editors/data/constants/advancedOlxTemplates/index.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/dropdown.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/index.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/multiSelect.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/numeric.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/singleSelect.js delete mode 100644 src/editors/data/constants/basicOlxTemplates/textInput.js rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/circuitschematic.js (99%) rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/customgrader.js (99%) create mode 100644 src/editors/data/constants/olxTemplates/drag_and_drop.js rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/formularesponse.js (96%) rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/imageresponse.js (98%) rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/jsinput_response.js (99%) rename src/editors/data/constants/{advancedOlxTemplates => olxTemplates}/problem_with_hint.js (98%) delete mode 100644 src/editors/data/redux/problem/reducers.test.js delete mode 100644 src/editors/data/redux/problem/selectors.test.js delete mode 100644 src/editors/data/redux/thunkActions/problem.test.js delete mode 100644 src/editors/sharedComponents/CodeEditor/hooks.js delete mode 100644 src/editors/sharedComponents/CodeEditor/index.jsx delete mode 100644 src/editors/sharedComponents/RawEditor/index.jsx diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a1007f8a7..6ab04a8c0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,4 +36,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.SEMANTIC_RELEASE_NPM_TOKEN }} - run: npx semantic-release@19.0.5 + run: npx semantic-release diff --git a/README.md b/README.md index 81796b73c..f80760868 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This guide presumes you have a functioning devstack. 2. In devstack + venv, run `$ make dev.provision.lms+studio+frontend-app-course-authoring` to make up the required services. Minimum services required are lms, studio and frontend-app-course-authoring. 4. In [Studio Django Admin](http://localhost:18000/admin/waffle/flag/) turn on `new_core_editors.use_new_text_editor` flag for HTML editor, `new_core_editors.use_new_video_editor` flag for new video editor, and `new_core_editors.use_new_problem_editor` flag for problems. The list of supported flags is in [toggles.py. ](https://github.com/openedx/edx-platform/blob/master/cms/djangoapps/contentstore/toggles.py). you might have to add a flag for your xblock of choice. 2. Clone this repo into the [`${DEVSTACK_WORKSPACE}/src` directory](https://edx.readthedocs.io/projects/open-edx-devstack/en/latest/readme.html?highlight=DEVSTACK_WORKSPACE#id9) the sibling repo of your edx devstack `/src`. -3. In the course authoring app, follow the guide to use your [local verison of frontend-lib-content-components. ](https://github.com/openedx/frontend-build#local-module-configuration-for-webpack) The module.config.js in the frontend-app-course-authoring repo will be: +3. In the course authoring app, follow the guide to use your [local verison of frontend-lib-content-components. ](https://github.com/openedx/frontend-build#local-module-configuration-for-webpack) The moduleconfig.js in the frontend-app-course-authoring repo will be: ``` module.exports = { diff --git a/docs/decisions/0005-internal-editor-testability-decisions.md b/docs/decisions/0005-internal-editor-testability-decisions.md deleted file mode 100644 index cd7e43455..000000000 --- a/docs/decisions/0005-internal-editor-testability-decisions.md +++ /dev/null @@ -1,136 +0,0 @@ -# Internal editor testability decision - -# Increased complexity for the sake of testability -The internally-managed editors in this repo (as of now planned to include text, video, and problem types) follow a number of patterns that increase the complexity of parts of the code slightly, in favor of providing increased testability around their behavior. - -## Note - Strict Dictionaries -Javacript is generally fairly lackadaisical with regards to dictionary access of missing/invalid keys. This is fine and expected in many cases, but also prevents us from using dictionary access on something like a key store to ensure we are calling something that actually exists. - -For this purpose, there are a pair of utilities in this repo called `StrictDict` and `keyStore`. - -`StrictDict` takes an object and returns a version that will complain (throw an error) if called with an invalid key. - -`keyStore` takes an object and returns a StrictDict of just the keys of that object. (this is useful particularly for mocking and spying on specific methods and fields) - -## Note - Self imports -Javascript webpack imports can be problematic around the specific issue of attempting to mock a single method being used in another method in the same file. - -Problem: File A includes methodA and methodB (which calls methodA). We want to be able to test methodA and then test methodB *without* having to re-test methodA as part of that test. We want to be able to mock methodA *only* while we are testing methodB. - -Solution: Self-imports. By importing the module into itself (which webpack handles nicely, don't worry), we provide tests the ability to spy on and mock individual methods from that module separately on a per-test basis. - -Ex: -```javascript -// myFile.js -import * as module from './myFile'; - -export const methodA = (val) => // do something complex with val and return a number -export const methodB = (val) => module.methodA(val) * 2; - -// myFile.test.js -import * as module from './myFile'; -import { keyStore } from './utils'; - -cosnt moduleKeys = keyStore(module); - -describe('myFile', () => { - describe('methodA', () => ...); - describe('methodB', () => { - const mockMethodA = (val) => val + 3 - const testValue = 23; - beforeEach(() => { - jest.spyOn(module, moduleKeys).mockImplementationValueOnce(mockMethodA); - }); - it('returns double the output of methodA with the given value', () => { - expect(module.methodB(testValue)).toEqual(mockMethodA(testValue) + 3); - }); - }); -}); -``` - -## Hooks and Snapshots - Separation from components for increased viability of snapshots -As part of the testing of these internal editors, we are relying on snapshot testing to ensure stability of the display of the components themselves. This can be a fragile solution in certain situations where components are too large or complex to adequately snapshot and verify. - -For this purpose, we have opted for a general pattern of separating all of the behavior of components withing these editors into separate `hooks` files. - -These hook files contain methods that utilize both `react` and `react-redux` hooks, along with arguments passed directly into the component, in order to generate the resulting desired behaviors. - -From there, components are tested by mocking out the behavior of these hooks to return verifyable data in the snapshots. - -As part of this separation, there are a number of additional patterns that are followed - -### Snapshot considerations -#### Callbacks -Any callback that is included in render in a component should be separated such that is is either passed in as a prop or derived from a hook, and should be mocked with a `mockName` using jest, to ensure that they are uniquely identifyable in the snapshots. - -Ex: -```javascript -const props = { - onClick: jest.fn().mockName('props.onClick'); -} -expect(shallow()).toMatchSnapshot(); -``` - -#### Imported components -Imported compoents are mocked to return simple string components based on their existing name. This results in shallow renders that display the components by name, with passed props, but do not attempt to render *any* logic from those components. - -This is a bit more complex for components with sub-components, but we have provided a test utility in `src/testUtils` called `mockNestedComponent` that will allow you to easily mock these for your snapshots as well. - -Ex: -```javascript -jest.mock('componentModule', () => { - const { mockNestedComponent } = jest.requireActual('./testUtils'); - return { - SimpleComponents: () => 'SimpleComponent', - NestedComponent: mockNestedComponent('NestedComponent', { - NestedChild1: 'NestedComponent.NestedChild1', - NestedChild2: 'NestedComponent.NestedChild2', - }), -}); -``` -#### Top-level mocked imports -We have mocked out all paragon components and icons being used in the repo, as well as a number of other common methods, hooks, and components in our module's `setupTests` file, which will ensure that those components show up reasonably in snapshots. - -### Hook Considerations -#### useState and mockUseState -React's useState hook is a very powerful alternative to class components, but is also somewhat problematic to test, as it returns different values based on where it is called in a hook, as well as based on previous runs of that hook. - -To resolve this, we are using a custom test utility to mock a hook modules state values for easy testing. - -This requires a particular structure to hook modules that use the useState, for the sake of enabling the mock process (which is documented with the utility). - -Ex: -```javascript -import * as module from './hooks'; -const state = { - myStateValue: (val) => useState(val), -}; -const myHook = () => { - const [myStateValue, setMyStateValue] = module.state.myStateValue('initialValue'); -}; -``` -Examples on how to use this for testing are included with the mock class in `src/testUtils` - -#### useCallback, useEffect -These hooks provide behavior that calls a method based on given prerequisite behaviors. -For this reason, we use general-purpose mocks for these hooks that return an object containing the passed callback and prerequisites for easy test access. - -#### Additional Considrations -*useIntl not available* - -We are using react-intl under the hood for our i18n support, but do not have access to some of the more recent features in that library due to the pinned version in frontend-platform. Specifically, this includes a `useIntl` hook available in later versions that is still unavailable to us, requiring us to use the older `injectIntl` pattern. - -*useDispatch* - -React-redux's `useDispatch` hook does not play nicely with being called in a method called by a component, and really wants to be called *in* the component. For this reason, the dispatch method is generated in components and passed through to hook components. - -## Notes for integration testing -Because of the top-level mocks in setupTest, any integration tests will need to be sure to unmock most of these. - -Ex: -```javascript -jest.unmock('@edx/frontend-platform/i18n'); -jest.unmock('@edx/paragon'); -jest.unmock('@edx/paragon/icons'); -jest.unmock('react-redux'); -``` diff --git a/package-lock.json b/package-lock.json index 27075c386..1c73363eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "license": "AGPL-3.0", "dependencies": { "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-xml": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@reduxjs/toolkit": "^1.8.1", @@ -36,9 +35,9 @@ "devDependencies": { "@edx/frontend-build": "^11.0.2", "@edx/frontend-platform": "2.4.0", - "@edx/paragon": "^20.27.0", + "@edx/paragon": "^20.21.3", "@testing-library/dom": "^8.13.0", - "@testing-library/react": "^12.1.1", + "@testing-library/react": "12.1.1", "@testing-library/user-event": "^13.5.0", "codecov": "3.8.3", "enzyme": "3.11.0", @@ -193,6 +192,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/code-frame/node_modules/@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", @@ -429,6 +437,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/core/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core/node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -452,6 +478,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/core/node_modules/@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -487,6 +525,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -586,36 +638,6 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", @@ -774,6 +796,36 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -809,6 +861,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -1378,6 +1444,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -1402,6 +1486,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/preset-env/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", @@ -2370,6 +2466,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/preset-env/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -2612,6 +2722,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/preset-react/node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -2701,6 +2829,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-react/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/runtime": { "version": "7.20.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", @@ -2712,20 +2854,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@codemirror/autocomplete": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.4.0.tgz", @@ -2784,6 +2912,14 @@ "@lezer/javascript": "^1.0.0" } }, + "node_modules/@codemirror/lang-javascript/node_modules/@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@codemirror/lang-javascript/node_modules/@lezer/javascript": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.0.tgz", @@ -2793,16 +2929,12 @@ "@lezer/lr": "^1.0.0" } }, - "node_modules/@codemirror/lang-xml": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.1.tgz", - "integrity": "sha512-0tvycUTElajCcRKgsszhKjWX+uuOogdu5+enpfqYA+j0gnP8ek7LRxujh2/XMPRdXt/hwOML4slJLE7r2eX3yQ==", + "node_modules/@codemirror/lang-javascript/node_modules/@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" + "@lezer/common": "^1.0.0" } }, "node_modules/@codemirror/language": { @@ -2818,6 +2950,22 @@ "style-mod": "^4.0.0" } }, + "node_modules/@codemirror/language/node_modules/@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/language/node_modules/@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@codemirror/language/node_modules/style-mod": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", @@ -3140,6 +3288,12 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "node_modules/@edx/frontend-build/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@edx/frontend-build/node_modules/@types/webpack": { "version": "5.28.0", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", @@ -4327,9 +4481,9 @@ } }, "node_modules/@edx/paragon": { - "version": "20.27.0", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.27.0.tgz", - "integrity": "sha512-jy62ZEBdAVlsP6tAm1/YDyMtc9fiD47H00whoW+y2Z+lLZqPsv6D5boIPQIcdBeg0W4f2gCU4TEy2+b2q8mYGA==", + "version": "20.21.5", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.21.5.tgz", + "integrity": "sha512-7+pRDS3MejiF3tsOFs9R6PC66zZJb8eN2nYObNWnyUmKZ7DfzzpHVsDuUYUg+J5cm3dYMY2imyIrMrqov6ettA==", "dev": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.1.1", @@ -4413,6 +4567,23 @@ "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==", "dev": true }, + "node_modules/@edx/paragon/node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@edx/paragon/node_modules/@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@edx/paragon/node_modules/@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -5071,7 +5242,7 @@ "@lezer/lr": "^1.0.0" } }, - "node_modules/@lezer/highlight": { + "node_modules/@lezer/css/node_modules/@lezer/highlight": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", @@ -5079,6 +5250,14 @@ "@lezer/common": "^1.0.0" } }, + "node_modules/@lezer/css/node_modules/@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@lezer/html": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.0.tgz", @@ -5089,21 +5268,20 @@ "@lezer/lr": "^1.0.0" } }, - "node_modules/@lezer/lr": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.0.tgz", - "integrity": "sha512-rpvS+WPS/PlbJCiW+bzXPbIFIRXmzRiTEDzMvrvgpED05w5ZQO59AzH3BJen2AnHuJIlP3DcJRjsKLTrkknUNA==", + "node_modules/@lezer/html/node_modules/@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", "dependencies": { "@lezer/common": "^1.0.0" } }, - "node_modules/@lezer/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-jMDXrV953sDAUEMI25VNrI9dz94Ai96FfeglytFINhhwQ867HKlCE2jt3AwZTCT7M528WxdDWv/Ty8e9wizwmQ==", + "node_modules/@lezer/html/node_modules/@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", "dependencies": { - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" + "@lezer/common": "^1.0.0" } }, "node_modules/@mapbox/node-pre-gyp": { @@ -5457,36 +5635,10 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", - "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "dev": true }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", - "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "dev": true }, "node_modules/@svgr/webpack": { "version": "6.2.1", @@ -5779,6 +5931,24 @@ "node": ">=6.9.0" } }, + "node_modules/@svgr/webpack/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@svgr/webpack/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@svgr/webpack/node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -5802,6 +5972,18 @@ "node": ">=6.9.0" } }, + "node_modules/@svgr/webpack/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@svgr/webpack/node_modules/@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", @@ -5901,6 +6083,20 @@ "node": ">=6.9.0" } }, + "node_modules/@svgr/webpack/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@svgr/webpack/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -6389,6 +6585,15 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/@svgr/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@svgr/webpack/node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -6497,42 +6702,16 @@ "dev": true }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } + "dev": true }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "dev": true }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } + "dev": true }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } + "dev": true }, "node_modules/@types/cheerio": { "version": "0.22.31", @@ -6543,151 +6722,41 @@ "@types/node": "*" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "node_modules/@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, + "node_modules/@types/react": {}, "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "dev": true }, "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, "node_modules/@types/uglify-js": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz", - "integrity": "sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } + "dev": true }, "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } + "dev": true }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@videojs/http-streaming": { @@ -8264,6 +8333,36 @@ "node": ">=6.9.0" } }, + "node_modules/babel-eslint/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-eslint/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-eslint/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/babel-eslint/node_modules/@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -8299,6 +8398,20 @@ "node": ">=6.9.0" } }, + "node_modules/babel-eslint/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/babel-eslint/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -8399,6 +8512,50 @@ "node": ">=6.9.0" } }, + "node_modules/babel-jest/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-jest/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-jest/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/babel-jest/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/babel-jest/node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -8495,6 +8652,12 @@ "@types/node": "*" } }, + "node_modules/babel-jest/node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, "node_modules/babel-jest/node_modules/@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", @@ -9417,6 +9580,15 @@ "node": ">=0.10.0" } }, + "node_modules/babel-jest/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babel-jest/node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -9533,6 +9705,12 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/babel-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -9725,6 +9903,50 @@ "node": ">=6.9.0" } }, + "node_modules/babel-plugin-react-intl/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-react-intl/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-react-intl/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/babel-plugin-react-intl/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/babel-plugin-react-intl/node_modules/@formatjs/ecma402-abstract": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.4.0.tgz", @@ -9805,6 +10027,12 @@ "@types/node": "*" } }, + "node_modules/babel-plugin-react-intl/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/babel-plugin-react-intl/node_modules/@types/schema-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/schema-utils/-/schema-utils-2.4.0.tgz", @@ -9883,6 +10111,38 @@ "is-valid-path": "^0.1.1" } }, + "node_modules/babel-plugin-transform-imports/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-transform-imports/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-transform-imports/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -9944,6 +10204,36 @@ "node": ">=6.9.0" } }, + "node_modules/babel-preset-jest/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-jest/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-jest/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/babel-preset-jest/node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -10105,6 +10395,20 @@ "node": ">=6.9.0" } }, + "node_modules/babel-preset-jest/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/babel-preset-jest/node_modules/@types/babel__core": { "version": "7.1.20", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", @@ -10118,6 +10422,15 @@ "@types/babel__traverse": "*" } }, + "node_modules/babel-preset-jest/node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, "node_modules/babel-preset-jest/node_modules/babel-plugin-jest-hoist": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", @@ -10934,6 +11247,15 @@ "source-map": "^0.6.0" } }, + "node_modules/clean-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11272,6 +11594,12 @@ "webpack": "^4.27.0 || ^5.0.0" } }, + "node_modules/css-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/css-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -12168,6 +12496,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/cssnano/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cssnano/node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -14418,6 +14755,12 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/file-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -16352,6 +16695,15 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/html-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/html-webpack-plugin/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -16594,6 +16946,12 @@ "@types/node": "*" } }, + "node_modules/image-webpack-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/image-webpack-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -20330,6 +20688,16 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/imagemin-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/imagemin-svgo/node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -22421,6 +22789,11 @@ } } }, + "node_modules/jest-resolve": { + "dev": true, + "optional": true, + "peer": true + }, "node_modules/jest/node_modules/@babel/generator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", @@ -22490,6 +22863,36 @@ "node": ">=6.9.0" } }, + "node_modules/jest/node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/jest/node_modules/@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -22525,6 +22928,20 @@ "node": ">=6.9.0" } }, + "node_modules/jest/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/jest/node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -22874,6 +23291,15 @@ "node": ">= 6" } }, + "node_modules/jest/node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, "node_modules/jest/node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -22883,6 +23309,12 @@ "@types/node": "*" } }, + "node_modules/jest/node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, "node_modules/jest/node_modules/@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", @@ -25128,6 +25560,15 @@ "node": ">=0.10.0" } }, + "node_modules/jest/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest/node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -26060,6 +26501,12 @@ "webpack": "^4.4.0 || ^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -26119,6 +26566,15 @@ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, + "node_modules/mini-css-extract-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mini-css-extract-plugin/node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -28286,6 +28742,12 @@ "node": ">= 8" } }, + "node_modules/react-dev-utils/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/react-dev-utils/node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -28978,6 +29440,17 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/react-intl/node_modules/@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/react-intl/node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -29536,6 +30009,15 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve/node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -30159,15 +30641,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-loader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", @@ -30819,6 +31292,12 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/style-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/style-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -31559,6 +32038,12 @@ } } }, + "node_modules/url-loader/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/url-loader/node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -32329,6 +32814,12 @@ "@types/node": "*" } }, + "node_modules/webpack-dev-server/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -33896,6 +34387,13 @@ "dev": true, "peer": true }, + "node_modules/webpack/node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true, + "peer": true + }, "node_modules/webpack/node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -34196,6 +34694,16 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/webpack/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -34636,6 +35144,12 @@ "@babel/highlight": "^7.18.6" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, "@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", @@ -34819,6 +35333,18 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -34836,6 +35362,12 @@ "@babel/types": "^7.20.5" } }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -34865,6 +35397,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -34936,24 +35479,6 @@ } } }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, "@babel/plugin-proposal-class-properties": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", @@ -35070,6 +35595,24 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -35099,6 +35642,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -35536,6 +36090,18 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -35554,6 +36120,12 @@ "@babel/types": "^7.20.5" } }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", @@ -36183,6 +36755,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -36368,6 +36951,18 @@ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -36423,6 +37018,17 @@ "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } } } }, @@ -36434,17 +37040,6 @@ "regenerator-runtime": "^0.13.11" } }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, "@codemirror/autocomplete": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.4.0.tgz", @@ -36497,6 +37092,14 @@ "@lezer/javascript": "^1.0.0" }, "dependencies": { + "@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, "@lezer/javascript": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.0.tgz", @@ -36505,21 +37108,17 @@ "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0" } + }, + "@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "requires": { + "@lezer/common": "^1.0.0" + } } } }, - "@codemirror/lang-xml": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.1.tgz", - "integrity": "sha512-0tvycUTElajCcRKgsszhKjWX+uuOogdu5+enpfqYA+j0gnP8ek7LRxujh2/XMPRdXt/hwOML4slJLE7r2eX3yQ==", - "requires": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" - } - }, "@codemirror/language": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.3.2.tgz", @@ -36533,6 +37132,22 @@ "style-mod": "^4.0.0" }, "dependencies": { + "@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, "style-mod": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", @@ -36778,6 +37393,12 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/webpack": { "version": "5.28.0", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", @@ -37695,9 +38316,9 @@ } }, "@edx/paragon": { - "version": "20.27.0", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.27.0.tgz", - "integrity": "sha512-jy62ZEBdAVlsP6tAm1/YDyMtc9fiD47H00whoW+y2Z+lLZqPsv6D5boIPQIcdBeg0W4f2gCU4TEy2+b2q8mYGA==", + "version": "20.21.5", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.21.5.tgz", + "integrity": "sha512-7+pRDS3MejiF3tsOFs9R6PC66zZJb8eN2nYObNWnyUmKZ7DfzzpHVsDuUYUg+J5cm3dYMY2imyIrMrqov6ettA==", "dev": true, "requires": { "@fortawesome/fontawesome-svg-core": "^6.1.1", @@ -37763,6 +38384,23 @@ "integrity": "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==", "dev": true }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -38237,14 +38875,24 @@ "requires": { "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0" - } - }, - "@lezer/highlight": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", - "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", - "requires": { - "@lezer/common": "^1.0.0" + }, + "dependencies": { + "@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "requires": { + "@lezer/common": "^1.0.0" + } + } } }, "@lezer/html": { @@ -38255,23 +38903,24 @@ "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0" - } - }, - "@lezer/lr": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.0.tgz", - "integrity": "sha512-rpvS+WPS/PlbJCiW+bzXPbIFIRXmzRiTEDzMvrvgpED05w5ZQO59AzH3BJen2AnHuJIlP3DcJRjsKLTrkknUNA==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lezer/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-jMDXrV953sDAUEMI25VNrI9dz94Ai96FfeglytFINhhwQ867HKlCE2jt3AwZTCT7M528WxdDWv/Ty8e9wizwmQ==", - "requires": { - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" + }, + "dependencies": { + "@lezer/highlight": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz", + "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/lr": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.2.5.tgz", + "integrity": "sha512-f9319YG1A/3ysgUE3bqCHEd7g+3ZZ71MWlwEc42mpnLVYXgfJJgtu1XAyBB4Kz8FmqmnFe9caopDqKeMMMAU6g==", + "requires": { + "@lezer/common": "^1.0.0" + } + } } }, "@mapbox/node-pre-gyp": { @@ -38546,18 +39195,10 @@ } }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", - "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", - "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/webpack": { "version": "6.2.1", @@ -38778,6 +39419,18 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", @@ -38795,6 +39448,12 @@ "@babel/types": "^7.20.5" } }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", @@ -38864,6 +39523,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -39172,6 +39842,12 @@ "boolbase": "^1.0.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -39252,42 +39928,16 @@ "dev": true }, "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } + "dev": true }, "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "dev": true }, "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } + "dev": true }, "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } + "dev": true }, "@types/cheerio": { "version": "0.22.31", @@ -39298,150 +39948,41 @@ "@types/node": "*" } }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "dev": true }, "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, + "@types/react": {}, "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "dev": true }, "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, "@types/uglify-js": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz", - "integrity": "sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } + "dev": true }, "@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } + "dev": true }, "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@videojs/http-streaming": { @@ -40585,6 +41126,24 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -40614,6 +41173,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -40689,6 +41259,35 @@ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -40770,6 +41369,12 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, "@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", @@ -41520,6 +42125,12 @@ } } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -41616,6 +42227,12 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -41758,6 +42375,35 @@ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@formatjs/ecma402-abstract": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.4.0.tgz", @@ -41831,6 +42477,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/schema-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@types/schema-utils/-/schema-utils-2.4.0.tgz", @@ -41895,6 +42547,31 @@ "requires": { "@babel/types": "^7.4", "is-valid-path": "^0.1.1" + }, + "dependencies": { + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } } }, "babel-polyfill": { @@ -41951,6 +42628,24 @@ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -42070,6 +42765,17 @@ "@babel/types": "^7.18.10" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@types/babel__core": { "version": "7.1.20", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", @@ -42083,6 +42789,15 @@ "@types/babel__traverse": "*" } }, + "@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "babel-plugin-jest-hoist": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", @@ -42703,6 +43418,12 @@ "anymatch": "^3.0.0", "source-map": "^0.6.0" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -42985,6 +43706,12 @@ "semver": "^7.3.5" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -43575,6 +44302,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -45308,6 +46041,12 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -46789,6 +47528,12 @@ "strip-ansi": "^6.0.1" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -46981,6 +47726,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -49985,6 +50736,13 @@ "boolbase": "^1.0.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, "svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -51665,6 +52423,24 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, "@babel/template": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", @@ -51694,6 +52470,17 @@ "globals": "^11.1.0" } }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", @@ -51986,6 +52773,15 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -51995,6 +52791,12 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, "@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", @@ -53786,6 +54588,12 @@ } } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -54123,6 +54931,11 @@ "dev": true, "requires": {} }, + "jest-resolve": { + "dev": true, + "optional": true, + "peer": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -54545,6 +55358,12 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -54586,6 +55405,12 @@ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -56202,6 +57027,12 @@ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -56724,6 +57555,17 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -57195,6 +58037,12 @@ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -57640,12 +58488,6 @@ "sort-keys": "^1.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-loader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", @@ -58132,6 +58974,12 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -58714,6 +59562,12 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -59008,6 +59862,13 @@ "dev": true, "peer": true }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true, + "peer": true + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -59276,6 +60137,13 @@ "ajv-keywords": "^3.5.2" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -59698,6 +60566,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", diff --git a/package.json b/package.json index fc5f9b095..7b99ac4ab 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "devDependencies": { "@edx/frontend-build": "^11.0.2", "@edx/frontend-platform": "2.4.0", - "@edx/paragon": "^20.27.0", + "@edx/paragon": "^20.21.3", "@testing-library/dom": "^8.13.0", - "@testing-library/react": "^12.1.1", + "@testing-library/react": "12.1.1", "@testing-library/user-event": "^13.5.0", "codecov": "3.8.3", "enzyme": "3.11.0", @@ -58,7 +58,6 @@ }, "dependencies": { "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-xml": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@reduxjs/toolkit": "^1.8.1", diff --git a/src/editors/Editor.jsx b/src/editors/Editor.jsx index 6668e5eb3..d760c72de 100644 --- a/src/editors/Editor.jsx +++ b/src/editors/Editor.jsx @@ -30,7 +30,7 @@ export const Editor = ({ const EditorComponent = supportedEditors[blockType]; return ( -
+
TextEditor) 1`] = `
- - - - } - footerAction={null} - isOpen={false} - size="md" - title="Exit the editor?" - > - - +
@@ -56,22 +23,30 @@ exports[`EditorContainer component render snapshot: initialized. enable save and >
- -

- My test content -

-
+

+ My test content +

- - - - } - footerAction={null} - isOpen={false} - size="md" - title="Exit the editor?" - > - - +
@@ -141,18 +83,27 @@ exports[`EditorContainer component render snapshot: not initialized. disable sav >
- ( -
+
{saveFailed && ( diff --git a/src/editors/containers/EditorContainer/hooks.js b/src/editors/containers/EditorContainer/hooks.js index aa5466560..7bb918f77 100644 --- a/src/editors/containers/EditorContainer/hooks.js +++ b/src/editors/containers/EditorContainer/hooks.js @@ -1,12 +1,9 @@ import { useSelector } from 'react-redux'; -import { useState } from 'react'; import { RequestKeys } from '../../data/constants/requests'; import { selectors } from '../../data/redux'; import * as appHooks from '../../hooks'; -import * as module from './hooks'; import analyticsEvt from '../../data/constants/analyticsEvt'; -import { StrictDict } from '../../utils'; export const { navigateCallback, @@ -14,10 +11,6 @@ export const { saveBlock, } = appHooks; -export const state = StrictDict({ - isCancelConfirmModalOpen: (val) => useState(val), -}); - export const handleSaveClicked = ({ dispatch, getContent, validateEntry }) => { const destination = useSelector(selectors.app.returnUrl); const analytics = useSelector(selectors.app.analytics); @@ -30,16 +23,7 @@ export const handleSaveClicked = ({ dispatch, getContent, validateEntry }) => { validateEntry, }); }; -export const cancelConfirmModalToggle = () => { - const [isCancelConfirmOpen, setIsOpen] = module.state.isCancelConfirmModalOpen(false); - return { - isCancelConfirmOpen, - openCancelConfirmModal: () => setIsOpen(true), - closeCancelConfirmModal: () => setIsOpen(false), - }; -}; - -export const handleCancel = ({ onClose }) => { +export const handleCancelClicked = ({ onClose }) => { if (onClose) { return onClose; } @@ -50,6 +34,6 @@ export const handleCancel = ({ onClose }) => { }); }; export const isInitialized = () => useSelector(selectors.app.isInitialized); -export const saveFailed = () => useSelector((rootState) => ( - selectors.requests.isFailed(rootState, { requestKey: RequestKeys.saveBlock }) +export const saveFailed = () => useSelector((state) => ( + selectors.requests.isFailed(state, { requestKey: RequestKeys.saveBlock }) )); diff --git a/src/editors/containers/EditorContainer/hooks.test.jsx b/src/editors/containers/EditorContainer/hooks.test.jsx index 01b9412a7..098302fba 100644 --- a/src/editors/containers/EditorContainer/hooks.test.jsx +++ b/src/editors/containers/EditorContainer/hooks.test.jsx @@ -1,5 +1,4 @@ import * as reactRedux from 'react-redux'; -import { MockUseState } from '../../../testUtils'; import { RequestKeys } from '../../data/constants/requests'; import { selectors } from '../../data/redux'; @@ -8,8 +7,6 @@ import * as appHooks from '../../hooks'; import * as hooks from './hooks'; import analyticsEvt from '../../data/constants/analyticsEvt'; -const hookState = new MockUseState(hooks); - jest.mock('../../data/redux', () => ({ selectors: { app: { @@ -70,46 +67,9 @@ describe('EditorContainer hooks', () => { }); }); }); - - describe('cancelConfirmModalToggle', () => { - const hookKey = hookState.keys.isCancelConfirmModalOpen; - beforeEach(() => { - jest.clearAllMocks(); - }); - describe('state hook', () => { - hookState.testGetter(hookKey); - }); - describe('using state', () => { - beforeEach(() => { - hookState.mock(); - }); - afterEach(() => { - hookState.restore(); - }); - - describe('cancelConfirmModalToggle', () => { - let hook; - beforeEach(() => { - hook = hooks.cancelConfirmModalToggle(); - }); - test('isCancelConfirmOpen: state value', () => { - expect(hook.isCancelConfirmOpen).toEqual(hookState.stateVals[hookKey]); - }); - test('openCancelConfirmModal: calls setter with true', () => { - hook.openCancelConfirmModal(); - expect(hookState.setState[hookKey]).toHaveBeenCalledWith(true); - }); - test('closeCancelConfirmModal: calls setter with false', () => { - hook.closeCancelConfirmModal(); - expect(hookState.setState[hookKey]).toHaveBeenCalledWith(false); - }); - }); - }); - }); - - describe('handleCancel', () => { + describe('handleCancelClicked', () => { it('calls navigateCallback to returnUrl if onClose is not passed', () => { - expect(hooks.handleCancel({})).toEqual( + expect(hooks.handleCancelClicked({})).toEqual( appHooks.navigateCallback({ destination: reactRedux.useSelector(selectors.app.returnUrl), analyticsEvent: analyticsEvt.editorCancelClick, @@ -119,7 +79,7 @@ describe('EditorContainer hooks', () => { }); it('calls onClose and not navigateCallback if onClose is passed', () => { const onClose = () => 'my close value'; - expect(hooks.handleCancel({ onClose })).toEqual(onClose); + expect(hooks.handleCancelClicked({ onClose })).toEqual(onClose); expect(appHooks.navigateCallback).not.toHaveBeenCalled(); }); }); diff --git a/src/editors/containers/EditorContainer/index.jsx b/src/editors/containers/EditorContainer/index.jsx index bd3658801..b8e5fc9f4 100644 --- a/src/editors/containers/EditorContainer/index.jsx +++ b/src/editors/containers/EditorContainer/index.jsx @@ -2,50 +2,24 @@ import React from 'react'; import { useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; -import { - Icon, ModalDialog, IconButton, Button, -} from '@edx/paragon'; +import { Icon, ModalDialog, IconButton } from '@edx/paragon'; import { Close } from '@edx/paragon/icons'; -import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n'; import EditorFooter from './components/EditorFooter'; import TitleHeader from './components/TitleHeader'; import * as hooks from './hooks'; -import BaseModal from '../TextEditor/components/BaseModal'; -import messages from './messages'; export const EditorContainer = ({ children, getContent, onClose, validateEntry, - // injected - intl, }) => { const dispatch = useDispatch(); const isInitialized = hooks.isInitialized(); - const { isCancelConfirmOpen, openCancelConfirmModal, closeCancelConfirmModal } = hooks.cancelConfirmModalToggle(); - const handleCancel = hooks.handleCancel({ onClose }); + const handleCancelClicked = hooks.handleCancelClicked({ onClose }); return ( -
- - - - )} - isOpen={isCancelConfirmOpen} - close={closeCancelConfirmModal} - title={intl.formatMessage(messages.cancelConfirmTitle)} - > - - +
- - {isInitialized && children} - + {isInitialized && children} ({ isInitialized: jest.fn().mockReturnValue(true), - handleCancel: (args) => ({ handleCancel: args }), + handleCancelClicked: (args) => ({ handleCancelClicked: args }), handleSaveClicked: (args) => ({ handleSaveClicked: args }), saveFailed: jest.fn().mockName('hooks.saveFailed'), - cancelConfirmModalToggle: jest.fn(() => ({ - isCancelConfirmOpen: false, - openCancelConfirmModal: jest.fn().mockName('openCancelConfirmModal'), - closeCancelConfirmModal: jest.fn().mockName('closeCancelConfirmModal'), - })), })); let el; @@ -46,13 +39,23 @@ describe('EditorContainer component', () => { el = shallow({testContent}); }); + test('close behavior is linked to modal onClose', () => { + const expected = hooks.handleCancelClicked({ onClose: props.onClose }); + expect(el.find(IconButton) + .props().onClick).toEqual(expected); + }); + test('close behavior is linked to footer onCancel', () => { + const expected = hooks.handleCancelClicked({ onClose: props.onClose }); + expect(el.children().at(2) + .props().onCancel).toEqual(expected); + }); test('save behavior is linked to footer onSave', () => { const expected = hooks.handleSaveClicked({ dispatch: useDispatch(), getContent: props.getContent, validateEntry: props.validateEntry, }); - expect(el.children().at(3) + expect(el.children().at(2) .props().onSave).toEqual(expected); }); }); diff --git a/src/editors/containers/EditorContainer/messages.js b/src/editors/containers/EditorContainer/messages.js deleted file mode 100644 index c9eb65dce..000000000 --- a/src/editors/containers/EditorContainer/messages.js +++ /dev/null @@ -1,19 +0,0 @@ -export const messages = { - cancelConfirmTitle: { - id: 'authoring.editorContainer.cancelConfirm.title', - defaultMessage: 'Exit the editor?', - description: 'Label for modal confirming cancellation', - }, - cancelConfirmDescription: { - id: 'authoring.editorContainer.cancelConfirm.description', - defaultMessage: 'Are you sure you want to exit the editor? Any unsaved changes will be lost.', - description: 'Description text for modal confirming cancellation', - }, - okButtonLabel: { - id: 'authoring.editorContainer.okButton.label', - defaultMessage: 'OK', - description: 'Label for OK button', - }, -}; - -export default messages; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.jsx index 73f07b3ea..a8e867ed7 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.jsx @@ -2,21 +2,57 @@ import React, { memo } from 'react'; import { connect, useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; import { - Collapsible, - Icon, - IconButton, - Form, + Col, Collapsible, Icon, IconButton, Form, Row, } from '@edx/paragon'; -import { FeedbackOutline, DeleteOutline } from '@edx/paragon/icons'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { AddComment, Delete } from '@edx/paragon/icons'; +import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import messages from './messages'; import { selectors } from '../../../../../data/redux'; import { answerOptionProps } from '../../../../../data/services/cms/types'; -import Checker from './components/Checker'; -import { FeedbackBox } from './components/Feedback'; +import { ProblemTypeKeys } from '../../../../../data/constants/problem'; import * as hooks from './hooks'; +const Checker = ({ + hasSingleAnswer, answer, setAnswer, +}) => { + let CheckerType = Form.Checkbox; + if (hasSingleAnswer) { + CheckerType = Form.Radio; + } + return ( + setAnswer({ correct: e.target.checked })} + checked={answer.correct} + > + {answer.id} + + ); +}; + +const FeedbackControl = ({ + feedback, onChange, labelMessage, labelMessageBoldUnderline, key, answer, intl, +}) => ( + + + , + }} + /> + + + +); + export const AnswerOption = ({ answer, hasSingleAnswer, @@ -30,55 +66,91 @@ export const AnswerOption = ({ const setAnswer = hooks.setAnswer({ answer, hasSingleAnswer, dispatch }); const { isFeedbackVisible, toggleFeedback } = hooks.prepareFeedback(answer); + const displayFeedbackControl = (answerObject) => { + if (problemType !== ProblemTypeKeys.MULTISELECT) { + return FeedbackControl({ + key: `feedback-${answerObject.id}`, + feedback: answerObject.feedback, + onChange: (e) => setAnswer({ feedback: e.target.value }), + labelMessage: messages.selectedFeedbackLabel, + labelMessageBoldUnderline: messages.selectedFeedbackLabelBoldUnderlineText, + answer: answerObject, + intl, + }); + } + return [ + FeedbackControl({ + key: `selectedfeedback-${answerObject.id}`, + feedback: answerObject.selectedFeedback, + onChange: (e) => setAnswer({ selectedFeedback: e.target.value }), + labelMessage: messages.selectedFeedbackLabel, + labelMessageBoldUnderline: messages.selectedFeedbackLabelBoldUnderlineText, + answer: answerObject, + intl, + }), + FeedbackControl({ + key: `unselectedfeedback-${answerObject.id}`, + feedback: answerObject.unselectedFeedback, + onChange: (e) => setAnswer({ unselectedFeedback: e.target.value }), + labelMessage: messages.unSelectedFeedbackLabel, + labelMessageBoldUnderline: messages.unSelectedFeedbackLabelBoldUnderlineText, + answer: answerObject, + intl, + }), + ]; + }; + return ( -
- -
-
- { setAnswer({ title: e.target.value }); }} - placeholder={intl.formatMessage(messages.answerTextboxPlaceholder)} - /> - - + + + - -
-
- + + + + { setAnswer({ title: e.target.value }); }} + placeholder={intl.formatMessage(messages.answerTextboxPlaceholder)} + /> + + +
+ {displayFeedbackControl(answer)} +
+
+ + + + + + -
- -
+ + +
); }; @@ -92,6 +164,22 @@ AnswerOption.propTypes = { problemType: PropTypes.string.isRequired, }; +FeedbackControl.propTypes = { + feedback: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + labelMessage: PropTypes.string.isRequired, + labelMessageBoldUnderline: PropTypes.string.isRequired, + key: PropTypes.string.isRequired, + answer: answerOptionProps.isRequired, + intl: intlShape.isRequired, +}; + +Checker.propTypes = { + hasSingleAnswer: PropTypes.bool.isRequired, + answer: answerOptionProps.isRequired, + setAnswer: PropTypes.func.isRequired, +}; + export const mapStateToProps = (state) => ({ problemType: selectors.problem.problemType(state), }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.test.jsx index 439c597a3..5e40a528c 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.test.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswerOption.test.jsx @@ -1,23 +1,14 @@ import React from 'react'; import { shallow } from 'enzyme'; import { formatMessage } from '../../../../../../testUtils'; -import { selectors } from '../../../../../data/redux'; -import { AnswerOption, mapStateToProps } from './AnswerOption'; - -jest.mock('../../../../../data/redux', () => ({ - selectors: { - problem: { - problemType: jest.fn(state => ({ problemType: state })), - }, - }, -})); +import { AnswerOption } from './AnswerOption'; describe('AnswerOption', () => { const answerWithOnlyFeedback = { id: 'A', title: 'Answer 1', correct: true, - selectedFeedback: 'some feedback', + feedback: 'some feedback', }; const answerWithSelectedUnselectedFeedback = { id: 'A', @@ -32,23 +23,15 @@ describe('AnswerOption', () => { answer: answerWithOnlyFeedback, // inject intl: { formatMessage }, - // redux - problemType: 'multiplechoiceresponse', + deleteAnswer: jest.fn(), + updateAnswer: jest.fn(), }; describe('render', () => { test('snapshot: renders correct option with feedback', () => { expect(shallow()).toMatchSnapshot(); }); test('snapshot: renders correct option with selected unselected feedback', () => { - expect(shallow()).toMatchSnapshot(); - }); - }); - describe('mapStateToProps', () => { - const testState = { A: 'pple', B: 'anana', C: 'ucumber' }; - test('problemType from problem.problemType', () => { - expect( - mapStateToProps(testState).problemType, - ).toEqual(selectors.problem.problemType(testState)); + expect(shallow()).toMatchSnapshot(); }); }); }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswersContainer.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswersContainer.jsx index 42c079a4f..d85b9ea2e 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswersContainer.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/AnswersContainer.jsx @@ -6,7 +6,7 @@ import { Add } from '@edx/paragon/icons'; import { FormattedMessage } from '@edx/frontend-platform/i18n'; import messages from './messages'; -import { useAnswerContainer, isSingleAnswerProblem } from './hooks'; +import { initializeAnswerContainer } from '../../../hooks'; import { actions, selectors } from '../../../../../data/redux'; import { answerOptionProps } from '../../../../../data/services/cms/types'; import AnswerOption from './AnswerOption'; @@ -16,14 +16,11 @@ export const AnswersContainer = ({ // Redux answers, addAnswer, - updateField, }) => { - const hasSingleAnswer = isSingleAnswerProblem(problemType); - - useAnswerContainer({ answers, problemType, updateField }); + const { hasSingleAnswer } = initializeAnswerContainer(problemType); return ( -
+
{answers.map((answer) => ( ))} -
-`; - -exports[`AnswersContainer render snapshot: renders correctly with answers 1`] = ` -
- - - -
-`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/__snapshots__/index.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/__snapshots__/index.test.jsx.snap deleted file mode 100644 index a9692438d..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/__snapshots__/index.test.jsx.snap +++ /dev/null @@ -1,23 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Checker component with multiple answers 1`] = ` - - A - -`; - -exports[`Checker component with single answer 1`] = ` - - A - -`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.jsx deleted file mode 100644 index 2ac2a4d7a..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { Form } from '@edx/paragon'; - -const Checker = ({ - hasSingleAnswer, answer, setAnswer, -}) => { - let CheckerType = Form.Checkbox; - if (hasSingleAnswer) { - CheckerType = Form.Radio; - } - return ( - setAnswer({ correct: e.target.checked })} - checked={answer.correct} - > - {answer.id} - - ); -}; -Checker.propTypes = { - hasSingleAnswer: PropTypes.bool.isRequired, - answer: PropTypes.shape({ - correct: PropTypes.bool, - id: PropTypes.number, - }).isRequired, - setAnswer: PropTypes.func.isRequired, -}; - -export default Checker; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.test.jsx deleted file mode 100644 index 19998a536..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Checker/index.test.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import { shallow } from 'enzyme'; -import Checker from '.'; - -const props = { - hasSingleAnswer: true, - answer: { - id: 'A', - title: 'Answer 1', - correct: true, - selectedFeedback: 'some feedback', - }, - setAnswer: jest.fn(), -}; -describe('Checker component', () => { - test('with single answer', () => { - expect(shallow()).toMatchSnapshot(); - }); - - test('with multiple answers', () => { - expect(shallow()).toMatchSnapshot(); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.jsx deleted file mode 100644 index 347f4cd07..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; - -import { answerOptionProps } from '../../../../../../../data/services/cms/types'; -import FeedbackControl from './FeedbackControl'; -import { messages } from './messages'; - -export const FeedbackBox = ({ - answer, setAnswer, intl, -}) => { - const props = { - onChange: (e) => setAnswer({ selectedFeedback: e.target.value }), - answer, - intl, - }; - - return ( -
- - -
- ); -}; -FeedbackBox.propTypes = { - answer: answerOptionProps.isRequired, - setAnswer: PropTypes.func.isRequired, - intl: intlShape.isRequired, -}; - -export default injectIntl(FeedbackBox); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.test.jsx deleted file mode 100644 index 117c48255..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackBox.test.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import { shallow } from 'enzyme'; -import { FeedbackBox } from './FeedbackBox'; - -const answerWithFeedback = { - id: 'A', - title: 'Answer 1', - correct: true, - selectedFeedback: 'some feedback', - unselectedFeedback: 'unselectedFeedback', -}; - -const props = { - answer: answerWithFeedback, - intl: {}, - setAnswer: jest.fn(), -}; - -describe('FeedbackBox component', () => { - test('renders', () => { - expect(shallow()).toMatchSnapshot(); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.jsx deleted file mode 100644 index 12ff8091d..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { FormattedMessage, intlShape } from '@edx/frontend-platform/i18n'; -import { Form } from '@edx/paragon'; - -import { answerOptionProps } from '../../../../../../../data/services/cms/types'; -import messages from './messages'; - -const FeedbackControl = ({ - feedback, onChange, labelMessage, labelMessageBoldUnderline, answer, intl, -}) => ( - - - , - }} - /> - - - -); -FeedbackControl.propTypes = { - feedback: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, - labelMessage: PropTypes.string.isRequired, - labelMessageBoldUnderline: PropTypes.string.isRequired, - answer: answerOptionProps.isRequired, - intl: intlShape.isRequired, -}; - -export default FeedbackControl; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.test.jsx deleted file mode 100644 index 93d6499d4..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/FeedbackControl.test.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { shallow } from 'enzyme'; -import FeedbackControl from './FeedbackControl'; - -const answerWithFeedback = { - id: 'A', - title: 'Answer 1', - correct: true, - selectedFeedback: 'some feedback', - unselectedFeedback: 'unselectedFeedback', -}; - -const props = { - answer: answerWithFeedback, - intl: { formatMessage: jest.fn() }, - setAnswer: jest.fn(), - feedback: 'feedback', - onChange: jest.fn(), - labelMessage: 'msg', - labelMessageBoldUnderline: 'msg', -}; - -describe('FeedbackControl component', () => { - test('renders', () => { - expect(shallow()).toMatchSnapshot(); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackBox.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackBox.test.jsx.snap deleted file mode 100644 index 4c9113846..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackBox.test.jsx.snap +++ /dev/null @@ -1,66 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FeedbackBox component renders 1`] = ` -
- - -
-`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackControl.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackControl.test.jsx.snap deleted file mode 100644 index 40a7fde43..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/__snapshots__/FeedbackControl.test.jsx.snap +++ /dev/null @@ -1,33 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FeedbackControl component renders 1`] = ` - - - - - - - , - } - } - /> - - - -`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/index.jsx deleted file mode 100644 index bce02835a..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/index.jsx +++ /dev/null @@ -1,2 +0,0 @@ -export { default as FeedbackBox } from './FeedbackBox'; -export { default as FeedbackControl } from './FeedbackControl'; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/messages.js b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/messages.js deleted file mode 100644 index a580c9c7e..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/components/Feedback/messages.js +++ /dev/null @@ -1,34 +0,0 @@ -export const messages = { - feedbackPlaceholder: { - id: 'authoring.answerwidget.feedback.placeholder', - defaultMessage: 'Feedback message', - description: 'Placeholder text for feedback text', - }, - feedbackToggleIconAltText: { - id: 'authoring.answerwidget.feedback.icon.alt', - defaultMessage: 'Toggle feedback', - description: 'Alt text for feedback toggle icon', - }, - selectedFeedbackLabel: { - id: 'authoring.answerwidget.feedback.selected.label', - defaultMessage: 'Show following feedback when {answerId} {boldunderline}:', - description: 'Label text for feedback if option is selected', - }, - selectedFeedbackLabelBoldUnderlineText: { - id: 'authoring.answerwidget.feedback.selected.label.boldunderline', - defaultMessage: 'is selected', - description: 'Bold & underlined text for feedback if option is selected', - }, - unSelectedFeedbackLabel: { - id: 'authoring.answerwidget.feedback.unselected.label', - defaultMessage: 'Show following feedback when {answerId} {boldunderline}:', - description: 'Label text for feedback if option is not selected', - }, - unSelectedFeedbackLabelBoldUnderlineText: { - id: 'authoring.answerwidget.feedback.unselected.label.boldunderline', - defaultMessage: 'is not selected', - description: 'Bold & underlined text for feedback if option is not selected', - }, -}; - -export default messages; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hook.test.js b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hook.test.js index ff5d51abe..892e21af4 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hook.test.js +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hook.test.js @@ -1,6 +1,5 @@ import { useEffect } from 'react'; import { MockUseState } from '../../../../../../testUtils'; -import { ProblemTypeKeys } from '../../../../../data/constants/problem'; import * as module from './hooks'; jest.mock('react', () => { @@ -53,15 +52,4 @@ describe('Answer Options Hooks', () => { expect(state.setState[key]).toHaveBeenCalledWith(true); }); }); - describe('isSingleAnswerProblem()', () => { - test('singleSelect', () => { - expect(module.isSingleAnswerProblem(ProblemTypeKeys.SINGLESELECT)).toBe(true); - }); - test('multiSelect', () => { - expect(module.isSingleAnswerProblem(ProblemTypeKeys.MULTISELECT)).toBe(false); - }); - test('dropdown', () => { - expect(module.isSingleAnswerProblem(ProblemTypeKeys.DROPDOWN)).toBe(true); - }); - }); }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hooks.js b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hooks.js index 74f141637..5559b5c70 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hooks.js +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/hooks.js @@ -2,7 +2,6 @@ import { useState, useEffect } from 'react'; import { StrictDict } from '../../../../../utils'; import * as module from './hooks'; import { actions } from '../../../../../data/redux'; -import { ProblemTypeKeys } from '../../../../../data/constants/problem'; export const state = StrictDict({ isFeedbackVisible: (val) => useState(val), @@ -38,22 +37,6 @@ export const prepareFeedback = (answer) => { }; }; -export const isSingleAnswerProblem = (problemType) => ( - problemType === ProblemTypeKeys.DROPDOWN || problemType === ProblemTypeKeys.SINGLESELECT -); - -export const useAnswerContainer = ({ answers, updateField }) => { - useEffect(() => { - let answerCount = 0; - answers.forEach(answer => { - if (answer.correct) { - answerCount += 1; - } - }); - updateField({ correctAnswerCount: answerCount }); - }, []); -}; - export default { - state, removeAnswer, setAnswer, prepareFeedback, isSingleAnswerProblem, useAnswerContainer, + state, removeAnswer, setAnswer, prepareFeedback, }; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.jsx index e9c9bd928..7e68f2cc9 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.jsx @@ -15,11 +15,11 @@ const AnswerWidget = ({ const problemStaticData = ProblemTypes[problemType]; return (
-
-
+
+
-
+
{problemStaticData.description}
diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.scss b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.scss index 59ad4d855..622a591a9 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.scss +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/AnswerWidget/index.scss @@ -1,32 +1,11 @@ -.answer-option { - .answer-option-flex-item-1 { - flex-basis: 8.33%; - } - - .answer-option-flex-item-2 { - flex-basis: 83.34%; - } - - .answer-option-flex-item-3 { - flex-basis: 8.33%; - } - - .answer-option-textarea { - textarea { - border: none; - resize: none; - - &:active, &:hover, &:focus, &:focus-visible { - border: none; - border-right: none; - border-left: none; - border-radius: 0; - box-shadow: none; - } - - &:focus, &:hover { - border-bottom: 1px solid #000; - } +.problem-answer { + padding: 12px; + color: #00262B; + .problem-answer-title { + font-weight: bold; + } + + .problem-answer-description { + font-size: 0.9rem; } - } } diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.jsx index 1e31b2f99..8eceb0277 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.jsx @@ -6,7 +6,6 @@ import { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n'; import * as hooks from '../../../hooks'; import { selectors, actions } from '../../../../../data/redux'; import { messages } from './messages'; -import './index.scss'; // This widget should be connected, grab all questions from store, update them as needed. export const QuestionWidget = ({ @@ -16,11 +15,12 @@ export const QuestionWidget = ({ const { editorRef, refReady, setEditorRef } = hooks.prepareEditorRef(); if (!refReady) { return null; } return ( -
-
- -
- +
+

+ +

+ + /> +
); }; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.scss b/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.scss deleted file mode 100644 index 9292bef5f..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/QuestionWidget/index.scss +++ /dev/null @@ -1,28 +0,0 @@ -.question-widget { - .tox-tinymce { - border-radius: 0.375rem; - } - - .tox { - .tox-toolbar__primary { - background: none; - } - } - - .tox-statusbar { - border-top: none; - } - - .tox-toolbar__group:not(:last-of-type) { - // TODO: Find a way to override the border without !important - border-right: none !important; - - &:after { - content: ''; - position: relative; - left: 5px; - border: 1px solid #eae6e5; - height: 24px; - } - } -} diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/SettingsOption.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/SettingsOption.jsx index d3cc22bfa..f74e04217 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/SettingsOption.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/SettingsOption.jsx @@ -12,7 +12,7 @@ export const SettingsOption = ({ const { isCardCollapsed, toggleCardCollapse } = showFullCard(); return ( - + + diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/__snapshots__/index.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/__snapshots__/index.test.jsx.snap index 432523260..346860fd2 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/__snapshots__/index.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/__snapshots__/index.test.jsx.snap @@ -2,182 +2,172 @@ exports[`SettingsWidget snapshot snapshot: renders Settings widget page 1`] = `
-
- -
- - - - - - - - - - - - - - +

+ +

+ + + + - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - -
-`; - -exports[`SettingsWidget snapshot snapshot: renders Settings widget page advanced settings visible 1`] = ` -
-
- -
- - - - - - - - - - - - - + + + + - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + +
+
+`; + +exports[`SettingsWidget snapshot snapshot: renders Settings widget page advanced settings visible 1`] = ` +
+
+

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.js b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.js index 47c88e6e7..e77ab6196 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.js +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.js @@ -3,7 +3,7 @@ import { useState, useEffect } from 'react'; import _ from 'lodash-es'; import * as module from './hooks'; import messages from './messages'; -import { ProblemTypeKeys, ShowAnswerTypesKeys } from '../../../../../data/constants/problem'; +import { ShowAnswerTypesKeys } from '../../../../../data/constants/problem'; export const state = { showAdvanced: (val) => useState(val), @@ -113,14 +113,14 @@ export const resetCardHooks = (updateSettings) => { export const scoringCardHooks = (scoring, updateSettings) => { const handleMaxAttemptChange = (event) => { - let unlimitedAttempts = false; + let unlimitedAttempts = true; let attemptNumber = parseInt(event.target.value); if (_.isNaN(attemptNumber)) { - attemptNumber = null; - unlimitedAttempts = true; - } else if (attemptNumber < 0) { attemptNumber = 0; } + if (attemptNumber > 0) { + unlimitedAttempts = false; + } updateSettings({ scoring: { ...scoring, attempts: { number: attemptNumber, unlimited: unlimitedAttempts } } }); }; @@ -182,23 +182,11 @@ export const timerCardHooks = (updateSettings) => ({ }, }); -export const typeRowHooks = ({ - answers, - correctAnswerCount, - typeKey, - updateField, - updateAnswer, -}) => { +export const typeRowHooks = (typeKey, updateField) => { const onClick = () => { - if (typeKey === ProblemTypeKeys.SINGLESELECT || typeKey === ProblemTypeKeys.DROPDOWN) { - if (correctAnswerCount > 1) { - answers.forEach(answer => { - updateAnswer({ ...answer, correct: false }); - }); - } - } updateField({ problemType: typeKey }); }; + return { onClick, }; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.test.js b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.test.js index 556004402..9d9a41b9d 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.test.js +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/hooks.test.js @@ -18,7 +18,6 @@ jest.mock('../../../../../data/redux', () => ({ problem: { updateSettings: (args) => ({ updateSettings: args }), updateField: (args) => ({ updateField: args }), - updateAnswer: (args) => ({ updateAnswer: args }), }, }, })); @@ -178,31 +177,7 @@ describe('Problem settings hooks', () => { const value = 0; output.handleMaxAttemptChange({ target: { value } }); expect(updateSettings) - .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: value, unlimited: false } } }); - }); - test('test handleMaxAttemptChange set attempts to null value', () => { - const value = null; - output.handleMaxAttemptChange({ target: { value } }); - expect(updateSettings) - .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: null, unlimited: true } } }); - }); - test('test handleMaxAttemptChange set attempts to empty string', () => { - const value = ''; - output.handleMaxAttemptChange({ target: { value } }); - expect(updateSettings) - .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: null, unlimited: true } } }); - }); - test('test handleMaxAttemptChange set attempts to non-numeric value', () => { - const value = 'abc'; - output.handleMaxAttemptChange({ target: { value } }); - expect(updateSettings) - .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: null, unlimited: true } } }); - }); - test('test handleMaxAttemptChange set attempts to negative value', () => { - const value = -1; - output.handleMaxAttemptChange({ target: { value } }); - expect(updateSettings) - .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: 0, unlimited: false } } }); + .toHaveBeenCalledWith({ scoring: { ...scoring, attempts: { number: value, unlimited: true } } }); }); test('test handleWeightChange', () => { const value = 2; @@ -242,27 +217,10 @@ describe('Problem settings hooks', () => { describe('Type row hooks', () => { test('test onClick', () => { - const typekey = 'multiplechoiceresponse'; + const typekey = 'TEXTINPUT'; const updateField = jest.fn(); - const updateAnswer = jest.fn(); - const answers = [{ - correct: true, - id: 'a', - }, - { - correct: true, - id: 'b', - }]; - output = hooks.typeRowHooks({ - answers, - correctAnswerCount: 2, - typeKey: typekey, - updateField, - updateAnswer, - }); + output = hooks.typeRowHooks(typekey, updateField); output.onClick(); - expect(updateAnswer).toHaveBeenNthCalledWith(1, { ...answers[0], correct: false }); - expect(updateAnswer).toHaveBeenNthCalledWith(2, { ...answers[1], correct: false }); expect(updateField).toHaveBeenCalledWith({ problemType: typekey }); }); }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/index.jsx index b8f0aa374..90e5f904a 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/index.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/index.jsx @@ -13,7 +13,6 @@ import ResetCard from './settingsComponents/ResetCard'; import MatlabCard from './settingsComponents/MatlabCard'; import TimerCard from './settingsComponents/TimerCard'; import TypeCard from './settingsComponents/TypeCard'; -import SwitchToAdvancedEditorCard from './settingsComponents/SwitchToAdvancedEditorCard'; import messages from './messages'; import { showAdvancedSettingsCards } from './hooks'; @@ -23,90 +22,72 @@ import './index.scss'; export const SettingsWidget = ({ problemType, // redux - answers, - correctAnswerCount, settings, updateSettings, updateField, - updateAnswer, }) => { const { isAdvancedCardsVisible, showAdvancedCards } = showAdvancedSettingsCards(); return (
-
- -
- - - - - - - - - - - - +
+

+ +

+ + + + + + + + + + + + - - + + + + + + + + + - + + + + + + + + + + + + - + + + +
- - - - - - - - - - - - - - - - - - - - -
-
); }; SettingsWidget.propTypes = { - answers: PropTypes.arrayOf(PropTypes.shape({ - correct: PropTypes.bool, - id: PropTypes.string, - selectedFeedback: PropTypes.string, - title: PropTypes.string, - unselectedFeedback: PropTypes.string, - })).isRequired, - correctAnswerCount: PropTypes.number.isRequired, problemType: PropTypes.string.isRequired, - updateAnswer: PropTypes.func.isRequired, updateField: PropTypes.func.isRequired, updateSettings: PropTypes.func.isRequired, // eslint-disable-next-line @@ -115,14 +96,11 @@ SettingsWidget.propTypes = { const mapStateToProps = (state) => ({ settings: selectors.problem.settings(state), - answers: selectors.problem.answers(state), - correctAnswerCount: selectors.problem.correctAnswerCount(state), }); export const mapDispatchToProps = { updateSettings: actions.problem.updateSettings, updateField: actions.problem.updateField, - updateAnswer: actions.problem.updateAnswer, }; export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(SettingsWidget)); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/messages.js b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/messages.js index ce597208a..4539decc3 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/messages.js +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/messages.js @@ -36,7 +36,7 @@ export const messages = { }, noHintSummary: { id: 'authoring.problemeditor.settings.hint.noHintSummary', - defaultMessage: 'None', + defaultMessage: 'No Hints', description: 'Summary text for no hints', }, hintSummary: { @@ -104,35 +104,10 @@ export const messages = { defaultMessage: 'Points', description: 'Scoring weight input label', }, - unlimitedAttemptsSummary: { - id: 'authoring.problemeditor.settings.scoring.unlimited', - defaultMessage: 'Unlimited attempts', - description: 'Summary text for unlimited attempts', - }, - attemptsSummary: { - id: 'authoring.problemeditor.settings.scoring.attempts', - defaultMessage: '{attempts, plural, =1 {# attempt} other {# attempts}}', - description: 'Summary text for number of attempts', - }, - weightSummary: { - id: 'authoring.problemeditor.settings.scoring.weight', - defaultMessage: '{weight, plural, =0 {Ungraded} other {# points}}', - description: 'Summary text for scoring weight', - }, - scoringSettingsLabel: { - id: 'authoring.problemeditor.settings.scoring.label', - defaultMessage: 'Specify point weight and the number of answer attempts', - description: 'Descriptive text for scoring settings', - }, - attemptsHint: { - id: 'authoring.problemeditor.settings.scoring.attempts.hint', - defaultMessage: 'If a value is not set, unlimited attempts are allowed', - description: 'Summary text for scoring weight', - }, - weightHint: { - id: 'authoring.problemeditor.settings.scoring.weight.hint', - defaultMessage: 'If a value is not set, the problem is worth one point', - description: 'Summary text for scoring weight', + scoringSummary: { + id: 'authoring.problemeditor.settings.scoring.summary', + defaultMessage: '{attempts, plural, =0 {Unlimited} other {#}} attempts - {weight, plural, =0 {Ungraded} other {# points}}', + description: 'Summary text for scoring settings', }, showAnswerSettingsTitle: { id: 'authoring.problemeditor.settings.showAnswer.title', @@ -174,26 +149,6 @@ export const messages = { defaultMessage: 'Type', description: 'Type settings card title', }, - SwitchButtonLabel: { - id: 'authoring.problemeditor.settings.switchtoadvancededitor.label', - defaultMessage: 'Switch To Advanced Editor', - description: 'button to switch to the advanced mode of the editor.', - }, - ConfirmSwitchMessage: { - id: 'authoring.problemeditor.settings.switchtoadvancededitor.message', - defaultMessage: 'If you use the advanced editor, this problem will be converted to OLX and you will not be able to return to the simple editor.', - description: 'message to confirm that a user wants to use the advanced editor', - }, - ConfirmSwitchMessageTitle: { - id: 'authoring.problemeditor.settings.switchtoadvancededitor.message', - defaultMessage: 'Convert to OLX?', - description: 'message to confirm that a user wants to use the advanced editor', - }, - ConfirmSwitchButtonLabel: { - id: 'authoring.problemeditor.settings.switchtoadvancededitor.message', - defaultMessage: 'Switch To Advanced Editor', - description: 'message to confirm that a user wants to use the advanced editor', - }, }; export default messages; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/HintsCard.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/HintsCard.jsx index 088fd3eff..ef2fff7e0 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/HintsCard.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/HintsCard.jsx @@ -29,7 +29,7 @@ export const HintsCard = ({ /> ))}
- +
@@ -54,7 +49,7 @@ export const ShowAnswerCard = ({ ))} - {showAttempts + { showAttempts && ( ({ - studioEndpointUrl: selectors.app.studioEndpointUrl(state), - learningContextId: selectors.app.learningContextId(state), -}); - -export const mapDispatchToProps = {}; - -export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ShowAnswerCard)); +export default injectIntl(ShowAnswerCard); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.test.jsx index 63d2e2bfe..e727746e2 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.test.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/ShowAnswerCard.test.jsx @@ -1,23 +1,13 @@ import React from 'react'; import { shallow } from 'enzyme'; import { formatMessage } from '../../../../../../../testUtils'; -import { selectors } from '../../../../../../data/redux'; -import { ShowAnswerCard, mapStateToProps, mapDispatchToProps } from './ShowAnswerCard'; +import { ShowAnswerCard } from './ShowAnswerCard'; import { showAnswerCardHooks } from '../hooks'; jest.mock('../hooks', () => ({ showAnswerCardHooks: jest.fn(), })); -jest.mock('../../../../../../data/redux', () => ({ - selectors: { - app: { - studioEndpointUrl: jest.fn(state => ({ studioEndpointUrl: state })), - learningContextId: jest.fn(state => ({ learningContextId: state })), - }, - }, -})); - describe('ShowAnswerCard', () => { const showAnswer = { on: 'after_attempts', @@ -27,11 +17,7 @@ describe('ShowAnswerCard', () => { }; const props = { showAnswer, - // injected intl: { formatMessage }, - // redux - studioEndpointUrl: 'SoMEeNDpOinT', - learningContextId: 'sOMEcouRseId', }; const showAnswerCardHooksProps = { @@ -53,22 +39,4 @@ describe('ShowAnswerCard', () => { expect(shallow()).toMatchSnapshot(); }); }); - describe('mapStateToProps', () => { - const testState = { A: 'pple', B: 'anana', C: 'ucumber' }; - test('studioEndpointUrl from app.studioEndpointUrl', () => { - expect( - mapStateToProps(testState).studioEndpointUrl, - ).toEqual(selectors.app.studioEndpointUrl(testState)); - }); - test('learningContextId from app.learningContextId', () => { - expect( - mapStateToProps(testState).learningContextId, - ).toEqual(selectors.app.learningContextId(testState)); - }); - }); - describe('mapDispatchToProps', () => { - test('equal an empty object', () => { - expect(mapDispatchToProps).toEqual({}); - }); - }); }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.jsx deleted file mode 100644 index e68e10351..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n'; -import { Button, Card } from '@edx/paragon'; -import PropTypes from 'prop-types'; -import messages from '../messages'; -import { thunkActions } from '../../../../../../data/redux'; -import BaseModal from '../../../../../TextEditor/components/BaseModal'; - -export const SwitchToAdvancedEditorCard = ({ - switchToAdvancedEditor, -}) => { - const [isConfirmOpen, setConfirmOpen] = React.useState(false); - return ( - - { setConfirmOpen(false); }} - title={()} - confirmAction={( - - )} - size="md" - > - - - - - ); -}; - -SwitchToAdvancedEditorCard.propTypes = { - switchToAdvancedEditor: PropTypes.func.isRequired, -}; - -export const mapStateToProps = () => ({ -}); -export const mapDispatchToProps = { - switchToAdvancedEditor: thunkActions.problem.switchToAdvancedEditor, -}; - -export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(SwitchToAdvancedEditorCard)); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.test.jsx deleted file mode 100644 index 96d0b4a5c..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/SwitchToAdvancedEditorCard.test.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { SwitchToAdvancedEditorCard } from './SwitchToAdvancedEditorCard'; - -describe('SwitchToAdvancedEditorCard snapshot', () => { - const mockSwitchToAdvancedEditor = jest.fn().mockName('switchToAdvancedEditor'); - test('snapshot: SwitchToAdvancedEditorCard', () => { - expect( - shallow(), - ).toMatchSnapshot(); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.jsx index c73779a04..06a085db2 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.jsx @@ -7,17 +7,12 @@ import messages from '../messages'; import TypeRow from './TypeRow'; export const TypeCard = ({ - answers, - correctAnswerCount, problemType, updateField, - updateAnswer, // inject intl, }) => { - const problemTypeKeysArray = Object.values(ProblemTypeKeys).filter(key => key !== ProblemTypeKeys.ADVANCED); - - if (problemType === ProblemTypeKeys.ADVANCED) { return null; } + const problemTypeKeysArray = Object.values(ProblemTypeKeys); return ( {problemTypeKeysArray.map((typeKey, i) => ( ))} @@ -42,19 +34,9 @@ export const TypeCard = ({ }; TypeCard.propTypes = { - answers: PropTypes.arrayOf(PropTypes.shape({ - correct: PropTypes.bool, - id: PropTypes.string, - selectedFeedback: PropTypes.string, - title: PropTypes.string, - unselectedFeedback: PropTypes.string, - })).isRequired, - correctAnswerCount: PropTypes.number.isRequired, + intl: intlShape.isRequired, problemType: PropTypes.string.isRequired, updateField: PropTypes.func.isRequired, - updateAnswer: PropTypes.func.isRequired, - // injected - intl: intlShape.isRequired, }; export default injectIntl(TypeCard); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.test.jsx index d2a2f8518..1886661a5 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.test.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeCard.test.jsx @@ -6,12 +6,8 @@ import { ProblemTypeKeys } from '../../../../../../data/constants/problem'; describe('TypeCard', () => { const props = { - answers: [], - correctAnswerCount: 0, problemType: ProblemTypeKeys.TEXTINPUT, updateField: jest.fn().mockName('args.updateField'), - updateAnswer: jest.fn().mockName('args.updateAnswer'), - // injected intl: { formatMessage }, }; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.jsx index 811499d43..71810543c 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.jsx @@ -5,22 +5,13 @@ import { Check } from '@edx/paragon/icons'; import { typeRowHooks } from '../hooks'; export const TypeRow = ({ - answers, - correctAnswerCount, typeKey, label, selected, lastRow, updateField, - updateAnswer, }) => { - const { onClick } = typeRowHooks({ - answers, - correctAnswerCount, - typeKey, - updateField, - updateAnswer, - }); + const { onClick } = typeRowHooks(typeKey, updateField); return ( <> @@ -34,19 +25,10 @@ export const TypeRow = ({ }; TypeRow.propTypes = { - answers: PropTypes.arrayOf(PropTypes.shape({ - correct: PropTypes.bool, - id: PropTypes.string, - selectedFeedback: PropTypes.string, - title: PropTypes.string, - unselectedFeedback: PropTypes.string, - })).isRequired, - correctAnswerCount: PropTypes.number.isRequired, typeKey: PropTypes.string.isRequired, label: PropTypes.string.isRequired, selected: PropTypes.bool.isRequired, lastRow: PropTypes.bool.isRequired, - updateAnswer: PropTypes.func.isRequired, updateField: PropTypes.func.isRequired, }; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.test.jsx index 2065e57c0..72c4579e8 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.test.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/TypeRow.test.jsx @@ -10,14 +10,11 @@ jest.mock('../hooks', () => ({ describe('TypeRow', () => { const typeKey = 'TEXTINPUT'; const props = { - answers: [], - correctAnswerCount: 0, typeKey, label: 'Text Input Problem', selected: true, lastRow: false, updateField: jest.fn().mockName('args.updateField'), - updateAnswer: jest.fn().mockName('args.updateAnswer'), }; const typeRowHooksProps = { @@ -29,13 +26,7 @@ describe('TypeRow', () => { describe('behavior', () => { it(' calls typeRowHooks when initialized', () => { shallow(); - expect(typeRowHooks).toHaveBeenCalledWith({ - answers: props.answers, - correctAnswerCount: props.correctAnswerCount, - typeKey, - updateField: props.updateField, - updateAnswer: props.updateAnswer, - }); + expect(typeRowHooks).toHaveBeenCalledWith(typeKey, props.updateField); }); }); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintRow.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintRow.test.jsx.snap index a106c71a8..ea0adb253 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintRow.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintRow.test.jsx.snap @@ -5,7 +5,7 @@ exports[`HintRow snapshot snapshot: renders hints row 1`] = ` fluid={true} > - @@ -15,8 +15,8 @@ exports[`HintRow snapshot snapshot: renders hints row 1`] = ` value="hint_1" /> - - + - + `; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintsCard.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintsCard.test.jsx.snap index 2863895dd..f25b722aa 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintsCard.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/HintsCard.test.jsx.snap @@ -20,7 +20,7 @@ exports[`HintsCard snapshot snapshot: renders hints setting card multiple hints value="" /> - } - footerAction={null} - isOpen={false} - size="md" - title={ - - } - > - - - - -`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/TypeCard.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/TypeCard.test.jsx.snap index 9daac71fe..251289f10 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/TypeCard.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/SettingsWidget/settingsComponents/__snapshots__/TypeCard.test.jsx.snap @@ -2,62 +2,55 @@ exports[`TypeCard snapshot snapshot: renders type setting card 1`] = ` + diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/__snapshots__/index.test.jsx.snap b/src/editors/containers/ProblemEditor/components/EditProblemView/__snapshots__/index.test.jsx.snap deleted file mode 100644 index f5b33aaa9..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/__snapshots__/index.test.jsx.snap +++ /dev/null @@ -1,64 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`EditorProblemView component renders raw editor 1`] = ` - - - - - - - - - - - - -`; - -exports[`EditorProblemView component renders simple view 1`] = ` - - - - - - - - - - - - - -`; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.js b/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.js deleted file mode 100644 index 80298bc56..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.js +++ /dev/null @@ -1,14 +0,0 @@ -import ReactStateSettingsParser from '../../data/ReactStateSettingsParser'; -import ReactStateOLXParser from '../../data/ReactStateOLXParser'; - -// eslint-disable-next-line import/prefer-default-export -export const parseState = (problem, isAdvanced, ref) => () => { - const reactSettingsParser = new ReactStateSettingsParser(problem); - const reactOLXParser = new ReactStateOLXParser({ problem }); - const rawOLX = ref?.current?.state.doc.toString(); - - return { - settings: reactSettingsParser.getSettings(), - olx: isAdvanced ? rawOLX : reactOLXParser.buildOLX(), - }; -}; diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.test.js b/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.test.js deleted file mode 100644 index 9cfc8a42f..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/hooks.test.js +++ /dev/null @@ -1,25 +0,0 @@ -import * as hooks from './hooks'; - -const mockRawOLX = 'rawOLX'; -const mockBuiltOLX = 'builtOLX'; - -jest.mock('../../data/ReactStateOLXParser', () => ( - jest.fn().mockImplementation(() => ({ - buildOLX: () => mockBuiltOLX, - })) -)); -jest.mock('../../data/ReactStateSettingsParser'); - -describe('EditProblemView hooks parseState', () => { - const toStringMock = () => mockRawOLX; - const refMock = { current: { state: { doc: { toString: toStringMock } } } }; - - test('default problem', () => { - const res = hooks.parseState('problem', false, refMock)(); - expect(res.olx).toBe(mockBuiltOLX); - }); - test('advanced problem', () => { - const res = hooks.parseState('problem', true, refMock)(); - expect(res.olx).toBe(mockRawOLX); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/index.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/index.jsx index f43ddd1d2..5600f9e3a 100644 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/index.jsx +++ b/src/editors/containers/ProblemEditor/components/EditProblemView/index.jsx @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; @@ -6,35 +6,34 @@ import { Col, Container, Row } from '@edx/paragon'; import AnswerWidget from './AnswerWidget'; import SettingsWidget from './SettingsWidget'; import QuestionWidget from './QuestionWidget'; -import EditorContainer from '../../../EditorContainer'; +import { EditorContainer } from '../../../EditorContainer'; import { selectors } from '../../../../data/redux'; -import RawEditor from '../../../../sharedComponents/RawEditor'; -import { ProblemTypeKeys } from '../../../../data/constants/problem'; - -import { parseState } from './hooks'; +import ReactStateSettingsParser from '../../data/ReactStateSettingsParser'; +import ReactStateOLXParser from '../../data/ReactStateOLXParser'; +import { AdvanceProblemKeys } from '../../../../data/constants/problem'; export const EditProblemView = ({ problemType, problemState, }) => { - const editorRef = useRef(null); - const isAdvancedProblemType = problemType === ProblemTypeKeys.ADVANCED; - - const getContent = parseState(problemState, isAdvancedProblemType, editorRef); - + const parseState = (problem) => () => { + const reactSettingsParser = new ReactStateSettingsParser(problem); + const reactOLXParser = new ReactStateOLXParser({ problem }); + return { + settings: reactSettingsParser.getSettings(), + olx: reactOLXParser.buildOLX(), + }; + }; + if (Object.values(AdvanceProblemKeys).includes(problemType)) { + return `hello raw editor with ${problemType}`; + } return ( - - + + - {isAdvancedProblemType ? ( - - ) : ( - <> - - - - )} + + diff --git a/src/editors/containers/ProblemEditor/components/EditProblemView/index.test.jsx b/src/editors/containers/ProblemEditor/components/EditProblemView/index.test.jsx deleted file mode 100644 index 05e934a07..000000000 --- a/src/editors/containers/ProblemEditor/components/EditProblemView/index.test.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { shallow } from 'enzyme'; -import { EditProblemView } from '.'; -import AnswerWidget from './AnswerWidget'; -import { ProblemTypeKeys } from '../../../../data/constants/problem'; -import RawEditor from '../../../../sharedComponents/RawEditor'; - -describe('EditorProblemView component', () => { - test('renders simple view', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - expect(wrapper.find(AnswerWidget).length).toBe(1); - }); - - test('renders raw editor', () => { - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - expect(wrapper.find(AnswerWidget).length).toBe(0); - expect(wrapper.find(RawEditor).length).toBe(1); - }); -}); diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/SelectTypeWrapper/SelectTypeFooter.jsx b/src/editors/containers/ProblemEditor/components/SelectTypeModal/SelectTypeWrapper/SelectTypeFooter.jsx index 1d0e8f870..e7f279fe7 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/SelectTypeWrapper/SelectTypeFooter.jsx +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/SelectTypeWrapper/SelectTypeFooter.jsx @@ -17,12 +17,12 @@ export const SelectTypeFooter = ({ onCancel, selected, // redux + setProblemType, updateField, - setBlockTitle, // injected, intl, }) => ( -
+
@@ -35,7 +35,7 @@ export const SelectTypeFooter = ({ - + ); }; ProblemTypeSelect.propTypes = { diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/AdvanceTypeSelect.test.jsx.snap b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/AdvanceTypeSelect.test.jsx.snap index 971ee0749..040a7ca10 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/AdvanceTypeSelect.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/AdvanceTypeSelect.test.jsx.snap @@ -1,13 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with default props 1`] = ` - - Blank advanced problem + Blank advance problem @@ -82,9 +80,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with default } placement="right" > -
+
Not supported
@@ -137,13 +133,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with default } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -181,9 +217,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with default } placement="right" > -
+
Not supported
@@ -236,36 +270,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with default } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is circuitschematic 1`] = ` - - Blank advanced problem + Blank advance problem @@ -340,9 +360,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -395,13 +413,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -439,9 +497,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -494,36 +550,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is customgrader 1`] = ` - - Blank advanced problem + Blank advance problem @@ -598,9 +640,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -653,13 +693,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -697,9 +777,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -752,36 +830,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is drag_and_drop 1`] = ` - - Blank advanced problem + Blank advance problem @@ -856,9 +920,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -911,13 +973,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -955,9 +1057,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1010,36 +1110,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is formularesponse 1`] = ` - - Blank advanced problem + Blank advance problem @@ -1114,9 +1200,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1169,13 +1253,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -1213,9 +1337,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1268,36 +1390,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is imageresponse 1`] = ` - - Blank advanced problem + Blank advance problem @@ -1372,9 +1480,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1427,13 +1533,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -1471,9 +1617,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1526,36 +1670,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is jsinput_response 1`] = ` - - Blank advanced problem + Blank advance problem @@ -1630,9 +1760,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1685,13 +1813,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -1729,9 +1897,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1784,36 +1950,22 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problemType is problem_with_hint 1`] = ` - - Blank advanced problem + Blank advance problem @@ -1888,9 +2040,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -1943,13 +2093,53 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Provisional
+ + + Drag and drop (deprecated version) + + + +
+ {supportStatus, select, + Provisional {Provisionally supported tools might lack the robustness of functionality + that your courses require. edX does not have control over the quality of the software, + or of the content that can be provided using these tools. + + + + Test these tools thoroughly before using them in your course, especially in graded + sections. Complete documentstion might not be available for provisionally supported + tools, or documentation might be available from sources other than edX.} + Not_supported {Tools with no support are not maintained by edX, and might be deprecated + in the future. They are not recommened for use in courses due to non-compliance with one + or more of the base requirements, such as testing, accessibility, internationalization, + and documentation.} + other { } + } +
+ + } + placement="right" + > +
+ Not supported +
+
+
@@ -1987,9 +2177,7 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
@@ -2042,24 +2230,12 @@ exports[`AdvanceTypeSelect snapshots snapshots: renders as expected with problem } placement="right" > -
+
Not supported
- - - - +
`; diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/Preview.test.jsx.snap b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/Preview.test.jsx.snap index 9cc84af14..8dd2e23bf 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/Preview.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/Preview.test.jsx.snap @@ -3,19 +3,13 @@ exports[`Preview snapshots snapshots: renders as expected with default props 1`] = `""`; exports[`Preview snapshots snapshots: renders as expected with problemType is choiceresponse 1`] = ` -
- Multi-select problem + Multi Select Problem
A preview illustration of a {problemType, select,
@@ -40,28 +34,22 @@ exports[`Preview snapshots snapshots: renders as expected with problemType is ch
     target= -
+
`; exports[`Preview snapshots snapshots: renders as expected with problemType is multiplechoiceresponse 1`] = ` -
- Single select problem + Single Select Problem
A preview illustration of a {problemType, select,
@@ -86,28 +74,22 @@ exports[`Preview snapshots snapshots: renders as expected with problemType is mu
     target= -
+
`; exports[`Preview snapshots snapshots: renders as expected with problemType is numericalresponse 1`] = ` -
- Numerical input problem + Numeric Response Problem
A preview illustration of a {problemType, select,
@@ -132,28 +114,22 @@ exports[`Preview snapshots snapshots: renders as expected with problemType is nu
     target= -
+
`; exports[`Preview snapshots snapshots: renders as expected with problemType is optionresponse 1`] = ` -
- Dropdown problem + Dropdown Problem
A preview illustration of a {problemType, select,
@@ -178,28 +154,22 @@ exports[`Preview snapshots snapshots: renders as expected with problemType is op
     target= -
+
`; exports[`Preview snapshots snapshots: renders as expected with problemType is stringresponse 1`] = ` -
- Text input problem + Text Input Problem
A preview illustration of a {problemType, select,
@@ -224,10 +194,10 @@ exports[`Preview snapshots snapshots: renders as expected with problemType is st
     target= -
+
`; diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/ProblemTypeSelect.test.jsx.snap b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/ProblemTypeSelect.test.jsx.snap index 775965cf3..bf2f8389e 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/ProblemTypeSelect.test.jsx.snap +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/__snapshots__/ProblemTypeSelect.test.jsx.snap @@ -1,14 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ProblemTypeSelect snapshot DROPDOWN 1`] = ` - + - Single select + Single Select Problem - Multi-select + Multi Select Problem - Dropdown + Dropdown Problem - Numerical input + Numeric Response Problem - Text input + Text Input Problem - + `; exports[`ProblemTypeSelect snapshot MULTISELECT 1`] = ` - + - Single select + Single Select Problem - Multi-select + Multi Select Problem - Dropdown + Dropdown Problem - Numerical input + Numeric Response Problem - Text input + Text Input Problem - + `; exports[`ProblemTypeSelect snapshot NUMERIC 1`] = ` - + - Single select + Single Select Problem - Multi-select + Multi Select Problem - Dropdown + Dropdown Problem - Numerical input + Numeric Response Problem - Text input + Text Input Problem - + `; exports[`ProblemTypeSelect snapshot SINGLESELECT 1`] = ` - + - Single select + Single Select Problem - Multi-select + Multi Select Problem - Dropdown + Dropdown Problem - Numerical input + Numeric Response Problem - Text input + Text Input Problem - + `; exports[`ProblemTypeSelect snapshot TEXTINPUT 1`] = ` - + - Single select + Single Select Problem - Multi-select + Multi Select Problem - Dropdown + Dropdown Problem - Numerical input + Numeric Response Problem - Text input + Text Input Problem - + `; diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/messages.js b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/messages.js index 9d220f1a1..dae097bb7 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/messages.js +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/content/messages.js @@ -1,7 +1,7 @@ export const messages = { advanceProblemButtonLabel: { id: 'authoring.problemEditor.problemSelect.advanceButton.label', - defaultMessage: 'Advanced problem types', + defaultMessage: 'Advance problem types', description: 'Button label for advance problem types option', }, advanceMenuTitle: { @@ -39,7 +39,7 @@ export const messages = { }, previewTitle: { id: 'authoring.problemEditor.preview.title', - defaultMessage: '{previewTitle} problem', + defaultMessage: '{previewTitle}', description: 'Title for the problem preview column', }, previewAltText: { @@ -61,13 +61,8 @@ export const messages = { }, learnMoreButtonLabel: { id: 'authoring.problemEditor.learnMoreButtonLabel.label', - defaultMessage: 'Learn more', - description: 'Label for Learn more button', - }, - learnMoreAdvancedButtonLabel: { - id: 'authoring.problemEditor.advanceProblem.learnMoreButtonLabel.label', - defaultMessage: 'Learn more about advanced problem types', - description: 'Label for Learn more about advanced problem types button', + defaultMessage: 'Learn More', + description: 'Label for Learn More button', }, }; diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.js b/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.js index f6cf10143..f1dace285 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.js +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.js @@ -4,7 +4,6 @@ import { } from '../../../../data/constants/problem'; import { StrictDict } from '../../../../utils'; import * as module from './hooks'; -import { getDataFromOlx } from '../../../../data/redux/thunkActions/problem'; export const state = StrictDict({ selected: (val) => useState(val), @@ -18,16 +17,11 @@ export const selectHooks = () => { }; }; -export const onSelect = ({ selected, updateField, setBlockTitle }) => () => { +export const onSelect = (setProblemType, selected, updateField) => () => { if (Object.values(AdvanceProblemKeys).includes(selected)) { - updateField({ problemType: ProblemTypeKeys.ADVANCED, rawOLX: AdvanceProblems[selected].template }); - setBlockTitle(AdvanceProblems[selected].title); - } else { - const newOLX = ProblemTypes[selected].template; - const { settings, ...newState } = getDataFromOlx({ rawOLX: newOLX, rawSettings: {} }); - updateField({ ...newState }); - setBlockTitle(ProblemTypes[selected].title); + updateField({ rawOLX: AdvanceProblems[selected].template }); } + setProblemType({ selected }); }; export const useArrowNav = (selected, setSelected) => { diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.test.js b/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.test.js index b44cc4eef..50829221e 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.test.js +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/hooks.test.js @@ -2,8 +2,7 @@ import React from 'react'; import { MockUseState } from '../../../../../testUtils'; import * as module from './hooks'; -import { AdvanceProblems, ProblemTypeKeys, ProblemTypes } from '../../../../data/constants/problem'; -import { OLXParser } from '../../data/OLXParser'; +import { AdvanceProblems, ProblemTypeKeys } from '../../../../data/constants/problem'; jest.mock('react', () => ({ ...jest.requireActual('react'), @@ -12,11 +11,11 @@ jest.mock('react', () => ({ })); const state = new MockUseState(module); +const mockSetProblemType = jest.fn().mockName('setProblemType'); const mockUpdateField = jest.fn().mockName('updateField'); -const mockSelected = 'multiplechoiceresponse'; -const mockAdvancedSelected = 'circuitschematic'; +const mockSelected = 'vAl'; +const mockAdvancedSelected = 'blankadvanced'; const mockSetSelected = jest.fn().mockName('setSelected'); -const mocksetBlockTitle = jest.fn().mockName('setBlockTitle'); let hook; @@ -46,26 +45,14 @@ describe('SelectTypeModal hooks', () => { describe('onSelect', () => { test('updateField is called with selected templated if selected is an Advanced Problem', () => { - module.onSelect({ - selected: mockAdvancedSelected, - updateField: mockUpdateField, - setBlockTitle: mocksetBlockTitle, - })(); + module.onSelect(mockSetProblemType, mockAdvancedSelected, mockUpdateField)(); expect(mockUpdateField).toHaveBeenCalledWith({ - problemType: ProblemTypeKeys.ADVANCED, rawOLX: AdvanceProblems[mockAdvancedSelected].template, }); - expect(mocksetBlockTitle).toHaveBeenCalledWith(AdvanceProblems[mockAdvancedSelected].title); }); - test('updateField is called with selected on visual propblems', () => { - module.onSelect({ selected: mockSelected, updateField: mockUpdateField, setBlockTitle: mocksetBlockTitle })(); - const testOlXParser = new OLXParser(ProblemTypes[mockSelected].template); - const { settings, ...testState } = testOlXParser.getParsedOLXData(); - expect(mockUpdateField).toHaveBeenCalledWith({ - ...testState, - rawOLX: ProblemTypes[mockSelected].template, - }); - expect(mocksetBlockTitle).toHaveBeenCalledWith(ProblemTypes[mockSelected].title); + test('setProblemType is called with selected', () => { + module.onSelect(mockSetProblemType, mockSelected, mockUpdateField)(); + expect(mockSetProblemType).toHaveBeenCalledWith({ selected: mockSelected }); }); }); diff --git a/src/editors/containers/ProblemEditor/components/SelectTypeModal/index.jsx b/src/editors/containers/ProblemEditor/components/SelectTypeModal/index.jsx index 0c02e0647..49d2ca7b7 100644 --- a/src/editors/containers/ProblemEditor/components/SelectTypeModal/index.jsx +++ b/src/editors/containers/ProblemEditor/components/SelectTypeModal/index.jsx @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Row, Stack } from '@edx/paragon'; +import { Col, Row } from '@edx/paragon'; import ProblemTypeSelect from './content/ProblemTypeSelect'; import Preview from './content/Preview'; import AdvanceTypeSelect from './content/AdvanceTypeSelect'; @@ -17,12 +17,16 @@ export const SelectTypeModal = ({ return ( - + {(!Object.values(AdvanceProblemKeys).includes(selected)) ? ( - - - - + <> + + + + + + + ) : } diff --git a/src/editors/containers/ProblemEditor/data/OLXParser.js b/src/editors/containers/ProblemEditor/data/OLXParser.js index 865a14999..18126a039 100644 --- a/src/editors/containers/ProblemEditor/data/OLXParser.js +++ b/src/editors/containers/ProblemEditor/data/OLXParser.js @@ -280,7 +280,7 @@ export class OLXParser { the parsed OLX. */ const tagMap = { - label: 'strong', + label: 'bold', description: 'em', }; @@ -331,16 +331,10 @@ export class OLXParser { getProblemType() { const problemKeys = Object.keys(this.problem); const intersectedProblems = _.intersection(Object.values(ProblemTypeKeys), problemKeys); + if (intersectedProblems.length === 0) { - // a blank problem is a problem which contains only `` as it's olx. - // blank problems are not given types, so that a type may be selected. - if (problemKeys.length === 1 && problemKeys[0] === '#text' && this.problem[problemKeys[0]] === '') { - return null; - } - // if we have no matching problem type, the problem is advanced. - return ProblemTypeKeys.ADVANCED; + return null; } - // make sure compound problems are treated as advanced if (intersectedProblems.length > 1) { return ProblemTypeKeys.ADVANCED; } @@ -375,10 +369,7 @@ export class OLXParser { answersObject = this.parseMultipleChoiceAnswers(ProblemTypeKeys.SINGLESELECT, 'choicegroup', 'choice'); break; case ProblemTypeKeys.ADVANCED: - return { - problemType, - settings: {}, - }; + break; default: // if problem is unset, return null return {}; diff --git a/src/editors/containers/ProblemEditor/data/OLXParser.test.js b/src/editors/containers/ProblemEditor/data/OLXParser.test.js index 5823e4b6e..3ae946638 100644 --- a/src/editors/containers/ProblemEditor/data/OLXParser.test.js +++ b/src/editors/containers/ProblemEditor/data/OLXParser.test.js @@ -7,8 +7,6 @@ import { textInputWithFeedbackAndHintsOLX, mutlipleChoiceWithFeedbackAndHintsOLX, textInputWithFeedbackAndHintsOLXWithMultipleAnswers, - advancedProblemOlX, - blankProblemOLX, } from './mockData/olxTestData'; import { ProblemTypeKeys } from '../../../data/constants/problem'; @@ -38,16 +36,6 @@ describe('Check OLXParser problem type', () => { const problemType = olxparser.getProblemType(); expect(problemType).toBe(ProblemTypeKeys.TEXTINPUT); }); - test('Test Advanced Problem Type', () => { - const olxparser = new OLXParser(advancedProblemOlX.rawOLX); - const problemType = olxparser.getProblemType(); - expect(problemType).toBe(ProblemTypeKeys.ADVANCED); - }); - test('Test Blank Problem Type', () => { - const olxparser = new OLXParser(blankProblemOLX.rawOLX); - const problemType = olxparser.getProblemType(); - expect(problemType).toBe(null); - }); }); describe('Check OLXParser hints', () => { diff --git a/src/editors/containers/ProblemEditor/data/SettingsParser.js b/src/editors/containers/ProblemEditor/data/SettingsParser.js index 1de0708a0..8c038efe7 100644 --- a/src/editors/containers/ProblemEditor/data/SettingsParser.js +++ b/src/editors/containers/ProblemEditor/data/SettingsParser.js @@ -16,7 +16,10 @@ export const parseScoringSettings = (metadata) => { let attempts = popuplateItem({}, 'max_attempts', 'number', metadata); if (!_.isEmpty(attempts)) { - const unlimited = _.isNaN(attempts.number); + let unlimited = true; + if (attempts.number > 0) { + unlimited = false; + } attempts = { ...attempts, unlimited }; scoring = { ...scoring, attempts }; } diff --git a/src/editors/containers/ProblemEditor/data/SettingsParser.test.js b/src/editors/containers/ProblemEditor/data/SettingsParser.test.js index 871262aa7..cf3ddc763 100644 --- a/src/editors/containers/ProblemEditor/data/SettingsParser.test.js +++ b/src/editors/containers/ProblemEditor/data/SettingsParser.test.js @@ -4,7 +4,7 @@ import { dropdownWithFeedbackHints, numericWithHints, textInputWithHints, - singleSelectWithHints, + sigleSelectWithHints, } from './mockData/problemTestData'; describe('Test Settings to State Parser', () => { @@ -38,7 +38,7 @@ describe('Test Settings to State Parser', () => { }); test('Test score settings missing', () => { - const settings = parseSettings(singleSelectWithHints.metadata); + const settings = parseSettings(sigleSelectWithHints.metadata); expect(settings.scoring).toBeUndefined(); }); diff --git a/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js b/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js index 187ce6514..cc9e2de9d 100644 --- a/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js +++ b/src/editors/containers/ProblemEditor/data/mockData/olxTestData.js @@ -82,11 +82,11 @@ export const checkboxesOLXWithFeedbackAndHintsOLX = { }, ], }, - question: '

You can use this template as a guide to the simple editor markdown and OLX markup to use for checkboxes with hints and feedback problems. Edit this component to replace this template with your own assessment.

Add the question text, or prompt, here. This text is required.You can add an optional tip or note related to the prompt like this.', + question: '

You can use this template as a guide to the simple editor markdown and OLX markup to use for checkboxes with hints and feedback problems. Edit this component to replace this template with your own assessment.

Add the question text, or prompt, here. This text is required.You can add an optional tip or note related to the prompt like this.', buildOLX: `

You can use this template as a guide to the simple editor markdown and OLX markup to use for checkboxes with hints and feedback problems. Edit this component to replace this template with your own assessment.

- Add the question text, or prompt, here. This text is required. + Add the question text, or prompt, here. This text is required. You can add an optional tip or note related to the prompt like this. @@ -160,11 +160,11 @@ export const dropdownOLXWithFeedbackAndHintsOLX = { }, ], }, - question: '

You can use this template as a guide to the simple editor markdown and OLX markup to use for dropdown with hints and feedback problems. Edit this component to replace this template with your own assessment.

Add the question text, or prompt, here. This text is required.You can add an optional tip or note related to the prompt like this.', + question: '

You can use this template as a guide to the simple editor markdown and OLX markup to use for dropdown with hints and feedback problems. Edit this component to replace this template with your own assessment.

Add the question text, or prompt, here. This text is required.You can add an optional tip or note related to the prompt like this.', buildOLX: `

You can use this template as a guide to the simple editor markdown and OLX markup to use for dropdown with hints and feedback problems. Edit this component to replace this template with your own assessment.

- Add the question text, or prompt, here. This text is required. + Add the question text, or prompt, here. This text is required. You can add an optional tip or note related to the prompt like this.