@khanacademy/perseus 19.1.5 → 19.1.6
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/dist/es/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +11 -8
- package/.babelrc.js +0 -8
- package/.eslintrc.js +0 -12
- package/CHANGELOG.md +0 -1432
- package/src/__stories__/article-renderer.stories.tsx +0 -100
- package/src/__stories__/hints-renderer.stories.tsx +0 -55
- package/src/__stories__/server-item-renderer.stories.tsx +0 -44
- package/src/__testdata__/article-renderer.testdata.ts +0 -212
- package/src/__testdata__/graphie.testdata.ts +0 -51
- package/src/__testdata__/renderer.testdata.ts +0 -274
- package/src/__testdata__/server-item-renderer.testdata.ts +0 -171
- package/src/__tests__/__snapshots__/perseus-markdown.test.ts.snap +0 -507
- package/src/__tests__/__snapshots__/renderer.test.tsx.snap +0 -525
- package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +0 -285
- package/src/__tests__/a11y.test.ts +0 -303
- package/src/__tests__/article-renderer.test.tsx +0 -130
- package/src/__tests__/error-boundary.test.tsx +0 -76
- package/src/__tests__/extract-perseus-data.test.ts +0 -1027
- package/src/__tests__/init.test.ts +0 -10
- package/src/__tests__/jipt-paragraphs.test.ts +0 -32
- package/src/__tests__/mock-asset-loading-widget.tsx +0 -53
- package/src/__tests__/mock-widget.tsx +0 -33
- package/src/__tests__/perseus-markdown.test.ts +0 -764
- package/src/__tests__/renderability.test.ts +0 -480
- package/src/__tests__/renderer-api.test.tsx +0 -302
- package/src/__tests__/renderer.test.tsx +0 -1816
- package/src/__tests__/server-item-renderer.test.tsx +0 -582
- package/src/__tests__/test-items/image-item.ts +0 -24
- package/src/__tests__/test-items/input-number-1-item.ts +0 -26
- package/src/__tests__/test-items/input-number-2-item.ts +0 -38
- package/src/__tests__/test-items/table-item.ts +0 -29
- package/src/__tests__/tex-wrangler.test.ts +0 -82
- package/src/__tests__/util.test.ts +0 -40
- package/src/__tests__/widget-container.test.tsx +0 -126
- package/src/__tests__/widgets.test.ts +0 -91
- package/src/a11y.ts +0 -45
- package/src/all-widgets.ts +0 -9
- package/src/article-renderer.tsx +0 -237
- package/src/asset-context.ts +0 -30
- package/src/basic-widgets.ts +0 -16
- package/src/components/__stories__/button-group.stories.tsx +0 -55
- package/src/components/__stories__/fixed-to-responsive.stories.tsx +0 -141
- package/src/components/__stories__/graph.stories.tsx +0 -28
- package/src/components/__stories__/graphie.stories.tsx +0 -33
- package/src/components/__stories__/hud.stories.tsx +0 -35
- package/src/components/__stories__/icon.stories.tsx +0 -63
- package/src/components/__stories__/image-loader.stories.tsx +0 -63
- package/src/components/__stories__/info-tip.stories.tsx +0 -31
- package/src/components/__stories__/inline-icon.stories.tsx +0 -40
- package/src/components/__stories__/input-with-examples.stories.tsx +0 -53
- package/src/components/__stories__/lint.stories.tsx +0 -86
- package/src/components/__stories__/math-input.stories.tsx +0 -43
- package/src/components/__stories__/math-output.stories.tsx +0 -23
- package/src/components/__stories__/multi-button-group.stories.tsx +0 -66
- package/src/components/__stories__/number-input.stories.tsx +0 -41
- package/src/components/__stories__/prop-check-box.stories.tsx +0 -65
- package/src/components/__stories__/range-input.stories.tsx +0 -29
- package/src/components/__stories__/simple-keypad-input.stories.tsx +0 -27
- package/src/components/__stories__/sortable.stories.tsx +0 -77
- package/src/components/__stories__/stub-tag-editor.stories.tsx +0 -45
- package/src/components/__stories__/svg-image.stories.tsx +0 -74
- package/src/components/__stories__/tex.stories.tsx +0 -23
- package/src/components/__stories__/text-input.stories.tsx +0 -33
- package/src/components/__stories__/text-list-editor.stories.tsx +0 -32
- package/src/components/__stories__/tooltip.stories.tsx +0 -52
- package/src/components/__stories__/zoomable-tex.stories.tsx +0 -41
- package/src/components/__stories__/zoomable.stories.tsx +0 -49
- package/src/components/__testdata__/sorter.testdata.ts +0 -19
- package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +0 -163
- package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +0 -265
- package/src/components/__tests__/math-input.test.tsx +0 -147
- package/src/components/__tests__/number-input.test.tsx +0 -128
- package/src/components/__tests__/sortable.test.tsx +0 -269
- package/src/components/__tests__/sorter.test.tsx +0 -114
- package/src/components/__tests__/zoomable.test.tsx +0 -399
- package/src/components/button-group.tsx +0 -130
- package/src/components/constants.ts +0 -14
- package/src/components/fixed-to-responsive.tsx +0 -169
- package/src/components/graph.tsx +0 -444
- package/src/components/graphie-classes.ts +0 -153
- package/src/components/graphie-movables.ts +0 -338
- package/src/components/graphie.tsx +0 -400
- package/src/components/highlighting/highlightable-content.tsx +0 -240
- package/src/components/highlighting/highlights.ts +0 -207
- package/src/components/highlighting/ranges.ts +0 -304
- package/src/components/highlighting/types.ts +0 -73
- package/src/components/highlighting/ui/highlight-renderer.tsx +0 -172
- package/src/components/highlighting/ui/highlight-set-renderer.tsx +0 -185
- package/src/components/highlighting/ui/highlight-tooltip.tsx +0 -141
- package/src/components/highlighting/ui/highlighting-ui.tsx +0 -143
- package/src/components/highlighting/ui/selection-tracker.tsx +0 -186
- package/src/components/highlighting/ui/types.ts +0 -21
- package/src/components/highlighting/ui/util.ts +0 -165
- package/src/components/highlighting/word-indexer.tsx +0 -152
- package/src/components/hud.tsx +0 -167
- package/src/components/icon.tsx +0 -141
- package/src/components/image-loader.tsx +0 -177
- package/src/components/info-tip/info-tip.tsx +0 -144
- package/src/components/info-tip.tsx +0 -39
- package/src/components/inline-icon.tsx +0 -60
- package/src/components/input-with-examples.tsx +0 -249
- package/src/components/lint.tsx +0 -459
- package/src/components/math-input.tsx +0 -474
- package/src/components/math-output.tsx +0 -134
- package/src/components/multi-button-group.tsx +0 -135
- package/src/components/number-input.tsx +0 -249
- package/src/components/prop-check-box.tsx +0 -79
- package/src/components/range-input.tsx +0 -60
- package/src/components/simple-keypad-input.tsx +0 -88
- package/src/components/sortable.tsx +0 -958
- package/src/components/stub-tag-editor.tsx +0 -53
- package/src/components/svg-image.tsx +0 -779
- package/src/components/tex.tsx +0 -67
- package/src/components/text-input.tsx +0 -129
- package/src/components/text-list-editor.tsx +0 -166
- package/src/components/tooltip.tsx +0 -410
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +0 -141
- package/src/components/visibility-observer/create-visibility-observer.ts +0 -108
- package/src/components/visibility-observer/get-scroll-parent.ts +0 -46
- package/src/components/visibility-observer/visibility-observer.tsx +0 -124
- package/src/components/zoomable-tex.tsx +0 -78
- package/src/components/zoomable.tsx +0 -304
- package/src/components.ts +0 -15
- package/src/definition-context.tsx +0 -59
- package/src/dependencies.ts +0 -40
- package/src/error-boundary.tsx +0 -70
- package/src/extra-widgets.ts +0 -75
- package/src/hint-renderer.tsx +0 -151
- package/src/hints-renderer.tsx +0 -372
- package/src/icon-paths.ts +0 -119
- package/src/index.ts +0 -171
- package/src/init.ts +0 -56
- package/src/interaction-tracker.ts +0 -62
- package/src/interactive2/__tests__/movable-mock.ts +0 -55
- package/src/interactive2/__tests__/movable-point.test.ts +0 -144
- package/src/interactive2/interactive-util.test.ts +0 -93
- package/src/interactive2/interactive-util.ts +0 -159
- package/src/interactive2/movable-helper-methods.ts +0 -166
- package/src/interactive2/movable-line-options.ts +0 -419
- package/src/interactive2/movable-line.ts +0 -307
- package/src/interactive2/movable-point-options.ts +0 -224
- package/src/interactive2/movable-point.tsx +0 -585
- package/src/interactive2/movable-polygon-options.ts +0 -389
- package/src/interactive2/movable-polygon.ts +0 -360
- package/src/interactive2/movable.test.ts +0 -249
- package/src/interactive2/movable.ts +0 -437
- package/src/interactive2/objective_.ts +0 -79
- package/src/interactive2/types.ts +0 -17
- package/src/interactive2/wrapped-defaults.ts +0 -87
- package/src/interactive2/wrapped-ellipse.ts +0 -94
- package/src/interactive2/wrapped-line.ts +0 -116
- package/src/interactive2/wrapped-path.ts +0 -51
- package/src/interactive2.ts +0 -70
- package/src/item-version.ts +0 -10
- package/src/jipt-paragraphs.ts +0 -49
- package/src/jquery.mobile.vmouse.js +0 -545
- package/src/loading-context.ts +0 -21
- package/src/logging/log.test.ts +0 -39
- package/src/logging/log.ts +0 -97
- package/src/mixins/__tests__/widget-prop-denylist.test.ts +0 -21
- package/src/mixins/changeable.ts +0 -133
- package/src/mixins/editor-jsonify.ts +0 -13
- package/src/mixins/widget-jsonify-deprecated.ts +0 -23
- package/src/mixins/widget-prop-denylist.ts +0 -48
- package/src/multi-items/__stories__/multi-renderer.stories.tsx +0 -83
- package/src/multi-items/__testdata__/multi-renderer.testdata.ts +0 -172
- package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +0 -1164
- package/src/multi-items/__tests__/items.test.ts +0 -240
- package/src/multi-items/__tests__/multi-renderer.test.tsx +0 -914
- package/src/multi-items/__tests__/prop-type-builders.test.ts +0 -133
- package/src/multi-items/__tests__/shapes.test.ts +0 -43
- package/src/multi-items/__tests__/trees.test.ts +0 -317
- package/src/multi-items/item-types.ts +0 -56
- package/src/multi-items/items.ts +0 -176
- package/src/multi-items/multi-renderer.tsx +0 -569
- package/src/multi-items/prop-type-builders.ts +0 -106
- package/src/multi-items/shape-types.ts +0 -52
- package/src/multi-items/shapes.ts +0 -52
- package/src/multi-items/tree-types.ts +0 -47
- package/src/multi-items/trees.ts +0 -360
- package/src/multi-items.ts +0 -75
- package/src/perseus-api.tsx +0 -188
- package/src/perseus-env.ts +0 -27
- package/src/perseus-error.ts +0 -17
- package/src/perseus-markdown.tsx +0 -405
- package/src/perseus-types.ts +0 -1366
- package/src/perseus-version.ts +0 -9
- package/src/question-paragraph.tsx +0 -34
- package/src/renderability.ts +0 -109
- package/src/renderer.tsx +0 -2000
- package/src/server-item-renderer.tsx +0 -495
- package/src/sigfigs.ts +0 -490
- package/src/styles/articles.less +0 -749
- package/src/styles/constants.ts +0 -94
- package/src/styles/global-constants.ts +0 -343
- package/src/styles/global-styles.ts +0 -306
- package/src/styles/khan-exercise.css +0 -1468
- package/src/styles/media-queries.ts +0 -47
- package/src/styles/perseus-renderer.less +0 -732
- package/src/styles/shared.ts +0 -130
- package/src/styles/util.less +0 -47
- package/src/styles/variables.boostrap.less +0 -277
- package/src/styles/variables.less +0 -56
- package/src/styles/variables.shared.less +0 -340
- package/src/styles/widgets/categorizer.less +0 -38
- package/src/styles/widgets/dropdown.less +0 -3
- package/src/styles/widgets/expression.less +0 -65
- package/src/styles/widgets/graded-group.less +0 -36
- package/src/styles/widgets/grapher.less +0 -12
- package/src/styles/widgets/group.less +0 -19
- package/src/styles/widgets/image.less +0 -54
- package/src/styles/widgets/interactive-graph.less +0 -64
- package/src/styles/widgets/label-image.less +0 -57
- package/src/styles/widgets/matcher.less +0 -8
- package/src/styles/widgets/matrix.less +0 -126
- package/src/styles/widgets/measurer.less +0 -20
- package/src/styles/widgets/orderer.less +0 -98
- package/src/styles/widgets/passage.less +0 -154
- package/src/styles/widgets/plotter.less +0 -31
- package/src/styles/widgets/radio.less +0 -58
- package/src/styles/widgets/reaction-diagram.less +0 -35
- package/src/styles/widgets/sequence.less +0 -5
- package/src/styles/widgets/sortable.less +0 -113
- package/src/styles/widgets/table.less +0 -57
- package/src/styles/widgets/unit.less +0 -15
- package/src/tex-wrangler.ts +0 -182
- package/src/translation-linter.ts +0 -126
- package/src/traversal.ts +0 -138
- package/src/types.ts +0 -513
- package/src/util/a11y.ts +0 -23
- package/src/util/answer-types.test.ts +0 -114
- package/src/util/answer-types.ts +0 -876
- package/src/util/colors.ts +0 -93
- package/src/util/drawing-transform.test.ts +0 -67
- package/src/util/drawing-transform.ts +0 -102
- package/src/util/extract-perseus-data.ts +0 -539
- package/src/util/fix-passage-refs.ts +0 -121
- package/src/util/geometry.test.ts +0 -75
- package/src/util/geometry.ts +0 -312
- package/src/util/graph-bounds.ts +0 -23
- package/src/util/graph-utils.ts +0 -15
- package/src/util/graphie.test.ts +0 -1277
- package/src/util/graphie.ts +0 -1576
- package/src/util/interactive.ts +0 -4174
- package/src/util/interval.ts +0 -4
- package/src/util/katex-preprocess.ts +0 -14
- package/src/util/math.test.ts +0 -11
- package/src/util/math.ts +0 -294
- package/src/util/mobile-native-utils.test.ts +0 -22
- package/src/util/mobile-native-utils.ts +0 -12
- package/src/util/parse-perseus-json.test.ts +0 -10
- package/src/util/parse-perseus-json.ts +0 -13
- package/src/util/react-render.tsx +0 -27
- package/src/util/register-all-widgets-for-testing.ts +0 -13
- package/src/util/scroll-utils.ts +0 -155
- package/src/util/sizing-utils.ts +0 -46
- package/src/util/tex.ts +0 -73
- package/src/util/url-utils.ts +0 -34
- package/src/util.graphie.test.ts +0 -45
- package/src/util.graphie.ts +0 -59
- package/src/util.ts +0 -966
- package/src/version.ts +0 -10
- package/src/widget-container.tsx +0 -199
- package/src/widgets/__stories__/categorizer.stories.tsx +0 -14
- package/src/widgets/__stories__/cs-program.stories.tsx +0 -14
- package/src/widgets/__stories__/definition.stories.tsx +0 -114
- package/src/widgets/__stories__/dropdown.stories.tsx +0 -14
- package/src/widgets/__stories__/explanation.stories.tsx +0 -18
- package/src/widgets/__stories__/expression.stories.tsx +0 -145
- package/src/widgets/__stories__/graded-group-set.stories.tsx +0 -31
- package/src/widgets/__stories__/graded-group.stories.tsx +0 -31
- package/src/widgets/__stories__/grapher.stories.tsx +0 -46
- package/src/widgets/__stories__/group.stories.tsx +0 -14
- package/src/widgets/__stories__/iframe.stories.tsx +0 -14
- package/src/widgets/__stories__/image.stories.tsx +0 -85
- package/src/widgets/__stories__/input-number.stories.tsx +0 -101
- package/src/widgets/__stories__/interaction.stories.tsx +0 -14
- package/src/widgets/__stories__/interactive-graph.stories.tsx +0 -60
- package/src/widgets/__stories__/label-image.stories.tsx +0 -130
- package/src/widgets/__stories__/matcher.stories.tsx +0 -14
- package/src/widgets/__stories__/matrix.stories.tsx +0 -14
- package/src/widgets/__stories__/number-line.stories.tsx +0 -14
- package/src/widgets/__stories__/numeric-input.stories.tsx +0 -105
- package/src/widgets/__stories__/orderer.stories.tsx +0 -18
- package/src/widgets/__stories__/passage-ref.stories.tsx +0 -33
- package/src/widgets/__stories__/passage.stories.tsx +0 -39
- package/src/widgets/__stories__/plotter.stories.tsx +0 -27
- package/src/widgets/__stories__/radio.stories.tsx +0 -86
- package/src/widgets/__stories__/random-widgets.stories.tsx +0 -59
- package/src/widgets/__stories__/sorter.stories.tsx +0 -14
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +0 -66
- package/src/widgets/__stories__/unit.stories.tsx +0 -28
- package/src/widgets/__stories__/video-transcript-link.stories.tsx +0 -23
- package/src/widgets/__stories__/video.stories.tsx +0 -22
- package/src/widgets/__testdata__/base-radio.testdata.ts +0 -21
- package/src/widgets/__testdata__/categorizer.testdata.ts +0 -89
- package/src/widgets/__testdata__/cs-program.testdata.ts +0 -27
- package/src/widgets/__testdata__/dropdown.testdata.ts +0 -71
- package/src/widgets/__testdata__/explanation.testdata.ts +0 -85
- package/src/widgets/__testdata__/expression.testdata.ts +0 -198
- package/src/widgets/__testdata__/graded-group-set.testdata.ts +0 -356
- package/src/widgets/__testdata__/graded-group.testdata.ts +0 -77
- package/src/widgets/__testdata__/grapher.testdata.ts +0 -374
- package/src/widgets/__testdata__/group.testdata.ts +0 -153
- package/src/widgets/__testdata__/iframe.testdata.ts +0 -35
- package/src/widgets/__testdata__/image.testdata.ts +0 -36
- package/src/widgets/__testdata__/input-number.testdata.ts +0 -72
- package/src/widgets/__testdata__/interaction.testdata.ts +0 -262
- package/src/widgets/__testdata__/interactive-graph-random.testdata.ts +0 -269
- package/src/widgets/__testdata__/interactive-graph.testdata.ts +0 -644
- package/src/widgets/__testdata__/label-image.testdata.ts +0 -308
- package/src/widgets/__testdata__/matcher.testdata.ts +0 -33
- package/src/widgets/__testdata__/matrix.testdata.ts +0 -28
- package/src/widgets/__testdata__/number-line.testdata.ts +0 -30
- package/src/widgets/__testdata__/numeric-input.testdata.ts +0 -265
- package/src/widgets/__testdata__/orderer.testdata.ts +0 -123
- package/src/widgets/__testdata__/passage-ref.testdata.ts +0 -101
- package/src/widgets/__testdata__/passage.testdata.ts +0 -95
- package/src/widgets/__testdata__/plotter.testdata.ts +0 -36
- package/src/widgets/__testdata__/radio.testdata.ts +0 -324
- package/src/widgets/__testdata__/randomizers.ts +0 -51
- package/src/widgets/__testdata__/sorter.testdata.ts +0 -19
- package/src/widgets/__testdata__/video.testdata.ts +0 -61
- package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +0 -940
- package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +0 -67
- package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +0 -97
- package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +0 -133
- package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +0 -425
- package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +0 -729
- package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +0 -339
- package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +0 -801
- package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +0 -2673
- package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +0 -1211
- package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +0 -61
- package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +0 -378
- package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +0 -495
- package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +0 -292
- package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +0 -2889
- package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +0 -883
- package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +0 -514
- package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +0 -814
- package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +0 -470
- package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +0 -243
- package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +0 -434
- package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +0 -1956
- package/src/widgets/__tests__/__snapshots__/plotter.test.tsx.snap +0 -827
- package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +0 -4237
- package/src/widgets/__tests__/__snapshots__/unit.test.tsx.snap +0 -20
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +0 -153
- package/src/widgets/__tests__/categorizer.test.ts +0 -203
- package/src/widgets/__tests__/cs-program.test.ts +0 -43
- package/src/widgets/__tests__/definition.test.ts +0 -136
- package/src/widgets/__tests__/dropdown.test.ts +0 -105
- package/src/widgets/__tests__/explanation.test.ts +0 -198
- package/src/widgets/__tests__/expression-mobile.test.tsx +0 -363
- package/src/widgets/__tests__/expression.test.tsx +0 -484
- package/src/widgets/__tests__/graded-group-set-jipt.test.ts +0 -30
- package/src/widgets/__tests__/graded-group-set.test.ts +0 -288
- package/src/widgets/__tests__/graded-group.test.ts +0 -232
- package/src/widgets/__tests__/grapher.cypress.ts +0 -576
- package/src/widgets/__tests__/grapher.test.ts +0 -33
- package/src/widgets/__tests__/group.test.tsx +0 -510
- package/src/widgets/__tests__/iframe.test.ts +0 -45
- package/src/widgets/__tests__/image.test.ts +0 -62
- package/src/widgets/__tests__/input-number.test.ts +0 -354
- package/src/widgets/__tests__/interaction.test.ts +0 -31
- package/src/widgets/__tests__/interactive-graph.cypress.ts +0 -815
- package/src/widgets/__tests__/interactive-graph.test.ts +0 -106
- package/src/widgets/__tests__/matcher.test.tsx +0 -176
- package/src/widgets/__tests__/matrix.test.ts +0 -82
- package/src/widgets/__tests__/number-line.test.ts +0 -79
- package/src/widgets/__tests__/numeric-input.test.ts +0 -575
- package/src/widgets/__tests__/orderer.test.ts +0 -73
- package/src/widgets/__tests__/passage-ref.test.ts +0 -168
- package/src/widgets/__tests__/passage.test.tsx +0 -224
- package/src/widgets/__tests__/plotter.test.tsx +0 -69
- package/src/widgets/__tests__/radio/base-radio.test.tsx +0 -470
- package/src/widgets/__tests__/radio/choice-icon.test.tsx +0 -90
- package/src/widgets/__tests__/radio/choice.test.tsx +0 -310
- package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -22
- package/src/widgets/__tests__/radio/option-status.test.tsx +0 -77
- package/src/widgets/__tests__/radio.test.ts +0 -807
- package/src/widgets/__tests__/randomizers.test.ts +0 -53
- package/src/widgets/__tests__/renderQuestion.tsx +0 -101
- package/src/widgets/__tests__/unit.test.tsx +0 -168
- package/src/widgets/__tests__/video.test.ts +0 -69
- package/src/widgets/categorizer.tsx +0 -344
- package/src/widgets/cs-program.tsx +0 -227
- package/src/widgets/definition.tsx +0 -121
- package/src/widgets/deprecated-standin/__stories__/deprecated-standin.stories.tsx +0 -30
- package/src/widgets/deprecated-standin/__tests__/__snapshots__/deprecated-standin.test.ts.snap +0 -70
- package/src/widgets/deprecated-standin/__tests__/deprecated-standin.test.ts +0 -93
- package/src/widgets/deprecated-standin/index.tsx +0 -58
- package/src/widgets/dropdown.tsx +0 -142
- package/src/widgets/explanation.tsx +0 -317
- package/src/widgets/expression.tsx +0 -707
- package/src/widgets/graded-group-answer-bar.tsx +0 -142
- package/src/widgets/graded-group-set.tsx +0 -338
- package/src/widgets/graded-group.tsx +0 -471
- package/src/widgets/grapher/util.tsx +0 -799
- package/src/widgets/grapher.tsx +0 -660
- package/src/widgets/group.tsx +0 -195
- package/src/widgets/iframe.tsx +0 -195
- package/src/widgets/image.tsx +0 -312
- package/src/widgets/input-number.tsx +0 -412
- package/src/widgets/interaction/arrow-picker.tsx +0 -38
- package/src/widgets/interaction/color-picker.tsx +0 -69
- package/src/widgets/interaction/dash-picker.tsx +0 -45
- package/src/widgets/interaction/element-container.tsx +0 -100
- package/src/widgets/interaction.tsx +0 -826
- package/src/widgets/interactive-graph.tsx +0 -2597
- package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +0 -91
- package/src/widgets/label-image/__stories__/answer-pill.stories.tsx +0 -62
- package/src/widgets/label-image/__stories__/marker.stories.tsx +0 -171
- package/src/widgets/label-image/__tests__/answer-pill.test.tsx +0 -75
- package/src/widgets/label-image/__tests__/hide-answers-toggle.test.tsx +0 -39
- package/src/widgets/label-image/answer-choices.tsx +0 -88
- package/src/widgets/label-image/answer-pill.tsx +0 -103
- package/src/widgets/label-image/hide-answers-toggle.tsx +0 -40
- package/src/widgets/label-image/marker.tsx +0 -268
- package/src/widgets/label-image/strings.ts +0 -5
- package/src/widgets/label-image/types.ts +0 -27
- package/src/widgets/label-image.test.ts +0 -928
- package/src/widgets/label-image.tsx +0 -819
- package/src/widgets/lights-puzzle.tsx +0 -359
- package/src/widgets/matcher.tsx +0 -298
- package/src/widgets/matrix.tsx +0 -634
- package/src/widgets/measurer.tsx +0 -222
- package/src/widgets/molecule/__tests__/layout.test.ts +0 -162
- package/src/widgets/molecule/__tests__/parser.test.ts +0 -155
- package/src/widgets/molecule/molecule-drawing.ts +0 -173
- package/src/widgets/molecule/molecule-layout.ts +0 -362
- package/src/widgets/molecule/smiles-parser.ts +0 -296
- package/src/widgets/molecule.tsx +0 -172
- package/src/widgets/number-line.tsx +0 -862
- package/src/widgets/numeric-input.tsx +0 -576
- package/src/widgets/orderer.tsx +0 -786
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +0 -376
- package/src/widgets/passage/passage-markdown.tsx +0 -475
- package/src/widgets/passage-ref-target.tsx +0 -76
- package/src/widgets/passage-ref.tsx +0 -213
- package/src/widgets/passage.tsx +0 -582
- package/src/widgets/plotter.tsx +0 -1194
- package/src/widgets/radio/__stories__/base-radio.stories.tsx +0 -196
- package/src/widgets/radio/__stories__/choice-icon.stories.tsx +0 -166
- package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +0 -40
- package/src/widgets/radio/__stories__/choice.stories.tsx +0 -137
- package/src/widgets/radio/__stories__/focus-ring.stories.tsx +0 -43
- package/src/widgets/radio/__stories__/option-status.stories.tsx +0 -103
- package/src/widgets/radio/base-radio.tsx +0 -511
- package/src/widgets/radio/choice-a11y-text.ts +0 -61
- package/src/widgets/radio/choice-icon/choice-icon.tsx +0 -218
- package/src/widgets/radio/choice-icon/cross-out-line.tsx +0 -51
- package/src/widgets/radio/choice-icon/shared-styles.ts +0 -15
- package/src/widgets/radio/choice-none-above.tsx +0 -56
- package/src/widgets/radio/choice.jsx.fixture.ts +0 -45
- package/src/widgets/radio/choice.tsx +0 -359
- package/src/widgets/radio/focus-ring.tsx +0 -57
- package/src/widgets/radio/option-status.tsx +0 -98
- package/src/widgets/radio/util.test.ts +0 -18
- package/src/widgets/radio/util.ts +0 -31
- package/src/widgets/radio/widget.tsx +0 -520
- package/src/widgets/radio.ts +0 -157
- package/src/widgets/reaction-diagram.tsx +0 -144
- package/src/widgets/sequence.tsx +0 -142
- package/src/widgets/simulator.tsx +0 -829
- package/src/widgets/sorter.tsx +0 -155
- package/src/widgets/table.tsx +0 -393
- package/src/widgets/unit.tsx +0 -374
- package/src/widgets/video-transcript-link.test.tsx +0 -213
- package/src/widgets/video-transcript-link.tsx +0 -84
- package/src/widgets/video.tsx +0 -135
- package/src/widgets.ts +0 -489
- package/src/zoom.ts +0 -555
- package/tsconfig-build.json +0 -26
- package/tsconfig-build.tsbuildinfo +0 -1
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import {treeToItem} from "../items";
|
|
2
|
-
import {buildPropTypeForShape} from "../prop-type-builders";
|
|
3
|
-
import shapes from "../shapes";
|
|
4
|
-
|
|
5
|
-
// TODO(emily): [PERSEUS_MERGE] Calling prop types as a function fails these
|
|
6
|
-
// tests. Rewrite them once we're using the prop-types library.
|
|
7
|
-
describe.skip("buildPropTypeForShape", () => {
|
|
8
|
-
// The value we're wrapping might not be a valid ItemTree - that's the
|
|
9
|
-
// point of testing this PropType - so we disable type checking by casting
|
|
10
|
-
// `value` to type `any`. The current implementation of `treeToItem` can
|
|
11
|
-
// handle that possibility.
|
|
12
|
-
const tryPropType = (propType: any, value: any) =>
|
|
13
|
-
propType({value: treeToItem(value)}, "value", "<function tryPropType>");
|
|
14
|
-
|
|
15
|
-
const assertPropTypePasses = (propType, value) =>
|
|
16
|
-
expect(null).toEqual(tryPropType(propType, value));
|
|
17
|
-
|
|
18
|
-
const assertPropTypeFails = (propType, value) =>
|
|
19
|
-
expect(tryPropType(propType, value) instanceof Error).toBeTruthy();
|
|
20
|
-
|
|
21
|
-
it("validates a content node", () => {
|
|
22
|
-
const propType = buildPropTypeForShape(shapes.content);
|
|
23
|
-
|
|
24
|
-
// Perseus has default values for all item fields, so all except the
|
|
25
|
-
// type are optional.
|
|
26
|
-
assertPropTypePasses(propType, {__type: "content"});
|
|
27
|
-
assertPropTypePasses(propType, {
|
|
28
|
-
content: "",
|
|
29
|
-
widgets: {},
|
|
30
|
-
images: {},
|
|
31
|
-
__type: "content",
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// We also leave the full object optional by default, like the propType
|
|
35
|
-
// primitives.
|
|
36
|
-
assertPropTypePasses(propType, null);
|
|
37
|
-
|
|
38
|
-
// But specifying a bad type for any field will fail the propType.
|
|
39
|
-
assertPropTypeFails(propType, {content: 1, __type: "content"});
|
|
40
|
-
assertPropTypeFails(propType, {widgets: 1, __type: "content"});
|
|
41
|
-
assertPropTypeFails(propType, {images: 1, __type: "content"});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// TODO(mdr): Remove #LegacyContentNode support.
|
|
45
|
-
it("validates a legacy content node", () => {
|
|
46
|
-
const propType = buildPropTypeForShape(shapes.content);
|
|
47
|
-
|
|
48
|
-
// Perseus has default values for all item fields, so all except the
|
|
49
|
-
// type are optional.
|
|
50
|
-
assertPropTypePasses(propType, {__type: "item"});
|
|
51
|
-
assertPropTypePasses(propType, {
|
|
52
|
-
content: "",
|
|
53
|
-
widgets: {},
|
|
54
|
-
images: {},
|
|
55
|
-
__type: "item",
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// We also leave the full object optional by default, like the propType
|
|
59
|
-
// primitives.
|
|
60
|
-
assertPropTypePasses(propType, null);
|
|
61
|
-
|
|
62
|
-
// But specifying a bad type for any field will fail the propType.
|
|
63
|
-
assertPropTypeFails(propType, {content: 1, __type: "item"});
|
|
64
|
-
assertPropTypeFails(propType, {widgets: 1, __type: "item"});
|
|
65
|
-
assertPropTypeFails(propType, {images: 1, __type: "item"});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("validates a hint node", () => {
|
|
69
|
-
const propType = buildPropTypeForShape(shapes.hint);
|
|
70
|
-
|
|
71
|
-
// Perseus has default values for all hint fields, so all except the
|
|
72
|
-
// type are optional.
|
|
73
|
-
assertPropTypePasses(propType, {__type: "hint"});
|
|
74
|
-
assertPropTypePasses(propType, {
|
|
75
|
-
content: "",
|
|
76
|
-
widgets: {},
|
|
77
|
-
images: {},
|
|
78
|
-
replace: false,
|
|
79
|
-
__type: "hint",
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// We also leave the full object optional by default, like the propType
|
|
83
|
-
// primitives.
|
|
84
|
-
assertPropTypePasses(propType, null);
|
|
85
|
-
|
|
86
|
-
// But specifying a bad type for any field will fail the propType.
|
|
87
|
-
assertPropTypeFails(propType, {content: 1, __type: "hint"});
|
|
88
|
-
assertPropTypeFails(propType, {widgets: 1, __type: "hint"});
|
|
89
|
-
assertPropTypeFails(propType, {images: 1, __type: "hint"});
|
|
90
|
-
assertPropTypeFails(propType, {replace: 1, __type: "hint"});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it("validates an array", () => {
|
|
94
|
-
const propType = buildPropTypeForShape(shapes.arrayOf(shapes.content));
|
|
95
|
-
const emptyItem = {__type: "content"} as const;
|
|
96
|
-
|
|
97
|
-
assertPropTypePasses(propType, []);
|
|
98
|
-
assertPropTypePasses(propType, [emptyItem, emptyItem, emptyItem]);
|
|
99
|
-
|
|
100
|
-
// While the array itself is optional, its elements are required.
|
|
101
|
-
assertPropTypePasses(propType, null);
|
|
102
|
-
assertPropTypeFails(propType, [emptyItem, null, emptyItem]);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("validates tags", () => {
|
|
106
|
-
const propType = buildPropTypeForShape(shapes.tags);
|
|
107
|
-
|
|
108
|
-
assertPropTypePasses(propType, []);
|
|
109
|
-
assertPropTypePasses(propType, ["a", "b", "c"]);
|
|
110
|
-
|
|
111
|
-
assertPropTypePasses(propType, null);
|
|
112
|
-
assertPropTypeFails(propType, ["a", null, "b"]);
|
|
113
|
-
assertPropTypeFails(propType, [1, 2, 3]);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it("validates an object", () => {
|
|
117
|
-
const propType = buildPropTypeForShape(
|
|
118
|
-
shapes.shape({
|
|
119
|
-
a: shapes.content,
|
|
120
|
-
b: shapes.content,
|
|
121
|
-
}),
|
|
122
|
-
);
|
|
123
|
-
const emptyItem = {__type: "content"} as const;
|
|
124
|
-
|
|
125
|
-
assertPropTypePasses(propType, {a: emptyItem, b: emptyItem});
|
|
126
|
-
|
|
127
|
-
// While the object itself is optional, its fields are required.
|
|
128
|
-
assertPropTypePasses(propType, null);
|
|
129
|
-
assertPropTypeFails(propType, {});
|
|
130
|
-
assertPropTypeFails(propType, {a: emptyItem});
|
|
131
|
-
assertPropTypeFails(propType, {b: emptyItem});
|
|
132
|
-
});
|
|
133
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import shapes from "../shapes";
|
|
2
|
-
|
|
3
|
-
describe("shapes.content", () => {
|
|
4
|
-
it('has type "content"', () => {
|
|
5
|
-
const shape = shapes.content;
|
|
6
|
-
expect("content").toEqual(shape.type);
|
|
7
|
-
});
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
describe("shapes.hint", () => {
|
|
11
|
-
it('has type "hint"', () => {
|
|
12
|
-
const shape = shapes.hint;
|
|
13
|
-
expect("hint").toEqual(shape.type);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
describe("shapes.arrayOf", () => {
|
|
18
|
-
it('has type "array"', () => {
|
|
19
|
-
const shape = shapes.arrayOf(shapes.content);
|
|
20
|
-
expect("array").toEqual(shape.type);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("has the given shape as its `elementShape` property", () => {
|
|
24
|
-
const shape = shapes.arrayOf(shapes.content);
|
|
25
|
-
expect(shapes.content).toEqual(shape.elementShape);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe("shapes.shape", () => {
|
|
30
|
-
it('has type "object"', () => {
|
|
31
|
-
const shape = shapes.shape({});
|
|
32
|
-
expect("object").toEqual(shape.type);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("has the given shapes as its `shape` property", () => {
|
|
36
|
-
const shape = shapes.shape({
|
|
37
|
-
foo: shapes.content,
|
|
38
|
-
bar: shapes.hint,
|
|
39
|
-
});
|
|
40
|
-
expect(shapes.content).toEqual(shape.shape.foo);
|
|
41
|
-
expect(shapes.hint).toEqual(shape.shape.bar);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
import shapes from "../shapes";
|
|
2
|
-
import {buildMapper} from "../trees";
|
|
3
|
-
|
|
4
|
-
import type {
|
|
5
|
-
ItemTree,
|
|
6
|
-
ContentNode,
|
|
7
|
-
HintNode,
|
|
8
|
-
TagsNode,
|
|
9
|
-
ItemArrayNode,
|
|
10
|
-
} from "../item-types";
|
|
11
|
-
import type {TreeMapper} from "../trees";
|
|
12
|
-
|
|
13
|
-
describe("buildMapper", () => {
|
|
14
|
-
function content(n): ContentNode {
|
|
15
|
-
return {
|
|
16
|
-
__type: "content",
|
|
17
|
-
content: `content ${n}`,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function hint(n: number): HintNode {
|
|
22
|
-
return {
|
|
23
|
-
__type: "hint",
|
|
24
|
-
content: `hint ${n}`,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function tags(...elements): TagsNode {
|
|
29
|
-
// This function mostly exists as a shorthand way to clarify to TypeScript
|
|
30
|
-
// that this is a TagsNode, not a confused ItemArrayNode.
|
|
31
|
-
return elements;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function array(...elements): ItemArrayNode {
|
|
35
|
-
// This function mostly exists as a shorthand way to clarify to TypeScript
|
|
36
|
-
// that this is an ItemArrayNode, not a confused TagsNode.
|
|
37
|
-
/**
|
|
38
|
-
* TODO(somewhatabstract, JIRA-XXXX):
|
|
39
|
-
* The Tree types are really hard to work with properly.
|
|
40
|
-
*/
|
|
41
|
-
return elements;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const shape = shapes.shape({
|
|
45
|
-
a: shapes.content,
|
|
46
|
-
b: shapes.arrayOf(shapes.content),
|
|
47
|
-
c: shapes.shape({
|
|
48
|
-
d: shapes.content,
|
|
49
|
-
e: shapes.hint,
|
|
50
|
-
}),
|
|
51
|
-
f: shapes.hint,
|
|
52
|
-
g: shapes.tags,
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const tree: ItemTree = {
|
|
56
|
-
a: content(1),
|
|
57
|
-
b: array(content(2), content(3), content(4)),
|
|
58
|
-
c: {
|
|
59
|
-
d: content(5),
|
|
60
|
-
e: hint(6),
|
|
61
|
-
},
|
|
62
|
-
f: hint(7),
|
|
63
|
-
g: tags("foo", "bar"),
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
it("calls the content mapper for each of the content nodes", () => {
|
|
67
|
-
const calledWith = [];
|
|
68
|
-
buildMapper()
|
|
69
|
-
// @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
|
|
70
|
-
.setContentMapper((c) => calledWith.push(c))
|
|
71
|
-
.mapTree(tree, shape);
|
|
72
|
-
calledWith.sort();
|
|
73
|
-
|
|
74
|
-
expect([
|
|
75
|
-
content(1),
|
|
76
|
-
content(2),
|
|
77
|
-
content(3),
|
|
78
|
-
content(4),
|
|
79
|
-
content(5),
|
|
80
|
-
]).toEqual(calledWith);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("calls the hint mapper for each of the hint nodes", () => {
|
|
84
|
-
const calledWith = [];
|
|
85
|
-
buildMapper()
|
|
86
|
-
// @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
|
|
87
|
-
.setHintMapper((h) => calledWith.push(h))
|
|
88
|
-
.mapTree(tree, shape);
|
|
89
|
-
calledWith.sort();
|
|
90
|
-
|
|
91
|
-
expect([hint(6), hint(7)]).toEqual(calledWith);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("calls the tags mapper for each of the tags nodes", () => {
|
|
95
|
-
const calledWith: Array<TagsNode | any> = [];
|
|
96
|
-
buildMapper()
|
|
97
|
-
.setTagsMapper((t) => calledWith.push(t))
|
|
98
|
-
.mapTree(tree, shape);
|
|
99
|
-
calledWith.sort();
|
|
100
|
-
|
|
101
|
-
expect([["foo", "bar"]]).toEqual(calledWith);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("returns a mapped tree with the correct shape", () => {
|
|
105
|
-
const mapper: TreeMapper<
|
|
106
|
-
ContentNode,
|
|
107
|
-
string,
|
|
108
|
-
HintNode,
|
|
109
|
-
string,
|
|
110
|
-
TagsNode,
|
|
111
|
-
string
|
|
112
|
-
> = buildMapper()
|
|
113
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
114
|
-
.setContentMapper((c) => `mapped content: ${c.content || "<none>"}`)
|
|
115
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
116
|
-
.setHintMapper((h) => `mapped hint: ${h.content || "<none>"}`)
|
|
117
|
-
.setTagsMapper((t) => `mapped tags: ${t.join(", ")}`);
|
|
118
|
-
const result = mapper.mapTree(tree, shape);
|
|
119
|
-
|
|
120
|
-
expect({
|
|
121
|
-
a: "mapped content: content 1",
|
|
122
|
-
b: [
|
|
123
|
-
"mapped content: content 2",
|
|
124
|
-
"mapped content: content 3",
|
|
125
|
-
"mapped content: content 4",
|
|
126
|
-
],
|
|
127
|
-
c: {
|
|
128
|
-
d: "mapped content: content 5",
|
|
129
|
-
e: "mapped hint: hint 6",
|
|
130
|
-
},
|
|
131
|
-
f: "mapped hint: hint 7",
|
|
132
|
-
g: "mapped tags: foo, bar",
|
|
133
|
-
}).toEqual(result);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it("provides each node shape to the leaf mappers", () => {
|
|
137
|
-
// Return the type of the shape of the node in place of each node.
|
|
138
|
-
const result = buildMapper()
|
|
139
|
-
.setContentMapper((_, s) => s.type)
|
|
140
|
-
.setHintMapper((_, s) => s.type)
|
|
141
|
-
.setTagsMapper((_, s) => s.type)
|
|
142
|
-
.mapTree(tree, shape);
|
|
143
|
-
|
|
144
|
-
expect({
|
|
145
|
-
a: "content",
|
|
146
|
-
b: ["content", "content", "content"],
|
|
147
|
-
c: {
|
|
148
|
-
d: "content",
|
|
149
|
-
e: "hint",
|
|
150
|
-
},
|
|
151
|
-
f: "hint",
|
|
152
|
-
g: "tags",
|
|
153
|
-
}).toEqual(result);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("provides each node path to the leaf mappers", () => {
|
|
157
|
-
// Return the path to the node in place of each node.
|
|
158
|
-
const result = buildMapper()
|
|
159
|
-
.setContentMapper((_, __, p) => p)
|
|
160
|
-
.setHintMapper((_, __, p) => p)
|
|
161
|
-
.setTagsMapper((_, __, p) => p)
|
|
162
|
-
.mapTree(tree, shape);
|
|
163
|
-
|
|
164
|
-
expect({
|
|
165
|
-
a: ["a"],
|
|
166
|
-
b: [
|
|
167
|
-
["b", 0],
|
|
168
|
-
["b", 1],
|
|
169
|
-
["b", 2],
|
|
170
|
-
],
|
|
171
|
-
c: {
|
|
172
|
-
d: ["c", "d"],
|
|
173
|
-
e: ["c", "e"],
|
|
174
|
-
},
|
|
175
|
-
f: ["f"],
|
|
176
|
-
g: ["g"],
|
|
177
|
-
}).toEqual(result);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it("handles recursive objects", () => {
|
|
181
|
-
const shape = shapes.shape({
|
|
182
|
-
a: shapes.shape({
|
|
183
|
-
b: shapes.shape({
|
|
184
|
-
c: shapes.content,
|
|
185
|
-
}),
|
|
186
|
-
}),
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
const tree = {a: {b: {c: content(1)}}} as const;
|
|
190
|
-
|
|
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
|
-
const mapper: TreeMapper<
|
|
193
|
-
ContentNode,
|
|
194
|
-
string | null | undefined,
|
|
195
|
-
HintNode,
|
|
196
|
-
HintNode,
|
|
197
|
-
TagsNode,
|
|
198
|
-
TagsNode
|
|
199
|
-
> = buildMapper().setContentMapper((c) => c.content);
|
|
200
|
-
const result = mapper.mapTree(tree, shape);
|
|
201
|
-
|
|
202
|
-
expect({a: {b: {c: "content 1"}}}).toEqual(result);
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it("handles recursive arrays", () => {
|
|
206
|
-
const shape = shapes.arrayOf(
|
|
207
|
-
shapes.arrayOf(shapes.arrayOf(shapes.content)),
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
const tree = array(
|
|
211
|
-
array(array(content(0)), array(content(1))),
|
|
212
|
-
array(array(content(2)), array(content(3), content(4))),
|
|
213
|
-
);
|
|
214
|
-
|
|
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
|
-
const mapper: TreeMapper<
|
|
217
|
-
ContentNode,
|
|
218
|
-
string | null | undefined,
|
|
219
|
-
HintNode,
|
|
220
|
-
HintNode,
|
|
221
|
-
TagsNode,
|
|
222
|
-
TagsNode
|
|
223
|
-
> = buildMapper().setContentMapper((c) => c.content);
|
|
224
|
-
const result = mapper.mapTree(tree, shape);
|
|
225
|
-
|
|
226
|
-
expect([
|
|
227
|
-
[["content 0"], ["content 1"]],
|
|
228
|
-
[["content 2"], ["content 3", "content 4"]],
|
|
229
|
-
]).toEqual(result);
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it("handles empty arrays", () => {
|
|
233
|
-
const shape = shapes.arrayOf(shapes.arrayOf(shapes.content));
|
|
234
|
-
|
|
235
|
-
const tree = array(array(), array(content(1)), array());
|
|
236
|
-
|
|
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
|
-
const mapper: TreeMapper<
|
|
239
|
-
ContentNode,
|
|
240
|
-
string | null | undefined,
|
|
241
|
-
HintNode,
|
|
242
|
-
HintNode,
|
|
243
|
-
TagsNode,
|
|
244
|
-
TagsNode
|
|
245
|
-
> = buildMapper().setContentMapper((c) => c.content);
|
|
246
|
-
|
|
247
|
-
// Test the outer array being empty.
|
|
248
|
-
expect([]).toEqual(mapper.mapTree(array(), shape));
|
|
249
|
-
|
|
250
|
-
// Test inner arrays being empty.
|
|
251
|
-
const result = mapper.mapTree(tree, shape);
|
|
252
|
-
expect([[], ["content 1"], []]).toEqual(result);
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
it("calls the array mapper for arrays", () => {
|
|
256
|
-
const shape = shapes.arrayOf(shapes.content);
|
|
257
|
-
const tree = array(content(1), content(2), content(3));
|
|
258
|
-
|
|
259
|
-
let wasCalled = false;
|
|
260
|
-
let callArgs: Record<string, any> = {};
|
|
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
|
-
const mapper: TreeMapper<
|
|
263
|
-
ContentNode,
|
|
264
|
-
string | null | undefined,
|
|
265
|
-
HintNode,
|
|
266
|
-
HintNode,
|
|
267
|
-
TagsNode,
|
|
268
|
-
TagsNode
|
|
269
|
-
> = buildMapper()
|
|
270
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
271
|
-
.setContentMapper((c) => c.content)
|
|
272
|
-
.setArrayMapper((mappedArray, originalArray, shape, path) => {
|
|
273
|
-
wasCalled = true;
|
|
274
|
-
callArgs = {mappedArray, originalArray, shape, path};
|
|
275
|
-
return mappedArray;
|
|
276
|
-
});
|
|
277
|
-
mapper.mapTree(tree, shape);
|
|
278
|
-
|
|
279
|
-
expect(wasCalled).toBeTruthy();
|
|
280
|
-
|
|
281
|
-
expect(["content 1", "content 2", "content 3"]).toEqual(
|
|
282
|
-
callArgs.mappedArray,
|
|
283
|
-
);
|
|
284
|
-
expect(tree).toEqual(callArgs.originalArray);
|
|
285
|
-
expect(shape).toEqual(callArgs.shape);
|
|
286
|
-
expect([]).toEqual(callArgs.path);
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
it("uses the array mapper return value to construct the new tree", () => {
|
|
290
|
-
const mapper = buildMapper()
|
|
291
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
292
|
-
.setContentMapper((c) => c.content)
|
|
293
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
294
|
-
.setHintMapper((h) => h.content)
|
|
295
|
-
// @ts-expect-error - TS2571 - Object is of type 'unknown'.
|
|
296
|
-
.setTagsMapper((t) => t.join(", "))
|
|
297
|
-
.setArrayMapper((mappedArray, originalArray, shape, path) => {
|
|
298
|
-
return mappedArray.map((child) => `${String(child)} in array`);
|
|
299
|
-
});
|
|
300
|
-
const result = mapper.mapTree(tree, shape);
|
|
301
|
-
|
|
302
|
-
expect({
|
|
303
|
-
a: "content 1",
|
|
304
|
-
b: [
|
|
305
|
-
"content 2 in array",
|
|
306
|
-
"content 3 in array",
|
|
307
|
-
"content 4 in array",
|
|
308
|
-
],
|
|
309
|
-
c: {
|
|
310
|
-
d: "content 5",
|
|
311
|
-
e: "hint 6",
|
|
312
|
-
},
|
|
313
|
-
f: "hint 7",
|
|
314
|
-
g: "foo, bar",
|
|
315
|
-
}).toEqual(result);
|
|
316
|
-
});
|
|
317
|
-
});
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for multi-item types, including:
|
|
3
|
-
*
|
|
4
|
-
* - Item: A multi-item tree wrapped in a `_multi` key, to help us recognize it
|
|
5
|
-
* as a multi-item in other contexts and avoid misinterpreting its
|
|
6
|
-
* other properties.
|
|
7
|
-
* - ItemTree: A multi-item without the `_multi` key. Conforms to the Tree
|
|
8
|
-
* interface, so it's compatible with our tree traversal functions.
|
|
9
|
-
* - And the various types of nodes that compose a tree.
|
|
10
|
-
*/
|
|
11
|
-
import type {Tree, ArrayNode, ObjectNode} from "./tree-types";
|
|
12
|
-
import type {WidgetDict, ImageDict} from "../types";
|
|
13
|
-
|
|
14
|
-
export type ContentNode = {
|
|
15
|
-
// TODO(mdr): When we first drafted the multi-item feature, we named
|
|
16
|
-
// content nodes "item" nodes, and later decided the term was
|
|
17
|
-
// ambiguous and switched to "content". But we're temporarily keeping
|
|
18
|
-
// support for the "item" string when inferring item shape, so that we
|
|
19
|
-
// don't crash on multi-items we've already created - but all new
|
|
20
|
-
// content nodes will be generated with the "content" string.
|
|
21
|
-
//
|
|
22
|
-
// Code blocks that enable this legacy support are greppable with the
|
|
23
|
-
// keyword #LegacyContentNode.
|
|
24
|
-
__type: "content" | "item";
|
|
25
|
-
// Perseus has default values for these fields, so they're all optional.
|
|
26
|
-
content?: string | null | undefined;
|
|
27
|
-
images?: ImageDict | null | undefined;
|
|
28
|
-
widgets?: WidgetDict | null | undefined;
|
|
29
|
-
};
|
|
30
|
-
export type HintNode = {
|
|
31
|
-
__type: "hint";
|
|
32
|
-
// Perseus has default values for these fields, so they're all optional.
|
|
33
|
-
content?: string | null | undefined;
|
|
34
|
-
images?: ImageDict | null | undefined;
|
|
35
|
-
widgets?: WidgetDict | null | undefined;
|
|
36
|
-
replace?: boolean | null | undefined;
|
|
37
|
-
};
|
|
38
|
-
export type TagsNode = ReadonlyArray<string>;
|
|
39
|
-
|
|
40
|
-
// @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
|
|
41
|
-
export type ItemArrayNode = ArrayNode<ContentNode, HintNode, TagsNode>;
|
|
42
|
-
export type ItemObjectNode = ObjectNode<ContentNode, HintNode, TagsNode>;
|
|
43
|
-
// @ts-expect-error - TS2315 - Type 'Tree' is not generic.
|
|
44
|
-
export type ItemTree = Tree<ContentNode, HintNode, TagsNode>;
|
|
45
|
-
|
|
46
|
-
// TODO(jeremy): I think we could refine this root type for multi items. Right
|
|
47
|
-
// now a _multi's value can be _anything_ including "primitive" node types such
|
|
48
|
-
// as "type: content" or "type: hint". That doesn't seem to match the shapes
|
|
49
|
-
// that are in use to date. We could also move to a strict type at that point
|
|
50
|
-
// because it appears that we _never_ add other root keys to an item that
|
|
51
|
-
// specifies the `_multi` key. I think we'd be safe to restrict this root
|
|
52
|
-
// object type to something like the following:
|
|
53
|
-
// export type Item = {|_multi: ItemArrayNode | ItemObjectNode|};
|
|
54
|
-
export type Item = {
|
|
55
|
-
_multi: ItemTree;
|
|
56
|
-
};
|