@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/renderer.tsx
CHANGED
|
@@ -66,7 +66,7 @@ const isIdPathPrefix = function (
|
|
|
66
66
|
return prefixArray === wholeArray;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
// @ts-expect-error
|
|
69
|
+
// @ts-expect-error - TS2345 - Argument of type 'readonly string[] | undefined' is not assignable to parameter of type 'Collection<any>'.
|
|
70
70
|
return _.every(prefixArray, (elem: string, i: number) => {
|
|
71
71
|
if (wholeArray != null) {
|
|
72
72
|
return _.isEqual(elem, wholeArray[i]);
|
|
@@ -209,26 +209,26 @@ type DefaultProps = {
|
|
|
209
209
|
|
|
210
210
|
class Renderer extends React.Component<Props, State> {
|
|
211
211
|
_currentFocus: FocusPath | null | undefined;
|
|
212
|
-
// @ts-expect-error
|
|
212
|
+
// @ts-expect-error - TS2564 - Property '_foundTextNodes' has no initializer and is not definitely assigned in the constructor.
|
|
213
213
|
_foundTextNodes: boolean;
|
|
214
|
-
// @ts-expect-error
|
|
214
|
+
// @ts-expect-error - TS2564 - Property '_interactionTrackers' has no initializer and is not definitely assigned in the constructor.
|
|
215
215
|
_interactionTrackers: {
|
|
216
|
-
[id: string]: InteractionTracker
|
|
216
|
+
[id: string]: InteractionTracker<any>;
|
|
217
217
|
};
|
|
218
|
-
// @ts-expect-error
|
|
218
|
+
// @ts-expect-error - TS2564 - Property '_isMounted' has no initializer and is not definitely assigned in the constructor.
|
|
219
219
|
_isMounted: boolean;
|
|
220
|
-
// @ts-expect-error
|
|
220
|
+
// @ts-expect-error - TS2564 - Property '_isTwoColumn' has no initializer and is not definitely assigned in the constructor.
|
|
221
221
|
_isTwoColumn: boolean;
|
|
222
222
|
|
|
223
223
|
// The i18n linter.
|
|
224
224
|
_translationLinter: TranslationLinter;
|
|
225
225
|
|
|
226
226
|
lastRenderedMarkdown: React.ReactNode;
|
|
227
|
-
// @ts-expect-error
|
|
227
|
+
// @ts-expect-error - TS2564 - Property 'reuseMarkdown' has no initializer and is not definitely assigned in the constructor.
|
|
228
228
|
reuseMarkdown: boolean;
|
|
229
|
-
// @ts-expect-error
|
|
229
|
+
// @ts-expect-error - TS2564 - Property 'translationIndex' has no initializer and is not definitely assigned in the constructor.
|
|
230
230
|
translationIndex: number;
|
|
231
|
-
// @ts-expect-error
|
|
231
|
+
// @ts-expect-error - TS2564 - Property 'widgetIds' has no initializer and is not definitely assigned in the constructor.
|
|
232
232
|
widgetIds: Array<string>;
|
|
233
233
|
|
|
234
234
|
static defaultProps: DefaultProps = {
|
|
@@ -275,7 +275,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
275
275
|
this._isMounted = true;
|
|
276
276
|
|
|
277
277
|
// figure out why we're passing an empty object
|
|
278
|
-
// @ts-expect-error
|
|
278
|
+
// @ts-expect-error - TS2345 - Argument of type '{}' is not assignable to parameter of type 'Props'.
|
|
279
279
|
this.handleRender({});
|
|
280
280
|
this._currentFocus = null;
|
|
281
281
|
|
|
@@ -392,7 +392,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
392
392
|
_.each(this.widgetIds, (id) => {
|
|
393
393
|
// eslint-disable-next-line react/no-string-refs
|
|
394
394
|
const container = this.refs["container:" + id];
|
|
395
|
-
// @ts-expect-error
|
|
395
|
+
// @ts-expect-error - TS2339 - Property 'replaceWidgetProps' does not exist on type 'ReactInstance'.
|
|
396
396
|
container && container.replaceWidgetProps(this.getWidgetProps(id));
|
|
397
397
|
});
|
|
398
398
|
|
|
@@ -454,11 +454,11 @@ class Renderer extends React.Component<Props, State> {
|
|
|
454
454
|
};
|
|
455
455
|
};
|
|
456
456
|
|
|
457
|
-
// @ts-expect-error
|
|
457
|
+
// @ts-expect-error - TS2322 - Type '(props: Props) => Partial<Record<string, CategorizerWidget | CSProgramWidget | DefinitionWidget | DropdownWidget | ... 35 more ... | VideoWidget>>' is not assignable to type '(props: Props) => { [key: string]: PerseusWidget; }'.
|
|
458
458
|
_getAllWidgetsInfo: (props: Props) => {
|
|
459
459
|
[key: string]: WidgetInfo;
|
|
460
460
|
} = (props: Props) => {
|
|
461
|
-
// @ts-expect-error
|
|
461
|
+
// @ts-expect-error - TS2345 - Argument of type '{ [key: string]: PerseusWidget; }' is not assignable to parameter of type 'Partial<Record<string, CategorizerWidget>>'.
|
|
462
462
|
return mapObject(props.widgets, (widgetInfo, widgetId) => {
|
|
463
463
|
if (!widgetInfo.type || !widgetInfo.alignment) {
|
|
464
464
|
const newValues: Record<string, any> = {};
|
|
@@ -482,7 +482,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
482
482
|
},
|
|
483
483
|
props: Props,
|
|
484
484
|
) => any = (allWidgetInfo, props) => {
|
|
485
|
-
// @ts-expect-error
|
|
485
|
+
// @ts-expect-error - TS2345 - Argument of type '{ [key: string]: PerseusWidget; }' is not assignable to parameter of type 'Partial<Record<string, CategorizerWidget>>'.
|
|
486
486
|
return mapObject(allWidgetInfo, (widgetInfo) => {
|
|
487
487
|
return Widgets.getRendererPropsForWidgetInfo(
|
|
488
488
|
widgetInfo,
|
|
@@ -541,7 +541,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
541
541
|
if (widgetInfo) {
|
|
542
542
|
const type = (widgetInfo && widgetInfo.type) || impliedType;
|
|
543
543
|
const shouldHighlight = _.contains(
|
|
544
|
-
// @ts-expect-error
|
|
544
|
+
// @ts-expect-error - TS2345 - Argument of type 'readonly any[] | undefined' is not assignable to parameter of type 'Collection<any>'.
|
|
545
545
|
this.props.highlightedWidgets,
|
|
546
546
|
id,
|
|
547
547
|
);
|
|
@@ -590,10 +590,10 @@ class Renderer extends React.Component<Props, State> {
|
|
|
590
590
|
interactionTracker = this._interactionTrackers[id] =
|
|
591
591
|
new InteractionTracker(
|
|
592
592
|
apiOptions.trackInteraction,
|
|
593
|
-
// @ts-expect-error
|
|
593
|
+
// @ts-expect-error - TS2345 - Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
|
|
594
594
|
widgetInfo && widgetInfo.type,
|
|
595
595
|
id,
|
|
596
|
-
// @ts-expect-error
|
|
596
|
+
// @ts-expect-error - TS2345 - Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
|
|
597
597
|
Widgets.getTracking(widgetInfo && widgetInfo.type),
|
|
598
598
|
);
|
|
599
599
|
}
|
|
@@ -858,7 +858,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
858
858
|
if (!ref) {
|
|
859
859
|
return null;
|
|
860
860
|
}
|
|
861
|
-
// @ts-expect-error
|
|
861
|
+
// @ts-expect-error - TS2339 - Property 'getWidget' does not exist on type 'ReactInstance'.
|
|
862
862
|
return ref.getWidget();
|
|
863
863
|
};
|
|
864
864
|
|
|
@@ -885,7 +885,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
885
885
|
|
|
886
886
|
// Failsafe: abort if ID is different, because focus probably happened
|
|
887
887
|
// before blur
|
|
888
|
-
// @ts-expect-error
|
|
888
|
+
// @ts-expect-error - TS2769 - No overload matches this call.
|
|
889
889
|
const fullPath = [id].concat(blurPath);
|
|
890
890
|
if (!_.isEqual(fullPath, blurringFocusPath)) {
|
|
891
891
|
return;
|
|
@@ -978,7 +978,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
978
978
|
|
|
979
979
|
// wrap top-level elements in a QuestionParagraph, mostly
|
|
980
980
|
// for appropriate spacing and other css
|
|
981
|
-
// @ts-expect-error
|
|
981
|
+
// @ts-expect-error - TS2322 - Type '(ast: any, state: WidgetState) => never[] | JSX.Element' is not assignable to type '(ast: any, state: WidgetState) => ReactElement<any, string | JSXElementConstructor<any>>'.
|
|
982
982
|
outputMarkdown: (ast: any, state: WidgetState) => React.ReactElement = (
|
|
983
983
|
ast: any,
|
|
984
984
|
state: WidgetState,
|
|
@@ -1004,10 +1004,10 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1004
1004
|
// now.
|
|
1005
1005
|
/* c8 ignore if */
|
|
1006
1006
|
if (typeof nodeOut === "string" && lastWasString) {
|
|
1007
|
-
// @ts-expect-error
|
|
1007
|
+
// @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'never'.
|
|
1008
1008
|
result[result.length - 1] += nodeOut;
|
|
1009
1009
|
} else {
|
|
1010
|
-
// @ts-expect-error
|
|
1010
|
+
// @ts-expect-error - TS2345 - Argument of type 'ReactElement<any, string | JSXElementConstructor<any>>' is not assignable to parameter of type 'never'.
|
|
1011
1011
|
result.push(nodeOut);
|
|
1012
1012
|
}
|
|
1013
1013
|
lastWasString = isString;
|
|
@@ -1303,7 +1303,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1303
1303
|
{({setAssetStatus}) => (
|
|
1304
1304
|
<SvgImage
|
|
1305
1305
|
setAssetStatus={setAssetStatus}
|
|
1306
|
-
// @ts-expect-error
|
|
1306
|
+
// @ts-expect-error - TS2322 - Type 'string | null | undefined' is not assignable to type 'string | undefined'.
|
|
1307
1307
|
src={PerseusMarkdown.sanitizeUrl(node.target)}
|
|
1308
1308
|
alt={node.alt}
|
|
1309
1309
|
title={node.title}
|
|
@@ -1397,7 +1397,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1397
1397
|
|
|
1398
1398
|
// In the common case of no callback specified, avoid this work.
|
|
1399
1399
|
if (onRender !== noopOnRender || oldOnRender !== noopOnRender) {
|
|
1400
|
-
// @ts-expect-error
|
|
1400
|
+
// @ts-expect-error - TS2769 - No overload matches this call. | TS2339 - Property 'find' does not exist on type 'JQueryStatic'.
|
|
1401
1401
|
const $images = $(ReactDOM.findDOMNode(this)).find("img");
|
|
1402
1402
|
|
|
1403
1403
|
// Fire callback on image load...
|
|
@@ -1490,9 +1490,9 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1490
1490
|
|
|
1491
1491
|
getDOMNodeForPath: (path: FocusPath) => Element | Text | null | undefined =
|
|
1492
1492
|
(path: FocusPath) => {
|
|
1493
|
-
// @ts-expect-error
|
|
1493
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1494
1494
|
const widgetId = _.first(path);
|
|
1495
|
-
// @ts-expect-error
|
|
1495
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1496
1496
|
const interWidgetPath = _.rest(path);
|
|
1497
1497
|
|
|
1498
1498
|
// Widget handles parsing of the interWidgetPath. If the path is empty
|
|
@@ -1504,7 +1504,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1504
1504
|
return getNode(interWidgetPath);
|
|
1505
1505
|
}
|
|
1506
1506
|
if (interWidgetPath.length === 0) {
|
|
1507
|
-
// @ts-expect-error
|
|
1507
|
+
// @ts-expect-error - TS2345 - Argument of type 'Widget | null | undefined' is not assignable to parameter of type 'ReactInstance | null | undefined'.
|
|
1508
1508
|
return ReactDOM.findDOMNode(widget);
|
|
1509
1509
|
}
|
|
1510
1510
|
};
|
|
@@ -1512,9 +1512,9 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1512
1512
|
getGrammarTypeForPath: (path: FocusPath) => string | null | undefined = (
|
|
1513
1513
|
path: FocusPath,
|
|
1514
1514
|
) => {
|
|
1515
|
-
// @ts-expect-error
|
|
1515
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1516
1516
|
const widgetId = _.first(path);
|
|
1517
|
-
// @ts-expect-error
|
|
1517
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1518
1518
|
const interWidgetPath = _.rest(path);
|
|
1519
1519
|
|
|
1520
1520
|
const widget = this.getWidgetInstance(widgetId);
|
|
@@ -1532,7 +1532,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1532
1532
|
const widgetInputPaths = widget.getInputPaths();
|
|
1533
1533
|
// Prefix paths with their widgetID and add to collective
|
|
1534
1534
|
// list of paths.
|
|
1535
|
-
// @ts-expect-error
|
|
1535
|
+
// @ts-expect-error - TS2345 - Argument of type '(inputPath: string) => void' is not assignable to parameter of type 'CollectionIterator<FocusPath, void, readonly FocusPath[]>'.
|
|
1536
1536
|
_.each(widgetInputPaths, (inputPath: string) => {
|
|
1537
1537
|
const relativeInputPath = [widgetId].concat(inputPath);
|
|
1538
1538
|
inputPaths.push(relativeInputPath);
|
|
@@ -1553,9 +1553,9 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1553
1553
|
this.blurPath(this._currentFocus);
|
|
1554
1554
|
}
|
|
1555
1555
|
|
|
1556
|
-
// @ts-expect-error
|
|
1556
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1557
1557
|
const widgetId = _.first(path);
|
|
1558
|
-
// @ts-expect-error
|
|
1558
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1559
1559
|
const interWidgetPath = _.rest(path);
|
|
1560
1560
|
|
|
1561
1561
|
// Widget handles parsing of the interWidgetPath
|
|
@@ -1571,9 +1571,9 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1571
1571
|
return;
|
|
1572
1572
|
}
|
|
1573
1573
|
|
|
1574
|
-
// @ts-expect-error
|
|
1574
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1575
1575
|
const widgetId = _.first(path);
|
|
1576
|
-
// @ts-expect-error
|
|
1576
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1577
1577
|
const interWidgetPath = _.rest(path);
|
|
1578
1578
|
const widget = this.getWidgetInstance(widgetId);
|
|
1579
1579
|
// We might be in the editor and blurring a widget that no
|
|
@@ -1600,7 +1600,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1600
1600
|
this.state.widgetInfo,
|
|
1601
1601
|
function (info, id) {
|
|
1602
1602
|
// eslint-disable-next-line @babel/no-invalid-this
|
|
1603
|
-
// @ts-expect-error
|
|
1603
|
+
// @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
1604
1604
|
// eslint-disable-next-line @babel/no-invalid-this
|
|
1605
1605
|
const widget = this.getWidgetInstance(id);
|
|
1606
1606
|
const s = widget.serialize();
|
|
@@ -1614,7 +1614,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1614
1614
|
};
|
|
1615
1615
|
|
|
1616
1616
|
emptyWidgets: () => any = () => {
|
|
1617
|
-
// @ts-expect-error
|
|
1617
|
+
// @ts-expect-error - TS2345 - Argument of type '(id: string) => boolean | undefined' is not assignable to parameter of type 'Iteratee<string[], boolean, string>'.
|
|
1618
1618
|
return _.filter(this.widgetIds, (id) => {
|
|
1619
1619
|
const widgetInfo = this._getWidgetInfo(id);
|
|
1620
1620
|
if (widgetInfo.static) {
|
|
@@ -1625,7 +1625,7 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1625
1625
|
if (widget && widget.simpleValidate) {
|
|
1626
1626
|
const score: PerseusScore = widget.simpleValidate(
|
|
1627
1627
|
widgetInfo.options,
|
|
1628
|
-
// @ts-expect-error
|
|
1628
|
+
// @ts-expect-error - TS2345 - Argument of type 'null' is not assignable to parameter of type '((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined'.
|
|
1629
1629
|
null,
|
|
1630
1630
|
);
|
|
1631
1631
|
return Util.scoreIsEmpty(score);
|
|
@@ -1698,9 +1698,9 @@ class Renderer extends React.Component<Props, State> {
|
|
|
1698
1698
|
newValue: string,
|
|
1699
1699
|
focus: () => unknown,
|
|
1700
1700
|
) => void = (path, newValue, focus) => {
|
|
1701
|
-
// @ts-expect-error
|
|
1701
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1702
1702
|
const widgetId = _.first(path);
|
|
1703
|
-
// @ts-expect-error
|
|
1703
|
+
// @ts-expect-error - TS2345 - Argument of type 'FocusPath' is not assignable to parameter of type 'List<any>'.
|
|
1704
1704
|
const interWidgetPath = _.rest(path);
|
|
1705
1705
|
const widget = this.getWidgetInstance(widgetId);
|
|
1706
1706
|
|
|
@@ -12,6 +12,7 @@ import * as React from "react";
|
|
|
12
12
|
import _ from "underscore";
|
|
13
13
|
|
|
14
14
|
import AssetContext from "./asset-context";
|
|
15
|
+
import {DependenciesContext} from "./dependencies";
|
|
15
16
|
import HintsRenderer from "./hints-renderer";
|
|
16
17
|
import Objective from "./interactive2/objective_";
|
|
17
18
|
import LoadingContext from "./loading-context";
|
|
@@ -20,7 +21,7 @@ import Renderer from "./renderer";
|
|
|
20
21
|
import Util from "./util";
|
|
21
22
|
|
|
22
23
|
import type {KeypadProps} from "./mixins/provide-keypad";
|
|
23
|
-
import type {APIOptions, FocusPath} from "./types";
|
|
24
|
+
import type {APIOptions, FocusPath, PerseusDependenciesV2} from "./types";
|
|
24
25
|
import type {RendererInterface, KEScore} from "@khanacademy/perseus-core";
|
|
25
26
|
|
|
26
27
|
const {mapObject} = Objective;
|
|
@@ -37,6 +38,8 @@ type OwnProps = // These props are used by the ProvideKeypad mixin.
|
|
|
37
38
|
reviewMode?: boolean;
|
|
38
39
|
// from KeypadContext
|
|
39
40
|
keypadElement?: any | null | undefined;
|
|
41
|
+
|
|
42
|
+
dependencies: PerseusDependenciesV2;
|
|
40
43
|
};
|
|
41
44
|
|
|
42
45
|
type HOCProps = {
|
|
@@ -70,7 +73,7 @@ export class ServerItemRenderer
|
|
|
70
73
|
extends React.Component<Props, State>
|
|
71
74
|
implements RendererInterface
|
|
72
75
|
{
|
|
73
|
-
// @ts-expect-error
|
|
76
|
+
// @ts-expect-error - TS2564 - Property 'questionRenderer' has no initializer and is not definitely assigned in the constructor.
|
|
74
77
|
questionRenderer: Renderer;
|
|
75
78
|
hintsRenderer: any;
|
|
76
79
|
_currentFocus: FocusPath;
|
|
@@ -174,7 +177,7 @@ export class ServerItemRenderer
|
|
|
174
177
|
this._currentFocus,
|
|
175
178
|
prevFocus,
|
|
176
179
|
didFocusInput && keypadElement && keypadElement.getDOMNode(),
|
|
177
|
-
// @ts-expect-error
|
|
180
|
+
// @ts-expect-error - TS2345 - Argument of type 'false | Element | Text | null | undefined' is not assignable to parameter of type 'HTMLElement | undefined'.
|
|
178
181
|
didFocusInput &&
|
|
179
182
|
this.questionRenderer.getDOMNodeForPath(newFocus),
|
|
180
183
|
);
|
|
@@ -205,7 +208,7 @@ export class ServerItemRenderer
|
|
|
205
208
|
// this callback is executed
|
|
206
209
|
// TODO(jeff, CP-3128): Use Wonder Blocks Timing API.
|
|
207
210
|
// eslint-disable-next-line no-restricted-syntax
|
|
208
|
-
// @ts-expect-error
|
|
211
|
+
// @ts-expect-error - TS2322 - Type 'Timeout' is not assignable to type 'number'.
|
|
209
212
|
this.blurTimeoutID = setTimeout(() => {
|
|
210
213
|
if (_.isEqual(this._currentFocus, blurringFocusPath)) {
|
|
211
214
|
this._setCurrentFocus(null);
|
|
@@ -324,7 +327,7 @@ export class ServerItemRenderer
|
|
|
324
327
|
const qScore = this.questionRenderer.scoreWidgets();
|
|
325
328
|
const qGuess = this.questionRenderer.getUserInputForWidgets();
|
|
326
329
|
const state = this.questionRenderer.getSerializedState();
|
|
327
|
-
// @ts-expect-error
|
|
330
|
+
// @ts-expect-error - TS2322 - Type 'Partial<Record<string, KEScore>>' is not assignable to type '{ [key: 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; }>>'.
|
|
328
331
|
return mapObject(qScore, (score, id) => {
|
|
329
332
|
return Util.keScoreFromPerseusScore(score, qGuess[id], state);
|
|
330
333
|
});
|
|
@@ -418,29 +421,31 @@ export class ServerItemRenderer
|
|
|
418
421
|
<HintsRenderer
|
|
419
422
|
hints={this.props.item.hints}
|
|
420
423
|
hintsVisible={this.props.hintsVisible}
|
|
421
|
-
// @ts-expect-error
|
|
424
|
+
// @ts-expect-error - TS2769 - No overload matches this call.
|
|
422
425
|
apiOptions={apiOptions}
|
|
423
426
|
ref={(elem) => (this.hintsRenderer = elem)}
|
|
424
427
|
/>
|
|
425
428
|
);
|
|
426
429
|
|
|
427
430
|
return (
|
|
428
|
-
<
|
|
429
|
-
<div>
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
431
|
+
<DependenciesContext.Provider value={this.props.dependencies}>
|
|
432
|
+
<div>
|
|
433
|
+
<div>{questionRenderer}</div>
|
|
434
|
+
<div
|
|
435
|
+
className={
|
|
436
|
+
// Avoid adding any horizontal padding when applying the
|
|
437
|
+
// mobile hint styles, which are flush to the left.
|
|
438
|
+
// NOTE(charlie): We may still want to apply this
|
|
439
|
+
// padding for desktop exercises.
|
|
440
|
+
apiOptions.isMobile
|
|
441
|
+
? undefined
|
|
442
|
+
: css(styles.hintsContainer)
|
|
443
|
+
}
|
|
444
|
+
>
|
|
445
|
+
{hintsRenderer}
|
|
446
|
+
</div>
|
|
442
447
|
</div>
|
|
443
|
-
</
|
|
448
|
+
</DependenciesContext.Provider>
|
|
444
449
|
);
|
|
445
450
|
}
|
|
446
451
|
}
|
package/src/sigfigs.ts
CHANGED
|
@@ -434,7 +434,7 @@ function round(mantissa: string, digits: number): string {
|
|
|
434
434
|
roundUp = true;
|
|
435
435
|
}
|
|
436
436
|
}
|
|
437
|
-
// @ts-expect-error
|
|
437
|
+
// @ts-expect-error - TS2362 - The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
|
|
438
438
|
if (lastChar % 2 == 1) {
|
|
439
439
|
roundUp = true;
|
|
440
440
|
}
|
package/src/traversal.ts
CHANGED
|
@@ -100,7 +100,7 @@ const traverseRenderer = function (
|
|
|
100
100
|
// should always be renderable. It's also annoying to write
|
|
101
101
|
// checks for this everywhere, so we just filter them out once and
|
|
102
102
|
// for all!
|
|
103
|
-
// @ts-expect-error
|
|
103
|
+
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
104
104
|
if (widgetInfo == null || widgetInfo.type == null) {
|
|
105
105
|
return widgetInfo;
|
|
106
106
|
}
|
package/src/types.ts
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
1
|
import type {SerializedHighlightSet} from "./components/highlighting/types";
|
|
4
2
|
import type {ILogger} from "./logging/log";
|
|
5
3
|
import type {Item} from "./multi-items/item-types";
|
|
6
4
|
import type {PerseusWidget} from "./perseus-types";
|
|
7
5
|
import type {SizeClass} from "./util/sizing-utils";
|
|
8
|
-
import type {
|
|
6
|
+
import type {KeypadAPI} from "@khanacademy/math-input";
|
|
7
|
+
import type {AnalyticsEventHandlerFn} from "@khanacademy/perseus-core";
|
|
9
8
|
import type {Result} from "@khanacademy/wonder-blocks-data";
|
|
9
|
+
import type * as React from "react";
|
|
10
10
|
|
|
11
11
|
export type FocusPath = ReadonlyArray<string> | null | undefined;
|
|
12
12
|
|
|
13
|
+
// TODO(FEI-5054): Figure out how to get global .d.ts files working with monorepos
|
|
14
|
+
type Empty = Record<never, never>;
|
|
15
|
+
|
|
13
16
|
export type Dimensions = {
|
|
14
17
|
width?: number;
|
|
15
18
|
height?: number;
|
|
@@ -109,6 +112,20 @@ export type Path = ReadonlyArray<string>;
|
|
|
109
112
|
|
|
110
113
|
type StubTagEditorType = any; // from "./components/stub-tag-editor";
|
|
111
114
|
|
|
115
|
+
type TrackInteractionArgs = {
|
|
116
|
+
// The widget type that this interaction originates from
|
|
117
|
+
type: string;
|
|
118
|
+
// The widget id that this interaction originates from
|
|
119
|
+
id: string;
|
|
120
|
+
|
|
121
|
+
correct?: boolean;
|
|
122
|
+
|
|
123
|
+
// Tracking args are all optional here because we don't know which
|
|
124
|
+
// widgets originated the call, and thus can't know what extra
|
|
125
|
+
// arguments will be included!
|
|
126
|
+
} & Partial<TrackingGradedGroupExtraArguments> &
|
|
127
|
+
Partial<TrackingSequenceExtraArguments>;
|
|
128
|
+
|
|
112
129
|
// APIOptions provides different ways to customize the behaviour of Perseus.
|
|
113
130
|
export type APIOptions = Readonly<{
|
|
114
131
|
isArticle?: boolean;
|
|
@@ -162,15 +179,7 @@ export type APIOptions = Readonly<{
|
|
|
162
179
|
// A function that is called when the user has interacted with a widget. It
|
|
163
180
|
// also includes any extra parameters that the originating widget provided.
|
|
164
181
|
// This is used for keeping track of widget interactions.
|
|
165
|
-
trackInteraction?: (
|
|
166
|
-
args: {
|
|
167
|
-
// The widget type that this interaction originates from
|
|
168
|
-
type: string;
|
|
169
|
-
// The widget id that this interaction originates from
|
|
170
|
-
id: string;
|
|
171
|
-
correct?: boolean;
|
|
172
|
-
} & Record<string, unknown>,
|
|
173
|
-
) => void;
|
|
182
|
+
trackInteraction?: (args: TrackInteractionArgs) => void;
|
|
174
183
|
// A boolean that indicates whether or not a custom keypad is
|
|
175
184
|
// being used. For mobile web this will be the ProvidedKeypad
|
|
176
185
|
// component. In this situation we use the MathInput component
|
|
@@ -187,7 +196,7 @@ export type APIOptions = Readonly<{
|
|
|
187
196
|
// It is called with an function that, when called, blurs the input,
|
|
188
197
|
// and is expected to return an object of the shape
|
|
189
198
|
// keypadElementPropType from math-input/src/prop-types.js.
|
|
190
|
-
nativeKeypadProxy?: () =>
|
|
199
|
+
nativeKeypadProxy?: (blur: () => void) => KeypadAPI;
|
|
191
200
|
// Indicates whether or not to use mobile styling.
|
|
192
201
|
isMobile?: boolean;
|
|
193
202
|
// A function, called with a bool indicating whether use of the
|
|
@@ -310,7 +319,6 @@ export type PerseusDependencies = {
|
|
|
310
319
|
//misc
|
|
311
320
|
staticUrl: StaticUrlFn;
|
|
312
321
|
InitialRequestUrl: InitialRequestUrlInterface;
|
|
313
|
-
analytics: SendEventFn;
|
|
314
322
|
|
|
315
323
|
// video widget
|
|
316
324
|
// This is used as a hook to fetch data about a video which is used to
|
|
@@ -332,6 +340,18 @@ export type PerseusDependencies = {
|
|
|
332
340
|
isMobile: boolean;
|
|
333
341
|
};
|
|
334
342
|
|
|
343
|
+
/**
|
|
344
|
+
* The modern iteration of Perseus Depedndencies. These dependencies are
|
|
345
|
+
* provided to Perseus through its entrypoints (for example:
|
|
346
|
+
* ServerItemRenderer) and then attached to the DependenciesContext so they are
|
|
347
|
+
* available anywhere down the React render tree.
|
|
348
|
+
*
|
|
349
|
+
* Prefer using this type over `PerseusDependencies` when possible.
|
|
350
|
+
*/
|
|
351
|
+
export type PerseusDependenciesV2 = {
|
|
352
|
+
analytics: {onAnalyticsEvent: AnalyticsEventHandlerFn};
|
|
353
|
+
};
|
|
354
|
+
|
|
335
355
|
export type APIOptionsWithDefaults = Readonly<
|
|
336
356
|
APIOptions & {
|
|
337
357
|
GroupMetadataEditor: NonNullable<APIOptions["GroupMetadataEditor"]>;
|
|
@@ -369,6 +389,16 @@ export type Tracking =
|
|
|
369
389
|
// Track all interactions
|
|
370
390
|
| "all";
|
|
371
391
|
|
|
392
|
+
// See graded-group widget
|
|
393
|
+
export type TrackingGradedGroupExtraArguments = {
|
|
394
|
+
status: "correct" | "incorrect" | "invalid";
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
// See sequence widget
|
|
398
|
+
export type TrackingSequenceExtraArguments = {
|
|
399
|
+
visible: number;
|
|
400
|
+
};
|
|
401
|
+
|
|
372
402
|
export type Alignment =
|
|
373
403
|
| "default"
|
|
374
404
|
| "block"
|
|
@@ -443,7 +473,13 @@ export type FilterCriterion =
|
|
|
443
473
|
) => boolean);
|
|
444
474
|
|
|
445
475
|
// NOTE: Rubric should always be the corresponding widget options type for the component.
|
|
446
|
-
export type WidgetProps<
|
|
476
|
+
export type WidgetProps<
|
|
477
|
+
RenderProps,
|
|
478
|
+
Rubric,
|
|
479
|
+
// Defines the arguments that can be passed to the `trackInteraction`
|
|
480
|
+
// function from APIOptions for this widget.
|
|
481
|
+
TrackingExtraArgs = Empty,
|
|
482
|
+
> = RenderProps & {
|
|
447
483
|
// provided by renderer.jsx#getWidgetProps()
|
|
448
484
|
widgetId: string;
|
|
449
485
|
alignment: string | null | undefined;
|
|
@@ -463,7 +499,7 @@ export type WidgetProps<RenderProps, Rubric> = RenderProps & {
|
|
|
463
499
|
// APIOptions. This provides the widget an easy way to notify the renderer
|
|
464
500
|
// of an interaction. The Renderer then enriches the data provided with the
|
|
465
501
|
// widget's id and type before calling APIOptions.trackInteraction.
|
|
466
|
-
trackInteraction: (extraData?:
|
|
502
|
+
trackInteraction: (extraData?: TrackingExtraArgs) => void;
|
|
467
503
|
isLastUsedWidget: boolean;
|
|
468
504
|
// provided by widget-container.jsx#render()
|
|
469
505
|
linterContext: LinterContextProps;
|
package/src/util/answer-types.ts
CHANGED
|
@@ -457,10 +457,10 @@ const KhanAnswerTypes = {
|
|
|
457
457
|
text = text.replace(/[ \(\)]/g, "");
|
|
458
458
|
|
|
459
459
|
if ((match = text.match(/^log\s*(\S+)\s*$/i))) {
|
|
460
|
-
// @ts-expect-error
|
|
460
|
+
// @ts-expect-error - TS2322 - Type '{ value: number | undefined; exact: boolean; }[]' is not assignable to type 'never[]'.
|
|
461
461
|
possibilities = forms.decimal(match[1]);
|
|
462
462
|
} else if (text === "0") {
|
|
463
|
-
// @ts-expect-error
|
|
463
|
+
// @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'never'. | TS2322 - Type 'boolean' is not assignable to type 'never'.
|
|
464
464
|
possibilities = [{value: 0, exact: true}];
|
|
465
465
|
}
|
|
466
466
|
return possibilities;
|
|
@@ -480,7 +480,7 @@ const KhanAnswerTypes = {
|
|
|
480
480
|
const transformed = forms.decimal(text);
|
|
481
481
|
$.each(transformed, function (ix, t) {
|
|
482
482
|
t.exact = hasPercentSign;
|
|
483
|
-
// @ts-expect-error
|
|
483
|
+
// @ts-expect-error - TS2532 - Object is possibly 'undefined'.
|
|
484
484
|
t.value = t.value / 100;
|
|
485
485
|
});
|
|
486
486
|
return transformed;
|
|
@@ -674,7 +674,7 @@ const KhanAnswerTypes = {
|
|
|
674
674
|
options: any,
|
|
675
675
|
): (arg1: Guess) => Score {
|
|
676
676
|
return KhanAnswerTypes.predicate.createValidatorFunctional(
|
|
677
|
-
// @ts-expect-error
|
|
677
|
+
// @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
|
|
678
678
|
...KhanAnswerTypes.number.convertToPredicate(
|
|
679
679
|
correctAnswer,
|
|
680
680
|
options,
|
|
@@ -778,7 +778,7 @@ const KhanAnswerTypes = {
|
|
|
778
778
|
|
|
779
779
|
// Don't bother parsing an empty input
|
|
780
780
|
if (!guess) {
|
|
781
|
-
// @ts-expect-error
|
|
781
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'empty' because it is a read-only property.
|
|
782
782
|
score.empty = true;
|
|
783
783
|
return score;
|
|
784
784
|
}
|
|
@@ -787,7 +787,7 @@ const KhanAnswerTypes = {
|
|
|
787
787
|
|
|
788
788
|
// An unsuccessful parse doesn't count as wrong
|
|
789
789
|
if (!answer.parsed) {
|
|
790
|
-
// @ts-expect-error
|
|
790
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'empty' because it is a read-only property.
|
|
791
791
|
score.empty = true;
|
|
792
792
|
return score;
|
|
793
793
|
}
|
|
@@ -805,7 +805,7 @@ const KhanAnswerTypes = {
|
|
|
805
805
|
|
|
806
806
|
if (result.equal) {
|
|
807
807
|
// Correct answer
|
|
808
|
-
// @ts-expect-error
|
|
808
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'correct' because it is a read-only property.
|
|
809
809
|
score.correct = true;
|
|
810
810
|
} else if (
|
|
811
811
|
result.wrongVariableNames ||
|
|
@@ -816,20 +816,20 @@ const KhanAnswerTypes = {
|
|
|
816
816
|
// TODO(aasmund): This should ideally have been handled
|
|
817
817
|
// under the `result.message` condition, but the
|
|
818
818
|
// KAS messages currently aren't translatable.
|
|
819
|
-
// @ts-expect-error
|
|
819
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'ungraded' because it is a read-only property.
|
|
820
820
|
score.ungraded = true;
|
|
821
|
-
// @ts-expect-error
|
|
821
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'message' because it is a read-only property.
|
|
822
822
|
score.message = result.wrongVariableCase
|
|
823
823
|
? errors.WRONG_CASE_ERROR
|
|
824
824
|
: errors.WRONG_LETTER_ERROR;
|
|
825
825
|
// Don't tell the use they're "almost there" in this case, that may not be true and isn't helpful.
|
|
826
|
-
// @ts-expect-error
|
|
826
|
+
// @ts-expect-error - TS2339 - Property 'suppressAlmostThere' does not exist on type '{ readonly empty: false; readonly correct: false; readonly message: string | null | undefined; readonly guess: any; readonly ungraded: false; }'.
|
|
827
827
|
score.suppressAlmostThere = true;
|
|
828
828
|
} else if (result.message) {
|
|
829
829
|
// Nearly correct answer
|
|
830
830
|
// TODO(aasmund): This message also isn't translatable;
|
|
831
831
|
// need to fix that in KAS
|
|
832
|
-
// @ts-expect-error
|
|
832
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'message' because it is a read-only property.
|
|
833
833
|
score.message = result.message;
|
|
834
834
|
} else {
|
|
835
835
|
// Replace x with * and see if it would have been correct
|
|
@@ -851,13 +851,13 @@ const KhanAnswerTypes = {
|
|
|
851
851
|
options,
|
|
852
852
|
);
|
|
853
853
|
if (resultX.equal) {
|
|
854
|
-
// @ts-expect-error
|
|
854
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'ungraded' because it is a read-only property.
|
|
855
855
|
score.ungraded = true;
|
|
856
|
-
// @ts-expect-error
|
|
856
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'message' because it is a read-only property.
|
|
857
857
|
score.message = errors.MULTIPLICATION_SIGN_ERROR;
|
|
858
858
|
} else if (resultX.message) {
|
|
859
859
|
// TODO(aasmund): I18nize `score.message`
|
|
860
|
-
// @ts-expect-error
|
|
860
|
+
// @ts-expect-error - TS2540 - Cannot assign to 'message' because it is a read-only property.
|
|
861
861
|
score.message =
|
|
862
862
|
resultX.message +
|
|
863
863
|
" Also, I'm a computer. I only understand " +
|