@khanacademy/perseus 7.2.1 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/dist/article-renderer.d.ts +27 -40
- package/dist/components/math-input.d.ts +1 -1
- package/dist/components/sortable.d.ts +1 -1
- package/dist/components/tex-buttons.d.ts +1 -1
- package/dist/dependencies.d.ts +7 -1
- package/dist/es/index.js +1205 -1218
- package/dist/es/index.js.map +1 -1
- package/dist/hints-renderer.d.ts +1 -1
- package/dist/index.js +1207 -1221
- package/dist/index.js.map +1 -1
- package/dist/interaction-tracker.d.ts +3 -3
- package/dist/item-renderer.d.ts +2 -1
- package/dist/mixins/provide-keypad.d.ts +15 -12
- package/dist/multi-items/multi-renderer.d.ts +2 -1
- package/dist/perseus-api.d.ts +2 -2
- package/dist/renderer.d.ts +1 -1
- package/dist/server-item-renderer.d.ts +3 -1
- package/dist/types.d.ts +32 -11
- package/dist/widgets/expression.d.ts +410 -13
- package/dist/widgets/graded-group.d.ts +3 -3
- package/dist/widgets/interactive-graph.d.ts +1 -1
- package/dist/widgets/sequence.d.ts +3 -3
- package/dist/widgets/table.d.ts +8 -1
- package/dist/widgets.d.ts +1 -1
- package/package.json +34 -34
- package/src/__stories__/article-renderer.stories.tsx +35 -2
- package/src/__testdata__/article-renderer.testdata.ts +74 -1
- package/src/__testdata__/item-renderer.testdata.ts +1 -1
- package/src/__testdata__/renderer.testdata.ts +1 -1
- package/src/__tests__/item-renderer.test.tsx +13 -2
- package/src/__tests__/mock-asset-loading-widget.tsx +1 -1
- package/src/__tests__/perseus-markdown.test.ts +17 -17
- package/src/__tests__/renderer-api.test.tsx +21 -21
- package/src/__tests__/renderer.test.tsx +13 -13
- package/src/__tests__/server-item-renderer.test.tsx +12 -4
- package/src/__tests__/tex-wrangler.test.ts +1 -1
- package/src/article-renderer.tsx +75 -66
- package/src/components/__tests__/number-input.test.tsx +4 -4
- package/src/components/__tests__/sortable.test.tsx +2 -2
- package/src/components/fixed-to-responsive.tsx +1 -1
- package/src/components/graph.tsx +11 -11
- package/src/components/graphie-classes.ts +7 -7
- package/src/components/graphie.tsx +14 -14
- package/src/components/highlighting/highlightable-content.tsx +1 -1
- package/src/components/highlighting/ui/highlight-renderer.tsx +1 -1
- package/src/components/highlighting/ui/util.ts +2 -2
- package/src/components/highlighting/word-indexer.tsx +4 -4
- package/src/components/icon.tsx +1 -1
- package/src/components/image-loader.tsx +4 -4
- package/src/components/input-with-examples.tsx +2 -2
- package/src/components/lint.tsx +1 -1
- package/src/components/math-input.tsx +5 -5
- package/src/components/math-output.tsx +1 -1
- package/src/components/multi-button-group.tsx +1 -1
- package/src/components/number-input.tsx +10 -10
- package/src/components/prop-check-box.tsx +1 -1
- package/src/components/simple-keypad-input.tsx +4 -4
- package/src/components/sortable.tsx +42 -41
- package/src/components/svg-image.tsx +12 -12
- package/src/components/tex-buttons.tsx +4 -3
- package/src/components/text-input.tsx +8 -8
- package/src/components/text-list-editor.tsx +11 -11
- package/src/components/visibility-observer/create-visibility-observer.ts +1 -1
- package/src/components/visibility-observer/visibility-observer.tsx +2 -2
- package/src/components/zoomable-tex.tsx +3 -3
- package/src/components/zoomable.tsx +8 -8
- package/src/dependencies.ts +16 -1
- package/src/hint-renderer.tsx +3 -3
- package/src/hints-renderer.tsx +11 -11
- package/src/init.ts +1 -1
- package/src/interaction-tracker.ts +7 -7
- package/src/interactive2/__tests__/movable-point.test.ts +1 -1
- package/src/interactive2/interactive-util.ts +6 -6
- package/src/interactive2/movable-helper-methods.ts +2 -2
- package/src/interactive2/movable-line-options.ts +37 -37
- package/src/interactive2/movable-line.ts +2 -2
- package/src/interactive2/movable-point-options.ts +29 -29
- package/src/interactive2/movable-point.tsx +2 -2
- package/src/interactive2/movable-polygon-options.ts +45 -45
- package/src/interactive2/movable-polygon.ts +2 -2
- package/src/interactive2/movable.ts +2 -2
- package/src/interactive2/objective_.ts +1 -1
- package/src/interactive2/wrapped-defaults.ts +2 -2
- package/src/interactive2/wrapped-ellipse.ts +9 -9
- package/src/interactive2/wrapped-line.ts +8 -8
- package/src/interactive2/wrapped-path.ts +5 -5
- package/src/item-renderer.tsx +66 -48
- package/src/mixins/changeable.ts +2 -2
- package/src/mixins/editor-jsonify.ts +1 -1
- package/src/mixins/provide-keypad.tsx +23 -37
- package/src/mixins/widget-jsonify-deprecated.ts +1 -1
- package/src/multi-items/__tests__/items.test.ts +1 -1
- package/src/multi-items/__tests__/multi-renderer.test.tsx +13 -8
- package/src/multi-items/__tests__/trees.test.ts +12 -12
- package/src/multi-items/item-types.ts +2 -2
- package/src/multi-items/items.ts +1 -1
- package/src/multi-items/multi-renderer.tsx +30 -18
- package/src/multi-items/prop-type-builders.ts +2 -2
- package/src/multi-items/tree-types.ts +4 -4
- package/src/multi-items/trees.ts +16 -16
- package/src/perseus-env.ts +2 -2
- package/src/perseus-markdown.tsx +5 -5
- package/src/renderer.tsx +39 -39
- package/src/server-item-renderer.tsx +26 -21
- package/src/sigfigs.ts +1 -1
- package/src/traversal.ts +1 -1
- package/src/types.ts +52 -16
- package/src/util/answer-types.ts +14 -14
- package/src/util/geometry.ts +7 -7
- package/src/util/graphie.ts +32 -32
- package/src/util/interactive.ts +118 -118
- package/src/util/math.ts +4 -4
- package/src/util/react-render.tsx +1 -1
- package/src/util/scroll-utils.ts +2 -2
- package/src/util/tex.ts +3 -3
- package/src/util.ts +15 -15
- package/src/widget-container.tsx +1 -1
- package/src/widgets/__stories__/definition.stories.tsx +8 -1
- package/src/widgets/__stories__/expression.stories.tsx +2 -2
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +3 -3
- package/src/widgets/__testdata__/numeric-input.testdata.ts +1 -1
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +2 -2
- package/src/widgets/__tests__/{expression.test.ts → expression.test.tsx} +77 -11
- package/src/widgets/__tests__/grapher.cypress.ts +32 -32
- package/src/widgets/__tests__/group.test.tsx +1 -1
- package/src/widgets/__tests__/interactive-graph.cypress.ts +40 -40
- package/src/widgets/__tests__/interactive-graph.test.ts +1 -1
- package/src/widgets/__tests__/numeric-input.test.ts +1 -1
- package/src/widgets/__tests__/passage.test.tsx +2 -2
- package/src/widgets/__tests__/plotter.test.tsx +2 -1
- package/src/widgets/__tests__/radio/base-radio.test.tsx +7 -7
- package/src/widgets/__tests__/renderQuestion.tsx +29 -21
- package/src/widgets/categorizer.tsx +4 -4
- package/src/widgets/cs-program.tsx +2 -2
- package/src/widgets/dropdown.tsx +1 -1
- package/src/widgets/expression.tsx +92 -57
- package/src/widgets/graded-group-set.tsx +5 -5
- package/src/widgets/graded-group.tsx +29 -21
- package/src/widgets/grapher/util.tsx +6 -6
- package/src/widgets/grapher.tsx +10 -10
- package/src/widgets/group.tsx +3 -3
- package/src/widgets/iframe.tsx +2 -2
- package/src/widgets/image.tsx +1 -1
- package/src/widgets/input-number.tsx +4 -4
- package/src/widgets/interaction.tsx +77 -77
- package/src/widgets/interactive-graph.tsx +109 -107
- package/src/widgets/label-image/marker.tsx +2 -2
- package/src/widgets/label-image.test.ts +1 -1
- package/src/widgets/label-image.tsx +7 -7
- package/src/widgets/lights-puzzle.tsx +2 -2
- package/src/widgets/matcher.tsx +6 -6
- package/src/widgets/matrix.tsx +20 -20
- package/src/widgets/measurer.tsx +3 -3
- package/src/widgets/molecule/__tests__/layout.test.ts +4 -4
- package/src/widgets/molecule/__tests__/parser.test.ts +14 -14
- package/src/widgets/molecule/smiles-parser.ts +3 -3
- package/src/widgets/molecule.tsx +4 -4
- package/src/widgets/number-line.tsx +11 -11
- package/src/widgets/numeric-input.tsx +11 -11
- package/src/widgets/orderer.tsx +38 -38
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +1 -1
- package/src/widgets/passage/passage-markdown.tsx +4 -4
- package/src/widgets/passage-ref-target.tsx +1 -1
- package/src/widgets/passage-ref.tsx +4 -6
- package/src/widgets/passage.tsx +11 -11
- package/src/widgets/plotter.tsx +9 -9
- package/src/widgets/radio/base-radio.tsx +11 -11
- package/src/widgets/radio/choice-icon/choice-icon.tsx +2 -2
- package/src/widgets/radio/choice.tsx +1 -1
- package/src/widgets/radio/option-status.tsx +1 -1
- package/src/widgets/radio/widget.tsx +6 -6
- package/src/widgets/radio.ts +1 -1
- package/src/widgets/reaction-diagram.tsx +8 -8
- package/src/widgets/sequence.tsx +12 -4
- package/src/widgets/simulator.tsx +14 -14
- package/src/widgets/sorter.tsx +4 -4
- package/src/widgets/table.tsx +8 -8
- package/src/widgets/transformer.tsx +92 -92
- package/src/widgets/unit.tsx +17 -17
- package/src/widgets/video-transcript-link.test.tsx +3 -3
- package/src/widgets/video-transcript-link.tsx +1 -1
- package/src/widgets/video.tsx +1 -1
- package/src/widgets.ts +5 -5
- package/src/zoom.ts +22 -22
- package/tsconfig-build.tsbuildinfo +1 -1
- package/dist/a11y.js.flow +0 -11
- package/dist/all-widgets.js.flow +0 -33
- package/dist/article-renderer.js.flow +0 -73
- package/dist/asset-context.js.flow +0 -15
- package/dist/basic-widgets.js.flow +0 -33
- package/dist/components/button-group.js.flow +0 -33
- package/dist/components/constants.js.flow +0 -13
- package/dist/components/fixed-to-responsive.js.flow +0 -34
- package/dist/components/graph.js.flow +0 -66
- package/dist/components/graphie-classes.js.flow +0 -19
- package/dist/components/graphie-movables.js.flow +0 -22
- package/dist/components/graphie.js.flow +0 -69
- package/dist/components/highlighting/highlightable-content.js.flow +0 -56
- package/dist/components/highlighting/highlights.js.flow +0 -54
- package/dist/components/highlighting/ranges.js.flow +0 -60
- package/dist/components/highlighting/types.js.flow +0 -70
- package/dist/components/highlighting/ui/highlight-renderer.js.flow +0 -43
- package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +0 -41
- package/dist/components/highlighting/ui/highlight-tooltip.js.flow +0 -22
- package/dist/components/highlighting/ui/highlighting-ui.js.flow +0 -30
- package/dist/components/highlighting/ui/selection-tracker.js.flow +0 -54
- package/dist/components/highlighting/ui/types.js.flow +0 -22
- package/dist/components/highlighting/ui/util.js.flow +0 -42
- package/dist/components/highlighting/word-indexer.js.flow +0 -21
- package/dist/components/hud.js.flow +0 -14
- package/dist/components/icon.js.flow +0 -31
- package/dist/components/image-loader.js.flow +0 -49
- package/dist/components/info-tip/info-tip.js.flow +0 -20
- package/dist/components/info-tip.js.flow +0 -18
- package/dist/components/inline-icon.js.flow +0 -39
- package/dist/components/input-with-examples.js.flow +0 -58
- package/dist/components/lint.js.flow +0 -58
- package/dist/components/math-input.js.flow +0 -49
- package/dist/components/math-output.js.flow +0 -33
- package/dist/components/multi-button-group.js.flow +0 -35
- package/dist/components/number-input.js.flow +0 -42
- package/dist/components/prop-check-box.js.flow +0 -8
- package/dist/components/range-input.js.flow +0 -20
- package/dist/components/simple-keypad-input.js.flow +0 -16
- package/dist/components/sortable.js.flow +0 -91
- package/dist/components/stub-tag-editor.js.flow +0 -18
- package/dist/components/svg-image.js.flow +0 -85
- package/dist/components/tex-buttons.js.flow +0 -26
- package/dist/components/tex.js.flow +0 -25
- package/dist/components/text-input.js.flow +0 -39
- package/dist/components/text-list-editor.js.flow +0 -22
- package/dist/components/tooltip.js.flow +0 -51
- package/dist/components/visibility-observer/create-visibility-observer.js.flow +0 -23
- package/dist/components/visibility-observer/get-scroll-parent.js.flow +0 -7
- package/dist/components/visibility-observer/visibility-observer.js.flow +0 -36
- package/dist/components/zoomable-tex.js.flow +0 -18
- package/dist/components/zoomable.js.flow +0 -70
- package/dist/components.js.flow +0 -22
- package/dist/definition-context.js.flow +0 -25
- package/dist/dependencies.js.flow +0 -9
- package/dist/error-boundary.js.flow +0 -19
- package/dist/extra-widgets.js.flow +0 -33
- package/dist/hint-renderer.js.flow +0 -32
- package/dist/hints-renderer.js.flow +0 -41
- package/dist/icon-paths.js.flow +0 -123
- package/dist/index.js.flow +0 -134
- package/dist/init.js.flow +0 -20
- package/dist/interaction-tracker.js.flow +0 -35
- package/dist/interactive2/interactive-util.js.flow +0 -50
- package/dist/interactive2/movable-helper-methods.js.flow +0 -15
- package/dist/interactive2/movable-line-options.js.flow +0 -44
- package/dist/interactive2/movable-line.js.flow +0 -8
- package/dist/interactive2/movable-point-options.js.flow +0 -44
- package/dist/interactive2/movable-point.js.flow +0 -8
- package/dist/interactive2/movable-polygon-options.js.flow +0 -47
- package/dist/interactive2/movable-polygon.js.flow +0 -8
- package/dist/interactive2/movable.js.flow +0 -8
- package/dist/interactive2/objective_.js.flow +0 -25
- package/dist/interactive2/types.js.flow +0 -8
- package/dist/interactive2/wrapped-defaults.js.flow +0 -11
- package/dist/interactive2/wrapped-ellipse.js.flow +0 -14
- package/dist/interactive2/wrapped-line.js.flow +0 -14
- package/dist/interactive2/wrapped-path.js.flow +0 -13
- package/dist/interactive2.js.flow +0 -16
- package/dist/item-renderer.js.flow +0 -132
- package/dist/item-version.js.flow +0 -11
- package/dist/jipt-paragraphs.js.flow +0 -14
- package/dist/loading-context.js.flow +0 -12
- package/dist/logging/log.js.flow +0 -62
- package/dist/mixins/changeable.js.flow +0 -33
- package/dist/mixins/editor-jsonify.js.flow +0 -10
- package/dist/mixins/provide-keypad.js.flow +0 -33
- package/dist/mixins/widget-jsonify-deprecated.js.flow +0 -11
- package/dist/mixins/widget-prop-denylist.js.flow +0 -20
- package/dist/multi-items/item-types.js.flow +0 -55
- package/dist/multi-items/items.js.flow +0 -66
- package/dist/multi-items/multi-renderer.js.flow +0 -213
- package/dist/multi-items/prop-type-builders.js.flow +0 -22
- package/dist/multi-items/shape-types.js.flow +0 -60
- package/dist/multi-items/shapes.js.flow +0 -25
- package/dist/multi-items/tree-types.js.flow +0 -45
- package/dist/multi-items/trees.js.flow +0 -147
- package/dist/multi-items.js.flow +0 -36
- package/dist/perseus-api.js.flow +0 -151
- package/dist/perseus-env.js.flow +0 -6
- package/dist/perseus-error.js.flow +0 -16
- package/dist/perseus-markdown.js.flow +0 -20
- package/dist/perseus-types.js.flow +0 -1041
- package/dist/question-paragraph.js.flow +0 -17
- package/dist/renderability.js.flow +0 -19
- package/dist/renderer.js.flow +0 -325
- package/dist/server-item-renderer.js.flow +0 -132
- package/dist/sigfigs.js.flow +0 -41
- package/dist/styles/constants.js.flow +0 -62
- package/dist/styles/global-constants.js.flow +0 -348
- package/dist/styles/global-styles.js.flow +0 -53
- package/dist/styles/media-queries.js.flow +0 -35
- package/dist/styles/shared.js.flow +0 -8
- package/dist/tex-wrangler.js.flow +0 -13
- package/dist/translation-linter.js.flow +0 -32
- package/dist/traversal.js.flow +0 -26
- package/dist/types.js.flow +0 -318
- package/dist/util/a11y.js.flow +0 -8
- package/dist/util/answer-types.js.flow +0 -49
- package/dist/util/colors.js.flow +0 -95
- package/dist/util/fix-passage-refs.js.flow +0 -8
- package/dist/util/geometry.js.flow +0 -37
- package/dist/util/graph-utils.js.flow +0 -9
- package/dist/util/graphie.js.flow +0 -8
- package/dist/util/interactive.js.flow +0 -11
- package/dist/util/katex-preprocess.js.flow +0 -12
- package/dist/util/math.js.flow +0 -62
- package/dist/util/mobile-native-utils.js.flow +0 -12
- package/dist/util/react-render.js.flow +0 -12
- package/dist/util/register-all-widgets-for-testing.js.flow +0 -7
- package/dist/util/scroll-utils.js.flow +0 -19
- package/dist/util/sizing-utils.js.flow +0 -20
- package/dist/util/tex.js.flow +0 -17
- package/dist/util/url-utils.js.flow +0 -11
- package/dist/util.graphie.js.flow +0 -14
- package/dist/util.js.flow +0 -319
- package/dist/version.js.flow +0 -17
- package/dist/widget-container.js.flow +0 -33
- package/dist/widgets/categorizer.js.flow +0 -70
- package/dist/widgets/cs-program.js.flow +0 -54
- package/dist/widgets/definition.js.flow +0 -57
- package/dist/widgets/dropdown.js.flow +0 -63
- package/dist/widgets/explanation.js.flow +0 -58
- package/dist/widgets/expression.js.flow +0 -116
- package/dist/widgets/graded-group-answer-bar.js.flow +0 -24
- package/dist/widgets/graded-group-set.js.flow +0 -65
- package/dist/widgets/graded-group.js.flow +0 -78
- package/dist/widgets/grapher/util.js.flow +0 -38
- package/dist/widgets/grapher.js.flow +0 -102
- package/dist/widgets/group.js.flow +0 -60
- package/dist/widgets/iframe.js.flow +0 -53
- package/dist/widgets/image.js.flow +0 -73
- package/dist/widgets/input-number.js.flow +0 -94
- package/dist/widgets/interaction/arrow-picker.js.flow +0 -21
- package/dist/widgets/interaction/color-picker.js.flow +0 -23
- package/dist/widgets/interaction/dash-picker.js.flow +0 -21
- package/dist/widgets/interaction/element-container.js.flow +0 -28
- package/dist/widgets/interaction.js.flow +0 -60
- package/dist/widgets/interactive-graph.js.flow +0 -239
- package/dist/widgets/label-image/answer-choices.js.flow +0 -55
- package/dist/widgets/label-image/marker.js.flow +0 -31
- package/dist/widgets/label-image/types.js.flow +0 -23
- package/dist/widgets/label-image.js.flow +0 -142
- package/dist/widgets/lights-puzzle.js.flow +0 -58
- package/dist/widgets/matcher.js.flow +0 -106
- package/dist/widgets/matrix.js.flow +0 -80
- package/dist/widgets/measurer.js.flow +0 -30
- package/dist/widgets/molecule/molecule-drawing.js.flow +0 -11
- package/dist/widgets/molecule/molecule-layout.js.flow +0 -96
- package/dist/widgets/molecule/smiles-parser.js.flow +0 -26
- package/dist/widgets/molecule.js.flow +0 -60
- package/dist/widgets/number-line.js.flow +0 -102
- package/dist/widgets/numeric-input.js.flow +0 -105
- package/dist/widgets/orderer.js.flow +0 -81
- package/dist/widgets/passage/passage-markdown.js.flow +0 -33
- package/dist/widgets/passage-ref-target.js.flow +0 -52
- package/dist/widgets/passage-ref.js.flow +0 -85
- package/dist/widgets/passage.js.flow +0 -157
- package/dist/widgets/plotter.js.flow +0 -112
- package/dist/widgets/radio/base-radio.js.flow +0 -50
- package/dist/widgets/radio/choice-a11y-text.js.flow +0 -14
- package/dist/widgets/radio/choice-icon/choice-icon.js.flow +0 -22
- package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +0 -16
- package/dist/widgets/radio/choice-icon/shared-styles.js.flow +0 -11
- package/dist/widgets/radio/choice-none-above.js.flow +0 -16
- package/dist/widgets/radio/choice.js.flow +0 -29
- package/dist/widgets/radio/choice.jsx.fixture.js.flow +0 -7
- package/dist/widgets/radio/focus-ring.js.flow +0 -22
- package/dist/widgets/radio/option-status.js.flow +0 -16
- package/dist/widgets/radio/util.js.flow +0 -12
- package/dist/widgets/radio/widget.js.flow +0 -80
- package/dist/widgets/radio.js.flow +0 -31
- package/dist/widgets/reaction-diagram.js.flow +0 -46
- package/dist/widgets/sequence.js.flow +0 -53
- package/dist/widgets/simulator.js.flow +0 -107
- package/dist/widgets/sorter.js.flow +0 -102
- package/dist/widgets/table.js.flow +0 -67
- package/dist/widgets/transformer.js.flow +0 -127
- package/dist/widgets/unit.js.flow +0 -93
- package/dist/widgets/video-transcript-link.js.flow +0 -15
- package/dist/widgets/video.js.flow +0 -57
- package/dist/widgets.js.flow +0 -108
- package/dist/zoom.js.flow +0 -7
- package/src/multi-items/item-types.js.flow +0 -55
package/src/item-renderer.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import * as React from "react";
|
|
|
6
6
|
import * as ReactDOM from "react-dom";
|
|
7
7
|
import _ from "underscore";
|
|
8
8
|
|
|
9
|
+
import {DependenciesContext} from "./dependencies";
|
|
9
10
|
import HintsRenderer from "./hints-renderer";
|
|
10
11
|
import Objective from "./interactive2/objective_";
|
|
11
12
|
import ProvideKeypad from "./mixins/provide-keypad";
|
|
@@ -16,7 +17,12 @@ import reactRender from "./util/react-render";
|
|
|
16
17
|
|
|
17
18
|
import type {KeypadProps} from "./mixins/provide-keypad";
|
|
18
19
|
import type {PerseusItem} from "./perseus-types";
|
|
19
|
-
import type {
|
|
20
|
+
import type {
|
|
21
|
+
APIOptions,
|
|
22
|
+
FocusPath,
|
|
23
|
+
LinterContextProps,
|
|
24
|
+
PerseusDependenciesV2,
|
|
25
|
+
} from "./types";
|
|
20
26
|
import type {KEScore} from "@khanacademy/perseus-core";
|
|
21
27
|
|
|
22
28
|
const {mapObject} = Objective;
|
|
@@ -46,6 +52,8 @@ type Props = // These props are used by the ProvideKeypad mixin.
|
|
|
46
52
|
savedState: any;
|
|
47
53
|
linterContext: LinterContextProps;
|
|
48
54
|
legacyPerseusLint?: ReadonlyArray<string>;
|
|
55
|
+
|
|
56
|
+
dependencies: PerseusDependenciesV2;
|
|
49
57
|
};
|
|
50
58
|
|
|
51
59
|
type DefaultProps = {
|
|
@@ -73,7 +81,7 @@ type SerializedState = {
|
|
|
73
81
|
};
|
|
74
82
|
|
|
75
83
|
class ItemRenderer extends React.Component<Props, State> {
|
|
76
|
-
// @ts-expect-error
|
|
84
|
+
// @ts-expect-error - TS2564 - Property 'questionRenderer' has no initializer and is not definitely assigned in the constructor.
|
|
77
85
|
questionRenderer: Renderer;
|
|
78
86
|
hintsRenderer: React.ElementRef<typeof HintsRenderer> | null | undefined;
|
|
79
87
|
_currentFocus: FocusPath;
|
|
@@ -176,54 +184,60 @@ class ItemRenderer extends React.Component<Props, State> {
|
|
|
176
184
|
// strangeness instead of relying on React's normal render() method.
|
|
177
185
|
// TODO(alpert): Figure out how to clean this up somehow
|
|
178
186
|
reactRender(
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
this.props.
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
187
|
+
<DependenciesContext.Provider value={this.props.dependencies}>
|
|
188
|
+
<Renderer
|
|
189
|
+
ref={(node) => {
|
|
190
|
+
if (!node) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
this.questionRenderer = node;
|
|
194
|
+
|
|
195
|
+
// NOTE(jeremy): Why don't we just pass this into the
|
|
196
|
+
// renderer as a prop?
|
|
197
|
+
const {answerableCallback} = apiOptions;
|
|
198
|
+
if (answerableCallback) {
|
|
199
|
+
const isAnswerable =
|
|
200
|
+
this.questionRenderer.emptyWidgets().length ===
|
|
201
|
+
0;
|
|
202
|
+
answerableCallback(isAnswerable);
|
|
203
|
+
}
|
|
204
|
+
}}
|
|
205
|
+
keypadElement={this.keypadElement()}
|
|
206
|
+
problemNum={this.props.problemNum}
|
|
207
|
+
onInteractWithWidget={this.handleInteractWithWidget}
|
|
208
|
+
highlightedWidgets={this.state.questionHighlightedWidgets}
|
|
209
|
+
apiOptions={apiOptions}
|
|
210
|
+
questionCompleted={this.state.questionCompleted}
|
|
211
|
+
reviewMode={this.props.reviewMode}
|
|
212
|
+
savedState={this.props.savedState}
|
|
213
|
+
linterContext={PerseusLinter.pushContextStack(
|
|
214
|
+
this.props.linterContext,
|
|
215
|
+
"question",
|
|
216
|
+
)}
|
|
217
|
+
{...this.props.item.question}
|
|
218
|
+
legacyPerseusLint={this.props.legacyPerseusLint}
|
|
219
|
+
/>
|
|
220
|
+
</DependenciesContext.Provider>,
|
|
221
|
+
// @ts-expect-error - TS2345 - Argument of type 'Element' is not assignable to parameter of type 'HTMLElement'.
|
|
211
222
|
workArea,
|
|
212
223
|
);
|
|
213
224
|
|
|
214
225
|
reactRender(
|
|
215
|
-
<
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
226
|
+
<DependenciesContext.Provider value={this.props.dependencies}>
|
|
227
|
+
<HintsRenderer
|
|
228
|
+
ref={(node) => (this.hintsRenderer = node)}
|
|
229
|
+
hints={this.props.item.hints}
|
|
230
|
+
hintsVisible={this.state.hintsVisible}
|
|
231
|
+
// @ts-expect-error - TS2769 - No overload matches this call.
|
|
232
|
+
apiOptions={apiOptions}
|
|
233
|
+
linterContext={PerseusLinter.pushContextStack(
|
|
234
|
+
this.props.linterContext,
|
|
235
|
+
"hints",
|
|
236
|
+
)}
|
|
237
|
+
/>
|
|
238
|
+
</DependenciesContext.Provider>,
|
|
239
|
+
|
|
240
|
+
// @ts-expect-error - TS2345 - Argument of type 'Element' is not assignable to parameter of type 'HTMLElement'.
|
|
227
241
|
hintsArea,
|
|
228
242
|
);
|
|
229
243
|
|
|
@@ -460,7 +474,7 @@ class ItemRenderer extends React.Component<Props, State> {
|
|
|
460
474
|
const qScore = this.questionRenderer.scoreWidgets();
|
|
461
475
|
const qGuess = this.questionRenderer.getUserInputForWidgets();
|
|
462
476
|
const state = this.questionRenderer.getSerializedState();
|
|
463
|
-
// @ts-expect-error
|
|
477
|
+
// @ts-expect-error - TS2322 - Type 'Partial<Record<string, KEScore>>' is not assignable to type '{ [id: string]: KEScore; }'. | TS2345 - Argument of type '{ [widgetId: string]: PerseusScore; }' is not assignable to parameter of type 'Partial<Record<string, { type: "invalid"; message?: string | null | undefined; suppressAlmostThere?: boolean | null | undefined; }>>'.
|
|
464
478
|
return mapObject(qScore, (score, id) => {
|
|
465
479
|
return Util.keScoreFromPerseusScore(score, qGuess[id], state[id]);
|
|
466
480
|
});
|
|
@@ -504,7 +518,11 @@ class ItemRenderer extends React.Component<Props, State> {
|
|
|
504
518
|
}
|
|
505
519
|
|
|
506
520
|
render(): React.ReactNode {
|
|
507
|
-
return
|
|
521
|
+
return (
|
|
522
|
+
<DependenciesContext.Provider value={this.props.dependencies}>
|
|
523
|
+
<div />
|
|
524
|
+
</DependenciesContext.Provider>
|
|
525
|
+
);
|
|
508
526
|
}
|
|
509
527
|
}
|
|
510
528
|
|
package/src/mixins/changeable.ts
CHANGED
|
@@ -92,7 +92,7 @@ export const change: ChangeFn = function (
|
|
|
92
92
|
// Called with an object of multiple props to change
|
|
93
93
|
callback = propValue;
|
|
94
94
|
return _changeMultiple(
|
|
95
|
-
// @ts-expect-error
|
|
95
|
+
// @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
96
96
|
this,
|
|
97
97
|
newPropsOrSinglePropName, // object newProps
|
|
98
98
|
callback,
|
|
@@ -101,7 +101,7 @@ export const change: ChangeFn = function (
|
|
|
101
101
|
if (typeof newPropsOrSinglePropName === "string") {
|
|
102
102
|
// Called with a string propName of a single prop to change
|
|
103
103
|
return _changeSingle(
|
|
104
|
-
// @ts-expect-error
|
|
104
|
+
// @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
105
105
|
this,
|
|
106
106
|
newPropsOrSinglePropName, // string propName
|
|
107
107
|
propValue,
|
|
@@ -5,7 +5,7 @@ import WIDGET_PROP_DENYLIST from "./widget-prop-denylist";
|
|
|
5
5
|
const EditorJsonify = {
|
|
6
6
|
serialize: function (): any {
|
|
7
7
|
// Omit props that get passed to all widgets
|
|
8
|
-
// @ts-expect-error
|
|
8
|
+
// @ts-expect-error - TS2339 - Property 'props' does not exist on type '{ readonly serialize: () => any; }'.
|
|
9
9
|
return _.omit(this.props, WIDGET_PROP_DENYLIST);
|
|
10
10
|
},
|
|
11
11
|
} as const;
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import {MobileKeypad} from "@khanacademy/math-input";
|
|
15
|
-
import PropTypes from "prop-types";
|
|
16
15
|
import * as React from "react";
|
|
17
16
|
import ReactDOM from "react-dom";
|
|
18
17
|
|
|
19
18
|
import reactRender from "../util/react-render";
|
|
20
19
|
|
|
21
20
|
import type {APIOptions} from "../types";
|
|
21
|
+
import type {KeypadAPI} from "@khanacademy/math-input";
|
|
22
22
|
import type {CSSProperties} from "aphrodite";
|
|
23
23
|
|
|
24
24
|
export type KeypadProps = {
|
|
@@ -34,48 +34,44 @@ export type KeypadApiOptions = {
|
|
|
34
34
|
nativeKeypadProxy: any;
|
|
35
35
|
};
|
|
36
36
|
|
|
37
|
+
// This represents the shape of any component that uses this ProvideKeypad
|
|
38
|
+
// mixin.
|
|
39
|
+
type KeypadMixinHostComponent = {
|
|
40
|
+
_keypadContainer?: HTMLDivElement | null;
|
|
41
|
+
props: {
|
|
42
|
+
apiOptions: APIOptions;
|
|
43
|
+
blur?: () => void;
|
|
44
|
+
};
|
|
45
|
+
state: {
|
|
46
|
+
keypadElement: any | null;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
37
50
|
// NOTE: This is not a real component. It's a collection of methods used to
|
|
38
51
|
// create and manage a Keypad instances.
|
|
39
52
|
// TODO(LP-10789): replace this with a React Context object to pass information
|
|
40
53
|
// between Perseus and the Keypad.
|
|
41
54
|
const ProvideKeypad = {
|
|
42
|
-
|
|
43
|
-
apiOptions: PropTypes.shape({
|
|
44
|
-
customKeypad: PropTypes.bool,
|
|
45
|
-
nativeKeypadProxy: PropTypes.func,
|
|
46
|
-
}),
|
|
47
|
-
// An Aphrodite style object, to be applied to the keypad container.
|
|
48
|
-
// Note that, given our awkward structure of injecting the keypad, this
|
|
49
|
-
// style won't be applied or updated dynamically. Rather, it will only
|
|
50
|
-
// be applied in `componentDidMount`.
|
|
51
|
-
keypadStyle: PropTypes.any,
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
getInitialState(): {
|
|
55
|
+
getInitialState(this: KeypadMixinHostComponent): {
|
|
55
56
|
keypadElement: any | null;
|
|
56
57
|
} {
|
|
57
58
|
const _this = this;
|
|
58
|
-
let keypadElement = null;
|
|
59
|
+
let keypadElement: KeypadAPI | null = null;
|
|
59
60
|
if (
|
|
60
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
61
61
|
_this.props.apiOptions &&
|
|
62
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
63
62
|
_this.props.apiOptions.customKeypad &&
|
|
64
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
65
63
|
_this.props.apiOptions.nativeKeypadProxy
|
|
66
64
|
) {
|
|
67
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
68
65
|
keypadElement = _this.props.apiOptions.nativeKeypadProxy(
|
|
69
|
-
// @ts-expect-error
|
|
66
|
+
// @ts-expect-error - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
70
67
|
() => _this.blur && _this.blur(),
|
|
71
68
|
);
|
|
72
69
|
}
|
|
73
70
|
return {keypadElement};
|
|
74
71
|
},
|
|
75
72
|
|
|
76
|
-
componentDidMount() {
|
|
73
|
+
componentDidMount(this: KeypadMixinHostComponent) {
|
|
77
74
|
const _this = this;
|
|
78
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
79
75
|
const apiOptions: APIOptions = _this.props.apiOptions;
|
|
80
76
|
|
|
81
77
|
if (
|
|
@@ -86,9 +82,7 @@ const ProvideKeypad = {
|
|
|
86
82
|
// TODO(charlie): Render this and the wrapped component in the same
|
|
87
83
|
// React tree. We may also want to add this keypad asynchronously
|
|
88
84
|
// or on-demand in the future.
|
|
89
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
90
85
|
_this._keypadContainer = document.createElement("div");
|
|
91
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
92
86
|
document.body?.appendChild(_this._keypadContainer);
|
|
93
87
|
|
|
94
88
|
reactRender(
|
|
@@ -97,49 +91,41 @@ const ProvideKeypad = {
|
|
|
97
91
|
// NOTE(kevinb): The reason why this setState works is
|
|
98
92
|
// b/c we're calling it manually from item-renderer.jsx
|
|
99
93
|
// and we're manually setting the 'this' by using 'call'
|
|
100
|
-
// @ts-expect-error
|
|
94
|
+
// @ts-expect-error - TS2339 - Property 'setState' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
101
95
|
_this.setState({
|
|
102
96
|
keypadElement: element,
|
|
103
97
|
});
|
|
104
98
|
}}
|
|
105
99
|
onDismiss={() => {
|
|
106
|
-
// @ts-expect-error
|
|
100
|
+
// @ts-expect-error - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
107
101
|
_this.blur && _this.blur();
|
|
108
102
|
}}
|
|
109
|
-
// @ts-expect-error
|
|
103
|
+
// @ts-expect-error - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
110
104
|
style={_this.props.keypadStyle}
|
|
111
105
|
useV2Keypad={apiOptions.useV2Keypad}
|
|
112
106
|
/>,
|
|
113
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
114
107
|
_this._keypadContainer,
|
|
115
108
|
);
|
|
116
109
|
}
|
|
117
110
|
},
|
|
118
111
|
|
|
119
|
-
componentWillUnmount() {
|
|
112
|
+
componentWillUnmount(this: KeypadMixinHostComponent) {
|
|
120
113
|
const _this = this;
|
|
121
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
122
114
|
if (_this._keypadContainer) {
|
|
123
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
124
115
|
ReactDOM.unmountComponentAtNode(_this._keypadContainer);
|
|
125
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
126
116
|
if (_this._keypadContainer.parentNode) {
|
|
127
117
|
// Note ChildNode.remove() isn't available in older Android
|
|
128
118
|
// webviews.
|
|
129
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
130
119
|
_this._keypadContainer.parentNode.removeChild(
|
|
131
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
132
120
|
_this._keypadContainer,
|
|
133
121
|
);
|
|
134
122
|
}
|
|
135
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
136
123
|
_this._keypadContainer = null;
|
|
137
124
|
}
|
|
138
125
|
},
|
|
139
126
|
|
|
140
|
-
keypadElement(): any {
|
|
127
|
+
keypadElement(this: KeypadMixinHostComponent): any {
|
|
141
128
|
const _this = this;
|
|
142
|
-
// @ts-expect-error [FEI-5003] - TS2339 - Property 'state' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
|
|
143
129
|
return _this.state.keypadElement;
|
|
144
130
|
},
|
|
145
131
|
} as const;
|
|
@@ -9,7 +9,7 @@ import WIDGET_PROP_DENYLIST from "./widget-prop-denylist";
|
|
|
9
9
|
const WidgetJsonifyDeprecated = {
|
|
10
10
|
getUserInput: function (): any {
|
|
11
11
|
// Omit props that get passed to all widgets
|
|
12
|
-
// @ts-expect-error
|
|
12
|
+
// @ts-expect-error - TS2339 - Property 'props' does not exist on type '{ readonly getUserInput: () => any; readonly getUserInputFromProps: (props: any) => any; }'.
|
|
13
13
|
return _.omit(this.props, WIDGET_PROP_DENYLIST);
|
|
14
14
|
},
|
|
15
15
|
|
|
@@ -217,7 +217,7 @@ const item: Item = treeToItem({
|
|
|
217
217
|
describe("findContentNodesInItem", () => {
|
|
218
218
|
it("calls the callback for each content node in the item", () => {
|
|
219
219
|
const contents = [];
|
|
220
|
-
// @ts-expect-error
|
|
220
|
+
// @ts-expect-error - TS2345 - Argument of type 'ContentNode' is not assignable to parameter of type 'never'.
|
|
221
221
|
findContentNodesInItem(item, shape, (c) => contents.push(c));
|
|
222
222
|
contents.sort();
|
|
223
223
|
expect([
|
|
@@ -4,7 +4,10 @@ import userEvent from "@testing-library/user-event";
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import "@testing-library/jest-dom"; // Imports custom mathers
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
testDependencies,
|
|
9
|
+
testDependenciesV2,
|
|
10
|
+
} from "../../../../../testing/test-dependencies";
|
|
8
11
|
import MockWidgetExport from "../../__tests__/mock-widget";
|
|
9
12
|
import * as Dependencies from "../../dependencies";
|
|
10
13
|
import {registerAllWidgetsForTesting} from "../../util/register-all-widgets-for-testing";
|
|
@@ -50,6 +53,7 @@ const renderSimpleQuestion = (question: Item) => {
|
|
|
50
53
|
item={question}
|
|
51
54
|
shape={simpleQuestionShape}
|
|
52
55
|
ref={(r) => (renderer = r)}
|
|
56
|
+
dependencies={testDependenciesV2}
|
|
53
57
|
>
|
|
54
58
|
{({renderers}) => <SimpleLayout renderers={renderers} />}
|
|
55
59
|
</MultiRenderer>
|
|
@@ -69,7 +73,7 @@ const renderSimpleQuestion = (question: Item) => {
|
|
|
69
73
|
const _findWidgets = (
|
|
70
74
|
renderer: MultiRenderer,
|
|
71
75
|
filterCriterion: FilterCriterion,
|
|
72
|
-
// @ts-expect-error
|
|
76
|
+
// @ts-expect-error - TS2315 - Type 'Tree' is not generic.
|
|
73
77
|
): Tree<
|
|
74
78
|
ReadonlyArray<Widget | null | undefined>,
|
|
75
79
|
ReadonlyArray<Widget | null | undefined>,
|
|
@@ -119,6 +123,7 @@ describe("multi-item renderer", () => {
|
|
|
119
123
|
<MultiRenderer
|
|
120
124
|
item={question1}
|
|
121
125
|
shape={shapes.shape({broken: shapes.content})}
|
|
126
|
+
dependencies={testDependenciesV2}
|
|
122
127
|
>
|
|
123
128
|
{({renderers}) => {
|
|
124
129
|
return <div />;
|
|
@@ -144,7 +149,7 @@ describe("multi-item renderer", () => {
|
|
|
144
149
|
userEvent.paste(screen.getByRole("textbox"), "+42"); // Correct
|
|
145
150
|
|
|
146
151
|
// Act
|
|
147
|
-
// @ts-expect-error
|
|
152
|
+
// @ts-expect-error - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
|
|
148
153
|
const state = renderer._getSerializedState(null);
|
|
149
154
|
|
|
150
155
|
// Assert
|
|
@@ -277,7 +282,7 @@ describe("multi-item renderer", () => {
|
|
|
277
282
|
userEvent.paste(screen.getByRole("textbox"), "99");
|
|
278
283
|
|
|
279
284
|
// Act
|
|
280
|
-
// @ts-expect-error
|
|
285
|
+
// @ts-expect-error - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
|
|
281
286
|
const state = renderer._getSerializedState({
|
|
282
287
|
blurb: "last blurb",
|
|
283
288
|
hints: ["uno", "dos" /* intentionally not passing a third */],
|
|
@@ -528,7 +533,7 @@ describe("multi-item renderer", () => {
|
|
|
528
533
|
} as const;
|
|
529
534
|
|
|
530
535
|
// Act
|
|
531
|
-
// @ts-expect-error
|
|
536
|
+
// @ts-expect-error - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
|
|
532
537
|
renderer.restoreSerializedState(state);
|
|
533
538
|
|
|
534
539
|
// Assert
|
|
@@ -546,7 +551,7 @@ describe("multi-item renderer", () => {
|
|
|
546
551
|
const callback = jest.fn();
|
|
547
552
|
|
|
548
553
|
// Act
|
|
549
|
-
// @ts-expect-error
|
|
554
|
+
// @ts-expect-error - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
|
|
550
555
|
renderer.restoreSerializedState(
|
|
551
556
|
{
|
|
552
557
|
blurb: {"mock-widget 1": 1},
|
|
@@ -594,7 +599,7 @@ describe("multi-item renderer", () => {
|
|
|
594
599
|
userEvent.paste(screen.getByRole("textbox"), "-42"); // Correct
|
|
595
600
|
|
|
596
601
|
// Act
|
|
597
|
-
// @ts-expect-error
|
|
602
|
+
// @ts-expect-error - TS2339 - Property 'getScores' does not exist on type 'never'.
|
|
598
603
|
const score = renderer.getScores();
|
|
599
604
|
|
|
600
605
|
// Assert
|
|
@@ -756,7 +761,7 @@ describe("multi-item renderer", () => {
|
|
|
756
761
|
userEvent.paste(screen.getByRole("textbox"), "-42"); // Correct
|
|
757
762
|
|
|
758
763
|
// Act
|
|
759
|
-
// @ts-expect-error
|
|
764
|
+
// @ts-expect-error - TS2339 - Property 'score' does not exist on type 'never'.
|
|
760
765
|
const score = renderer.score();
|
|
761
766
|
|
|
762
767
|
// Assert
|
|
@@ -66,7 +66,7 @@ describe("buildMapper", () => {
|
|
|
66
66
|
it("calls the content mapper for each of the content nodes", () => {
|
|
67
67
|
const calledWith = [];
|
|
68
68
|
buildMapper()
|
|
69
|
-
// @ts-expect-error
|
|
69
|
+
// @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
|
|
70
70
|
.setContentMapper((c) => calledWith.push(c))
|
|
71
71
|
.mapTree(tree, shape);
|
|
72
72
|
calledWith.sort();
|
|
@@ -83,7 +83,7 @@ describe("buildMapper", () => {
|
|
|
83
83
|
it("calls the hint mapper for each of the hint nodes", () => {
|
|
84
84
|
const calledWith = [];
|
|
85
85
|
buildMapper()
|
|
86
|
-
// @ts-expect-error
|
|
86
|
+
// @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
|
|
87
87
|
.setHintMapper((h) => calledWith.push(h))
|
|
88
88
|
.mapTree(tree, shape);
|
|
89
89
|
calledWith.sort();
|
|
@@ -110,9 +110,9 @@ describe("buildMapper", () => {
|
|
|
110
110
|
TagsNode,
|
|
111
111
|
string
|
|
112
112
|
> = buildMapper()
|
|
113
|
-
// @ts-expect-error
|
|
113
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
114
114
|
.setContentMapper((c) => `mapped content: ${c.content || "<none>"}`)
|
|
115
|
-
// @ts-expect-error
|
|
115
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
116
116
|
.setHintMapper((h) => `mapped hint: ${h.content || "<none>"}`)
|
|
117
117
|
.setTagsMapper((t) => `mapped tags: ${t.join(", ")}`);
|
|
118
118
|
const result = mapper.mapTree(tree, shape);
|
|
@@ -188,7 +188,7 @@ describe("buildMapper", () => {
|
|
|
188
188
|
|
|
189
189
|
const tree = {a: {b: {c: content(1)}}} as const;
|
|
190
190
|
|
|
191
|
-
// @ts-expect-error
|
|
191
|
+
// @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
|
|
192
192
|
const mapper: TreeMapper<
|
|
193
193
|
ContentNode,
|
|
194
194
|
string | null | undefined,
|
|
@@ -212,7 +212,7 @@ describe("buildMapper", () => {
|
|
|
212
212
|
array(array(content(2)), array(content(3), content(4))),
|
|
213
213
|
);
|
|
214
214
|
|
|
215
|
-
// @ts-expect-error
|
|
215
|
+
// @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
|
|
216
216
|
const mapper: TreeMapper<
|
|
217
217
|
ContentNode,
|
|
218
218
|
string | null | undefined,
|
|
@@ -234,7 +234,7 @@ describe("buildMapper", () => {
|
|
|
234
234
|
|
|
235
235
|
const tree = array(array(), array(content(1)), array());
|
|
236
236
|
|
|
237
|
-
// @ts-expect-error
|
|
237
|
+
// @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
|
|
238
238
|
const mapper: TreeMapper<
|
|
239
239
|
ContentNode,
|
|
240
240
|
string | null | undefined,
|
|
@@ -258,7 +258,7 @@ describe("buildMapper", () => {
|
|
|
258
258
|
|
|
259
259
|
let wasCalled = false;
|
|
260
260
|
let callArgs: Record<string, any> = {};
|
|
261
|
-
// @ts-expect-error
|
|
261
|
+
// @ts-expect-error - TS2322 - Type 'TreeMapperForLeavesAndCollections<unknown, any, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
|
|
262
262
|
const mapper: TreeMapper<
|
|
263
263
|
ContentNode,
|
|
264
264
|
string | null | undefined,
|
|
@@ -267,7 +267,7 @@ describe("buildMapper", () => {
|
|
|
267
267
|
TagsNode,
|
|
268
268
|
TagsNode
|
|
269
269
|
> = buildMapper()
|
|
270
|
-
// @ts-expect-error
|
|
270
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
271
271
|
.setContentMapper((c) => c.content)
|
|
272
272
|
.setArrayMapper((mappedArray, originalArray, shape, path) => {
|
|
273
273
|
wasCalled = true;
|
|
@@ -288,11 +288,11 @@ describe("buildMapper", () => {
|
|
|
288
288
|
|
|
289
289
|
it("uses the array mapper return value to construct the new tree", () => {
|
|
290
290
|
const mapper = buildMapper()
|
|
291
|
-
// @ts-expect-error
|
|
291
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
292
292
|
.setContentMapper((c) => c.content)
|
|
293
|
-
// @ts-expect-error
|
|
293
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
294
294
|
.setHintMapper((h) => h.content)
|
|
295
|
-
// @ts-expect-error
|
|
295
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
296
296
|
.setTagsMapper((t) => t.join(", "))
|
|
297
297
|
.setArrayMapper((mappedArray, originalArray, shape, path) => {
|
|
298
298
|
return mappedArray.map((child) => `${String(child)} in array`);
|
|
@@ -37,10 +37,10 @@ export type HintNode = {
|
|
|
37
37
|
};
|
|
38
38
|
export type TagsNode = ReadonlyArray<string>;
|
|
39
39
|
|
|
40
|
-
// @ts-expect-error
|
|
40
|
+
// @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
|
|
41
41
|
export type ItemArrayNode = ArrayNode<ContentNode, HintNode, TagsNode>;
|
|
42
42
|
export type ItemObjectNode = ObjectNode<ContentNode, HintNode, TagsNode>;
|
|
43
|
-
// @ts-expect-error
|
|
43
|
+
// @ts-expect-error - TS2315 - Type 'Tree' is not generic.
|
|
44
44
|
export type ItemTree = Tree<ContentNode, HintNode, TagsNode>;
|
|
45
45
|
|
|
46
46
|
// TODO(jeremy): I think we could refine this root type for multi items. Right
|
package/src/multi-items/items.ts
CHANGED
|
@@ -66,7 +66,7 @@ export function buildEmptyItemTreeForShape(shape: Shape): ItemTree {
|
|
|
66
66
|
return object;
|
|
67
67
|
}
|
|
68
68
|
throw new PerseusError(
|
|
69
|
-
// @ts-expect-error
|
|
69
|
+
// @ts-expect-error - TS2339 - Property 'type' does not exist on type 'never'.
|
|
70
70
|
`unexpected shape type ${shape.type}`,
|
|
71
71
|
Errors.InvalidInput,
|
|
72
72
|
);
|