@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.
Files changed (390) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/article-renderer.d.ts +27 -40
  3. package/dist/components/math-input.d.ts +1 -1
  4. package/dist/components/sortable.d.ts +1 -1
  5. package/dist/components/tex-buttons.d.ts +1 -1
  6. package/dist/dependencies.d.ts +7 -1
  7. package/dist/es/index.js +1205 -1218
  8. package/dist/es/index.js.map +1 -1
  9. package/dist/hints-renderer.d.ts +1 -1
  10. package/dist/index.js +1207 -1221
  11. package/dist/index.js.map +1 -1
  12. package/dist/interaction-tracker.d.ts +3 -3
  13. package/dist/item-renderer.d.ts +2 -1
  14. package/dist/mixins/provide-keypad.d.ts +15 -12
  15. package/dist/multi-items/multi-renderer.d.ts +2 -1
  16. package/dist/perseus-api.d.ts +2 -2
  17. package/dist/renderer.d.ts +1 -1
  18. package/dist/server-item-renderer.d.ts +3 -1
  19. package/dist/types.d.ts +32 -11
  20. package/dist/widgets/expression.d.ts +410 -13
  21. package/dist/widgets/graded-group.d.ts +3 -3
  22. package/dist/widgets/interactive-graph.d.ts +1 -1
  23. package/dist/widgets/sequence.d.ts +3 -3
  24. package/dist/widgets/table.d.ts +8 -1
  25. package/dist/widgets.d.ts +1 -1
  26. package/package.json +34 -34
  27. package/src/__stories__/article-renderer.stories.tsx +35 -2
  28. package/src/__testdata__/article-renderer.testdata.ts +74 -1
  29. package/src/__testdata__/item-renderer.testdata.ts +1 -1
  30. package/src/__testdata__/renderer.testdata.ts +1 -1
  31. package/src/__tests__/item-renderer.test.tsx +13 -2
  32. package/src/__tests__/mock-asset-loading-widget.tsx +1 -1
  33. package/src/__tests__/perseus-markdown.test.ts +17 -17
  34. package/src/__tests__/renderer-api.test.tsx +21 -21
  35. package/src/__tests__/renderer.test.tsx +13 -13
  36. package/src/__tests__/server-item-renderer.test.tsx +12 -4
  37. package/src/__tests__/tex-wrangler.test.ts +1 -1
  38. package/src/article-renderer.tsx +75 -66
  39. package/src/components/__tests__/number-input.test.tsx +4 -4
  40. package/src/components/__tests__/sortable.test.tsx +2 -2
  41. package/src/components/fixed-to-responsive.tsx +1 -1
  42. package/src/components/graph.tsx +11 -11
  43. package/src/components/graphie-classes.ts +7 -7
  44. package/src/components/graphie.tsx +14 -14
  45. package/src/components/highlighting/highlightable-content.tsx +1 -1
  46. package/src/components/highlighting/ui/highlight-renderer.tsx +1 -1
  47. package/src/components/highlighting/ui/util.ts +2 -2
  48. package/src/components/highlighting/word-indexer.tsx +4 -4
  49. package/src/components/icon.tsx +1 -1
  50. package/src/components/image-loader.tsx +4 -4
  51. package/src/components/input-with-examples.tsx +2 -2
  52. package/src/components/lint.tsx +1 -1
  53. package/src/components/math-input.tsx +5 -5
  54. package/src/components/math-output.tsx +1 -1
  55. package/src/components/multi-button-group.tsx +1 -1
  56. package/src/components/number-input.tsx +10 -10
  57. package/src/components/prop-check-box.tsx +1 -1
  58. package/src/components/simple-keypad-input.tsx +4 -4
  59. package/src/components/sortable.tsx +42 -41
  60. package/src/components/svg-image.tsx +12 -12
  61. package/src/components/tex-buttons.tsx +4 -3
  62. package/src/components/text-input.tsx +8 -8
  63. package/src/components/text-list-editor.tsx +11 -11
  64. package/src/components/visibility-observer/create-visibility-observer.ts +1 -1
  65. package/src/components/visibility-observer/visibility-observer.tsx +2 -2
  66. package/src/components/zoomable-tex.tsx +3 -3
  67. package/src/components/zoomable.tsx +8 -8
  68. package/src/dependencies.ts +16 -1
  69. package/src/hint-renderer.tsx +3 -3
  70. package/src/hints-renderer.tsx +11 -11
  71. package/src/init.ts +1 -1
  72. package/src/interaction-tracker.ts +7 -7
  73. package/src/interactive2/__tests__/movable-point.test.ts +1 -1
  74. package/src/interactive2/interactive-util.ts +6 -6
  75. package/src/interactive2/movable-helper-methods.ts +2 -2
  76. package/src/interactive2/movable-line-options.ts +37 -37
  77. package/src/interactive2/movable-line.ts +2 -2
  78. package/src/interactive2/movable-point-options.ts +29 -29
  79. package/src/interactive2/movable-point.tsx +2 -2
  80. package/src/interactive2/movable-polygon-options.ts +45 -45
  81. package/src/interactive2/movable-polygon.ts +2 -2
  82. package/src/interactive2/movable.ts +2 -2
  83. package/src/interactive2/objective_.ts +1 -1
  84. package/src/interactive2/wrapped-defaults.ts +2 -2
  85. package/src/interactive2/wrapped-ellipse.ts +9 -9
  86. package/src/interactive2/wrapped-line.ts +8 -8
  87. package/src/interactive2/wrapped-path.ts +5 -5
  88. package/src/item-renderer.tsx +66 -48
  89. package/src/mixins/changeable.ts +2 -2
  90. package/src/mixins/editor-jsonify.ts +1 -1
  91. package/src/mixins/provide-keypad.tsx +23 -37
  92. package/src/mixins/widget-jsonify-deprecated.ts +1 -1
  93. package/src/multi-items/__tests__/items.test.ts +1 -1
  94. package/src/multi-items/__tests__/multi-renderer.test.tsx +13 -8
  95. package/src/multi-items/__tests__/trees.test.ts +12 -12
  96. package/src/multi-items/item-types.ts +2 -2
  97. package/src/multi-items/items.ts +1 -1
  98. package/src/multi-items/multi-renderer.tsx +30 -18
  99. package/src/multi-items/prop-type-builders.ts +2 -2
  100. package/src/multi-items/tree-types.ts +4 -4
  101. package/src/multi-items/trees.ts +16 -16
  102. package/src/perseus-env.ts +2 -2
  103. package/src/perseus-markdown.tsx +5 -5
  104. package/src/renderer.tsx +39 -39
  105. package/src/server-item-renderer.tsx +26 -21
  106. package/src/sigfigs.ts +1 -1
  107. package/src/traversal.ts +1 -1
  108. package/src/types.ts +52 -16
  109. package/src/util/answer-types.ts +14 -14
  110. package/src/util/geometry.ts +7 -7
  111. package/src/util/graphie.ts +32 -32
  112. package/src/util/interactive.ts +118 -118
  113. package/src/util/math.ts +4 -4
  114. package/src/util/react-render.tsx +1 -1
  115. package/src/util/scroll-utils.ts +2 -2
  116. package/src/util/tex.ts +3 -3
  117. package/src/util.ts +15 -15
  118. package/src/widget-container.tsx +1 -1
  119. package/src/widgets/__stories__/definition.stories.tsx +8 -1
  120. package/src/widgets/__stories__/expression.stories.tsx +2 -2
  121. package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +3 -3
  122. package/src/widgets/__testdata__/numeric-input.testdata.ts +1 -1
  123. package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +2 -2
  124. package/src/widgets/__tests__/{expression.test.ts → expression.test.tsx} +77 -11
  125. package/src/widgets/__tests__/grapher.cypress.ts +32 -32
  126. package/src/widgets/__tests__/group.test.tsx +1 -1
  127. package/src/widgets/__tests__/interactive-graph.cypress.ts +40 -40
  128. package/src/widgets/__tests__/interactive-graph.test.ts +1 -1
  129. package/src/widgets/__tests__/numeric-input.test.ts +1 -1
  130. package/src/widgets/__tests__/passage.test.tsx +2 -2
  131. package/src/widgets/__tests__/plotter.test.tsx +2 -1
  132. package/src/widgets/__tests__/radio/base-radio.test.tsx +7 -7
  133. package/src/widgets/__tests__/renderQuestion.tsx +29 -21
  134. package/src/widgets/categorizer.tsx +4 -4
  135. package/src/widgets/cs-program.tsx +2 -2
  136. package/src/widgets/dropdown.tsx +1 -1
  137. package/src/widgets/expression.tsx +92 -57
  138. package/src/widgets/graded-group-set.tsx +5 -5
  139. package/src/widgets/graded-group.tsx +29 -21
  140. package/src/widgets/grapher/util.tsx +6 -6
  141. package/src/widgets/grapher.tsx +10 -10
  142. package/src/widgets/group.tsx +3 -3
  143. package/src/widgets/iframe.tsx +2 -2
  144. package/src/widgets/image.tsx +1 -1
  145. package/src/widgets/input-number.tsx +4 -4
  146. package/src/widgets/interaction.tsx +77 -77
  147. package/src/widgets/interactive-graph.tsx +109 -107
  148. package/src/widgets/label-image/marker.tsx +2 -2
  149. package/src/widgets/label-image.test.ts +1 -1
  150. package/src/widgets/label-image.tsx +7 -7
  151. package/src/widgets/lights-puzzle.tsx +2 -2
  152. package/src/widgets/matcher.tsx +6 -6
  153. package/src/widgets/matrix.tsx +20 -20
  154. package/src/widgets/measurer.tsx +3 -3
  155. package/src/widgets/molecule/__tests__/layout.test.ts +4 -4
  156. package/src/widgets/molecule/__tests__/parser.test.ts +14 -14
  157. package/src/widgets/molecule/smiles-parser.ts +3 -3
  158. package/src/widgets/molecule.tsx +4 -4
  159. package/src/widgets/number-line.tsx +11 -11
  160. package/src/widgets/numeric-input.tsx +11 -11
  161. package/src/widgets/orderer.tsx +38 -38
  162. package/src/widgets/passage/__tests__/passage-markdown.test.ts +1 -1
  163. package/src/widgets/passage/passage-markdown.tsx +4 -4
  164. package/src/widgets/passage-ref-target.tsx +1 -1
  165. package/src/widgets/passage-ref.tsx +4 -6
  166. package/src/widgets/passage.tsx +11 -11
  167. package/src/widgets/plotter.tsx +9 -9
  168. package/src/widgets/radio/base-radio.tsx +11 -11
  169. package/src/widgets/radio/choice-icon/choice-icon.tsx +2 -2
  170. package/src/widgets/radio/choice.tsx +1 -1
  171. package/src/widgets/radio/option-status.tsx +1 -1
  172. package/src/widgets/radio/widget.tsx +6 -6
  173. package/src/widgets/radio.ts +1 -1
  174. package/src/widgets/reaction-diagram.tsx +8 -8
  175. package/src/widgets/sequence.tsx +12 -4
  176. package/src/widgets/simulator.tsx +14 -14
  177. package/src/widgets/sorter.tsx +4 -4
  178. package/src/widgets/table.tsx +8 -8
  179. package/src/widgets/transformer.tsx +92 -92
  180. package/src/widgets/unit.tsx +17 -17
  181. package/src/widgets/video-transcript-link.test.tsx +3 -3
  182. package/src/widgets/video-transcript-link.tsx +1 -1
  183. package/src/widgets/video.tsx +1 -1
  184. package/src/widgets.ts +5 -5
  185. package/src/zoom.ts +22 -22
  186. package/tsconfig-build.tsbuildinfo +1 -1
  187. package/dist/a11y.js.flow +0 -11
  188. package/dist/all-widgets.js.flow +0 -33
  189. package/dist/article-renderer.js.flow +0 -73
  190. package/dist/asset-context.js.flow +0 -15
  191. package/dist/basic-widgets.js.flow +0 -33
  192. package/dist/components/button-group.js.flow +0 -33
  193. package/dist/components/constants.js.flow +0 -13
  194. package/dist/components/fixed-to-responsive.js.flow +0 -34
  195. package/dist/components/graph.js.flow +0 -66
  196. package/dist/components/graphie-classes.js.flow +0 -19
  197. package/dist/components/graphie-movables.js.flow +0 -22
  198. package/dist/components/graphie.js.flow +0 -69
  199. package/dist/components/highlighting/highlightable-content.js.flow +0 -56
  200. package/dist/components/highlighting/highlights.js.flow +0 -54
  201. package/dist/components/highlighting/ranges.js.flow +0 -60
  202. package/dist/components/highlighting/types.js.flow +0 -70
  203. package/dist/components/highlighting/ui/highlight-renderer.js.flow +0 -43
  204. package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +0 -41
  205. package/dist/components/highlighting/ui/highlight-tooltip.js.flow +0 -22
  206. package/dist/components/highlighting/ui/highlighting-ui.js.flow +0 -30
  207. package/dist/components/highlighting/ui/selection-tracker.js.flow +0 -54
  208. package/dist/components/highlighting/ui/types.js.flow +0 -22
  209. package/dist/components/highlighting/ui/util.js.flow +0 -42
  210. package/dist/components/highlighting/word-indexer.js.flow +0 -21
  211. package/dist/components/hud.js.flow +0 -14
  212. package/dist/components/icon.js.flow +0 -31
  213. package/dist/components/image-loader.js.flow +0 -49
  214. package/dist/components/info-tip/info-tip.js.flow +0 -20
  215. package/dist/components/info-tip.js.flow +0 -18
  216. package/dist/components/inline-icon.js.flow +0 -39
  217. package/dist/components/input-with-examples.js.flow +0 -58
  218. package/dist/components/lint.js.flow +0 -58
  219. package/dist/components/math-input.js.flow +0 -49
  220. package/dist/components/math-output.js.flow +0 -33
  221. package/dist/components/multi-button-group.js.flow +0 -35
  222. package/dist/components/number-input.js.flow +0 -42
  223. package/dist/components/prop-check-box.js.flow +0 -8
  224. package/dist/components/range-input.js.flow +0 -20
  225. package/dist/components/simple-keypad-input.js.flow +0 -16
  226. package/dist/components/sortable.js.flow +0 -91
  227. package/dist/components/stub-tag-editor.js.flow +0 -18
  228. package/dist/components/svg-image.js.flow +0 -85
  229. package/dist/components/tex-buttons.js.flow +0 -26
  230. package/dist/components/tex.js.flow +0 -25
  231. package/dist/components/text-input.js.flow +0 -39
  232. package/dist/components/text-list-editor.js.flow +0 -22
  233. package/dist/components/tooltip.js.flow +0 -51
  234. package/dist/components/visibility-observer/create-visibility-observer.js.flow +0 -23
  235. package/dist/components/visibility-observer/get-scroll-parent.js.flow +0 -7
  236. package/dist/components/visibility-observer/visibility-observer.js.flow +0 -36
  237. package/dist/components/zoomable-tex.js.flow +0 -18
  238. package/dist/components/zoomable.js.flow +0 -70
  239. package/dist/components.js.flow +0 -22
  240. package/dist/definition-context.js.flow +0 -25
  241. package/dist/dependencies.js.flow +0 -9
  242. package/dist/error-boundary.js.flow +0 -19
  243. package/dist/extra-widgets.js.flow +0 -33
  244. package/dist/hint-renderer.js.flow +0 -32
  245. package/dist/hints-renderer.js.flow +0 -41
  246. package/dist/icon-paths.js.flow +0 -123
  247. package/dist/index.js.flow +0 -134
  248. package/dist/init.js.flow +0 -20
  249. package/dist/interaction-tracker.js.flow +0 -35
  250. package/dist/interactive2/interactive-util.js.flow +0 -50
  251. package/dist/interactive2/movable-helper-methods.js.flow +0 -15
  252. package/dist/interactive2/movable-line-options.js.flow +0 -44
  253. package/dist/interactive2/movable-line.js.flow +0 -8
  254. package/dist/interactive2/movable-point-options.js.flow +0 -44
  255. package/dist/interactive2/movable-point.js.flow +0 -8
  256. package/dist/interactive2/movable-polygon-options.js.flow +0 -47
  257. package/dist/interactive2/movable-polygon.js.flow +0 -8
  258. package/dist/interactive2/movable.js.flow +0 -8
  259. package/dist/interactive2/objective_.js.flow +0 -25
  260. package/dist/interactive2/types.js.flow +0 -8
  261. package/dist/interactive2/wrapped-defaults.js.flow +0 -11
  262. package/dist/interactive2/wrapped-ellipse.js.flow +0 -14
  263. package/dist/interactive2/wrapped-line.js.flow +0 -14
  264. package/dist/interactive2/wrapped-path.js.flow +0 -13
  265. package/dist/interactive2.js.flow +0 -16
  266. package/dist/item-renderer.js.flow +0 -132
  267. package/dist/item-version.js.flow +0 -11
  268. package/dist/jipt-paragraphs.js.flow +0 -14
  269. package/dist/loading-context.js.flow +0 -12
  270. package/dist/logging/log.js.flow +0 -62
  271. package/dist/mixins/changeable.js.flow +0 -33
  272. package/dist/mixins/editor-jsonify.js.flow +0 -10
  273. package/dist/mixins/provide-keypad.js.flow +0 -33
  274. package/dist/mixins/widget-jsonify-deprecated.js.flow +0 -11
  275. package/dist/mixins/widget-prop-denylist.js.flow +0 -20
  276. package/dist/multi-items/item-types.js.flow +0 -55
  277. package/dist/multi-items/items.js.flow +0 -66
  278. package/dist/multi-items/multi-renderer.js.flow +0 -213
  279. package/dist/multi-items/prop-type-builders.js.flow +0 -22
  280. package/dist/multi-items/shape-types.js.flow +0 -60
  281. package/dist/multi-items/shapes.js.flow +0 -25
  282. package/dist/multi-items/tree-types.js.flow +0 -45
  283. package/dist/multi-items/trees.js.flow +0 -147
  284. package/dist/multi-items.js.flow +0 -36
  285. package/dist/perseus-api.js.flow +0 -151
  286. package/dist/perseus-env.js.flow +0 -6
  287. package/dist/perseus-error.js.flow +0 -16
  288. package/dist/perseus-markdown.js.flow +0 -20
  289. package/dist/perseus-types.js.flow +0 -1041
  290. package/dist/question-paragraph.js.flow +0 -17
  291. package/dist/renderability.js.flow +0 -19
  292. package/dist/renderer.js.flow +0 -325
  293. package/dist/server-item-renderer.js.flow +0 -132
  294. package/dist/sigfigs.js.flow +0 -41
  295. package/dist/styles/constants.js.flow +0 -62
  296. package/dist/styles/global-constants.js.flow +0 -348
  297. package/dist/styles/global-styles.js.flow +0 -53
  298. package/dist/styles/media-queries.js.flow +0 -35
  299. package/dist/styles/shared.js.flow +0 -8
  300. package/dist/tex-wrangler.js.flow +0 -13
  301. package/dist/translation-linter.js.flow +0 -32
  302. package/dist/traversal.js.flow +0 -26
  303. package/dist/types.js.flow +0 -318
  304. package/dist/util/a11y.js.flow +0 -8
  305. package/dist/util/answer-types.js.flow +0 -49
  306. package/dist/util/colors.js.flow +0 -95
  307. package/dist/util/fix-passage-refs.js.flow +0 -8
  308. package/dist/util/geometry.js.flow +0 -37
  309. package/dist/util/graph-utils.js.flow +0 -9
  310. package/dist/util/graphie.js.flow +0 -8
  311. package/dist/util/interactive.js.flow +0 -11
  312. package/dist/util/katex-preprocess.js.flow +0 -12
  313. package/dist/util/math.js.flow +0 -62
  314. package/dist/util/mobile-native-utils.js.flow +0 -12
  315. package/dist/util/react-render.js.flow +0 -12
  316. package/dist/util/register-all-widgets-for-testing.js.flow +0 -7
  317. package/dist/util/scroll-utils.js.flow +0 -19
  318. package/dist/util/sizing-utils.js.flow +0 -20
  319. package/dist/util/tex.js.flow +0 -17
  320. package/dist/util/url-utils.js.flow +0 -11
  321. package/dist/util.graphie.js.flow +0 -14
  322. package/dist/util.js.flow +0 -319
  323. package/dist/version.js.flow +0 -17
  324. package/dist/widget-container.js.flow +0 -33
  325. package/dist/widgets/categorizer.js.flow +0 -70
  326. package/dist/widgets/cs-program.js.flow +0 -54
  327. package/dist/widgets/definition.js.flow +0 -57
  328. package/dist/widgets/dropdown.js.flow +0 -63
  329. package/dist/widgets/explanation.js.flow +0 -58
  330. package/dist/widgets/expression.js.flow +0 -116
  331. package/dist/widgets/graded-group-answer-bar.js.flow +0 -24
  332. package/dist/widgets/graded-group-set.js.flow +0 -65
  333. package/dist/widgets/graded-group.js.flow +0 -78
  334. package/dist/widgets/grapher/util.js.flow +0 -38
  335. package/dist/widgets/grapher.js.flow +0 -102
  336. package/dist/widgets/group.js.flow +0 -60
  337. package/dist/widgets/iframe.js.flow +0 -53
  338. package/dist/widgets/image.js.flow +0 -73
  339. package/dist/widgets/input-number.js.flow +0 -94
  340. package/dist/widgets/interaction/arrow-picker.js.flow +0 -21
  341. package/dist/widgets/interaction/color-picker.js.flow +0 -23
  342. package/dist/widgets/interaction/dash-picker.js.flow +0 -21
  343. package/dist/widgets/interaction/element-container.js.flow +0 -28
  344. package/dist/widgets/interaction.js.flow +0 -60
  345. package/dist/widgets/interactive-graph.js.flow +0 -239
  346. package/dist/widgets/label-image/answer-choices.js.flow +0 -55
  347. package/dist/widgets/label-image/marker.js.flow +0 -31
  348. package/dist/widgets/label-image/types.js.flow +0 -23
  349. package/dist/widgets/label-image.js.flow +0 -142
  350. package/dist/widgets/lights-puzzle.js.flow +0 -58
  351. package/dist/widgets/matcher.js.flow +0 -106
  352. package/dist/widgets/matrix.js.flow +0 -80
  353. package/dist/widgets/measurer.js.flow +0 -30
  354. package/dist/widgets/molecule/molecule-drawing.js.flow +0 -11
  355. package/dist/widgets/molecule/molecule-layout.js.flow +0 -96
  356. package/dist/widgets/molecule/smiles-parser.js.flow +0 -26
  357. package/dist/widgets/molecule.js.flow +0 -60
  358. package/dist/widgets/number-line.js.flow +0 -102
  359. package/dist/widgets/numeric-input.js.flow +0 -105
  360. package/dist/widgets/orderer.js.flow +0 -81
  361. package/dist/widgets/passage/passage-markdown.js.flow +0 -33
  362. package/dist/widgets/passage-ref-target.js.flow +0 -52
  363. package/dist/widgets/passage-ref.js.flow +0 -85
  364. package/dist/widgets/passage.js.flow +0 -157
  365. package/dist/widgets/plotter.js.flow +0 -112
  366. package/dist/widgets/radio/base-radio.js.flow +0 -50
  367. package/dist/widgets/radio/choice-a11y-text.js.flow +0 -14
  368. package/dist/widgets/radio/choice-icon/choice-icon.js.flow +0 -22
  369. package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +0 -16
  370. package/dist/widgets/radio/choice-icon/shared-styles.js.flow +0 -11
  371. package/dist/widgets/radio/choice-none-above.js.flow +0 -16
  372. package/dist/widgets/radio/choice.js.flow +0 -29
  373. package/dist/widgets/radio/choice.jsx.fixture.js.flow +0 -7
  374. package/dist/widgets/radio/focus-ring.js.flow +0 -22
  375. package/dist/widgets/radio/option-status.js.flow +0 -16
  376. package/dist/widgets/radio/util.js.flow +0 -12
  377. package/dist/widgets/radio/widget.js.flow +0 -80
  378. package/dist/widgets/radio.js.flow +0 -31
  379. package/dist/widgets/reaction-diagram.js.flow +0 -46
  380. package/dist/widgets/sequence.js.flow +0 -53
  381. package/dist/widgets/simulator.js.flow +0 -107
  382. package/dist/widgets/sorter.js.flow +0 -102
  383. package/dist/widgets/table.js.flow +0 -67
  384. package/dist/widgets/transformer.js.flow +0 -127
  385. package/dist/widgets/unit.js.flow +0 -93
  386. package/dist/widgets/video-transcript-link.js.flow +0 -15
  387. package/dist/widgets/video.js.flow +0 -57
  388. package/dist/widgets.js.flow +0 -108
  389. package/dist/zoom.js.flow +0 -7
  390. package/src/multi-items/item-types.js.flow +0 -55
package/src/util/math.ts CHANGED
@@ -38,7 +38,7 @@ const KhanMath = {
38
38
  // TODO(kevinb): rewrite using rest args instead of arguments
39
39
  // eslint-disable-next-line prefer-rest-params
40
40
  const rest = [].slice.call(arguments, 1);
41
- // @ts-expect-error [FEI-5003] - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
41
+ // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
42
42
  return KhanMath.getGCD(a, KhanMath.getGCD(...rest));
43
43
  }
44
44
  let mod;
@@ -60,7 +60,7 @@ const KhanMath = {
60
60
  // TODO(kevinb): rewrite using rest args instead of arguments
61
61
  // eslint-disable-next-line prefer-rest-params
62
62
  const rest = [].slice.call(arguments, 1);
63
- // @ts-expect-error [FEI-5003] - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
63
+ // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
64
64
  return KhanMath.getLCM(a, KhanMath.getLCM(...rest));
65
65
  }
66
66
  return Math.abs(a * b) / KhanMath.getGCD(a, b);
@@ -91,7 +91,7 @@ const KhanMath = {
91
91
 
92
92
  return true;
93
93
  },
94
- // @ts-expect-error [FEI-5003] - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.
94
+ // @ts-expect-error - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.
95
95
  getPrimeFactorization: function (number: number): ReadonlyArray<number> {
96
96
  if (number === 1) {
97
97
  return [];
@@ -121,7 +121,7 @@ const KhanMath = {
121
121
  // Round a number to a certain number of decimal places
122
122
  roundTo: function (precision: number, num: number): number {
123
123
  const factor = Math.pow(10, precision).toFixed(5);
124
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
124
+ // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
125
125
  return Math.round((num * factor).toFixed(5)) / factor;
126
126
  },
127
127
 
@@ -8,7 +8,7 @@ export default function render<ElementType extends React.ElementType>(
8
8
  callback?: () => void,
9
9
  ): React.ElementRef<ElementType> {
10
10
  // TODO(LP-11406): Replace this, or callers, with React Portal
11
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'void' is not assignable to type 'ElementRef<ElementType>'.
11
+ // @ts-expect-error - TS2322 - Type 'void' is not assignable to type 'ElementRef<ElementType>'.
12
12
  // eslint-disable-next-line no-restricted-syntax
13
13
  return ReactDOM.render(
14
14
  /**
@@ -4,7 +4,7 @@
4
4
 
5
5
  // Polyfill scrollTo if it doesn't exist
6
6
  if (typeof HTMLElement !== "undefined" && !HTMLElement.prototype.scrollTo) {
7
- // @ts-expect-error [FEI-5003] - TS2322 - Type '(left: number, top: any) => void' is not assignable to type '{ (options?: ScrollToOptions | undefined): void; (x: number, y: number): void; }'.
7
+ // @ts-expect-error - TS2322 - Type '(left: number, top: any) => void' is not assignable to type '{ (options?: ScrollToOptions | undefined): void; (x: number, y: number): void; }'.
8
8
  HTMLElement.prototype.scrollTo = function (left, top: any) {
9
9
  this.scrollLeft = left;
10
10
  this.scrollTop = top;
@@ -44,7 +44,7 @@ const scrollElementToOffset = (
44
44
  const startPosition =
45
45
  elementOrWindow === window
46
46
  ? window.pageYOffset
47
- : // @ts-expect-error [FEI-5003] - TS2551 - Property 'scrollTop' does not exist on type 'HTMLElement | Window'. Did you mean 'scrollTo'?
47
+ : // @ts-expect-error - TS2551 - Property 'scrollTop' does not exist on type 'HTMLElement | Window'. Did you mean 'scrollTo'?
48
48
  elementOrWindow.scrollTop;
49
49
  const endPosition = offset;
50
50
  const scrollDistance = endPosition - startPosition;
package/src/util/tex.ts CHANGED
@@ -79,11 +79,11 @@ export default {
79
79
  if (text == null) {
80
80
  if ($elem.attr("data-math-formula")) {
81
81
  // The old typeset formula
82
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'string | undefined' is not assignable to type 'string'.
82
+ // @ts-expect-error - TS2322 - Type 'string | undefined' is not assignable to type 'string'.
83
83
  text = $elem.attr("data-math-formula");
84
84
  } else if (script) {
85
85
  // The contents of the <script> tag
86
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'text' does not exist on type 'HTMLElement'.
86
+ // @ts-expect-error - TS2339 - Property 'text' does not exist on type 'HTMLElement'.
87
87
  text = script.text || script.textContent;
88
88
  }
89
89
  }
@@ -130,7 +130,7 @@ export default {
130
130
  }
131
131
  }
132
132
 
133
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
133
+ // @ts-expect-error - TS2769 - No overload matches this call.
134
134
  $elem.text($elem.attr("data-math-formula"));
135
135
  $elem.attr("data-math-formula", null);
136
136
  $elem.attr("data-math-type", null);
package/src/util.ts CHANGED
@@ -58,9 +58,9 @@ const nestedMap = function <T, M>(
58
58
  context: unknown,
59
59
  ): M | ReadonlyArray<M> {
60
60
  if (Array.isArray(children)) {
61
- // @ts-expect-error [FEI-5003] - TS2322 - Type '(M | readonly M[])[]' is not assignable to type 'M | readonly M[]'.
61
+ // @ts-expect-error - TS2322 - Type '(M | readonly M[])[]' is not assignable to type 'M | readonly M[]'.
62
62
  return _.map(children, function (child) {
63
- // @ts-expect-error [FEI-5003] - TS2554 - Expected 3 arguments, but got 2.
63
+ // @ts-expect-error - TS2554 - Expected 3 arguments, but got 2.
64
64
  return nestedMap(child, func);
65
65
  });
66
66
  }
@@ -149,9 +149,9 @@ function shuffle<T>(
149
149
  const newEnd = Math.floor(random() * top),
150
150
  temp = shuffled[newEnd];
151
151
 
152
- // @ts-expect-error [FEI-5003] - TS2542 - Index signature in type 'readonly T[]' only permits reading.
152
+ // @ts-expect-error - TS2542 - Index signature in type 'readonly T[]' only permits reading.
153
153
  shuffled[newEnd] = shuffled[top - 1];
154
- // @ts-expect-error [FEI-5003] - TS2542 - Index signature in type 'readonly T[]' only permits reading.
154
+ // @ts-expect-error - TS2542 - Index signature in type 'readonly T[]' only permits reading.
155
155
  shuffled[top - 1] = temp;
156
156
  }
157
157
  } while (ensurePermuted && _.isEqual(array, shuffled));
@@ -179,14 +179,14 @@ const split: (str: string, r: RegExp) => ReadonlyArray<string> = "x".split(
179
179
 
180
180
  while ((match = r.exec(str))) {
181
181
  const m = match;
182
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'string' is not assignable to parameter of type 'never'.
182
+ // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'never'.
183
183
  output.push(str.slice(lastIndex, m.index));
184
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'any' is not assignable to parameter of type 'never'.
184
+ // @ts-expect-error - TS2345 - Argument of type 'any' is not assignable to parameter of type 'never'.
185
185
  output.push(...m.slice(1));
186
186
  lastIndex = m.index + m[0].length;
187
187
  }
188
188
 
189
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'string' is not assignable to parameter of type 'never'.
189
+ // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'never'.
190
190
  output.push(str.slice(lastIndex));
191
191
  return output;
192
192
  };
@@ -287,7 +287,7 @@ function keScoreFromPerseusScore(
287
287
  };
288
288
  }
289
289
  throw new PerseusError(
290
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'type' does not exist on type 'never'.
290
+ // @ts-expect-error - TS2339 - Property 'type' does not exist on type 'never'.
291
291
  "Invalid score type: " + score.type,
292
292
  Errors.InvalidInput,
293
293
  {
@@ -375,7 +375,7 @@ function getGridStep(
375
375
  step: Coordinates,
376
376
  boxSize: number,
377
377
  ): Coordinates {
378
- // @ts-expect-error [FEI-5003] - TS2322 - Type '(number | null | undefined)[]' is not assignable to type 'Coordinates'.
378
+ // @ts-expect-error - TS2322 - Type '(number | null | undefined)[]' is not assignable to type 'Coordinates'.
379
379
  return _(2).times(function (i) {
380
380
  const scale = scaleFromExtent(range[i], boxSize);
381
381
  const gridStep = gridStepFromTickStep(step[i], scale);
@@ -542,9 +542,9 @@ const DeprecationMixin: any = {
542
542
  _.each(
543
543
  this.deprecatedProps,
544
544
  function (func, prop) {
545
- // @ts-expect-error [FEI-5003] - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
545
+ // @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
546
546
  if (_.has(this.props, prop)) {
547
- // @ts-expect-error [FEI-5003] - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
547
+ // @ts-expect-error - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
548
548
  _.extend(newProps, func(this.props));
549
549
  }
550
550
  },
@@ -605,11 +605,11 @@ function deepEq<T>(x: T, y: T): boolean {
605
605
  return (
606
606
  x === y ||
607
607
  (_.all(x, function (v, k) {
608
- // @ts-expect-error [FEI-5003] - TS2536 - Type 'CollectionKey<T>' cannot be used to index type 'T'.
608
+ // @ts-expect-error - TS2536 - Type 'CollectionKey<T>' cannot be used to index type 'T'.
609
609
  return deepEq(y[k], v);
610
610
  }) &&
611
611
  _.all(y, function (v, k) {
612
- // @ts-expect-error [FEI-5003] - TS2536 - Type 'CollectionKey<T>' cannot be used to index type 'T'.
612
+ // @ts-expect-error - TS2536 - Type 'CollectionKey<T>' cannot be used to index type 'T'.
613
613
  return deepEq(x[k], v);
614
614
  }))
615
615
  );
@@ -813,9 +813,9 @@ const supportsPassiveEvents: () => boolean = () => {
813
813
  supportsPassive = true;
814
814
  },
815
815
  });
816
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
816
+ // @ts-expect-error - TS2769 - No overload matches this call.
817
817
  window.addEventListener("testPassive", null, opts);
818
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
818
+ // @ts-expect-error - TS2769 - No overload matches this call.
819
819
  window.removeEventListener("testPassive", null, opts);
820
820
  } catch (e: any) {
821
821
  // Intentionally left empty!
@@ -45,7 +45,7 @@ class WidgetContainer extends React.Component<Props, State> {
45
45
  // Only relay size class changes for mobile right now. We may want to
46
46
  // this for desktop as well at some point in the future.
47
47
  if (this.state.widgetProps.apiOptions.isMobile) {
48
- // @ts-expect-error [FEI-5003] - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetWidth' does not exist on type 'Element | Text'.
48
+ // @ts-expect-error - TS2531 - Object is possibly 'null'. | TS2339 - Property 'offsetWidth' does not exist on type 'Element | Text'.
49
49
  const containerWidth = ReactDOM.findDOMNode(this).offsetWidth;
50
50
 
51
51
  // NOTE(benkomalo): in the common case, this won't change anything.
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
 
3
3
  import {RendererWithDebugUI} from "../../../../../testing/renderer-with-debug-ui";
4
+ import {storybookDependenciesV2} from "../../../../../testing/test-dependencies";
4
5
  import ArticleRenderer from "../../article-renderer";
5
6
 
6
7
  export default {
@@ -103,5 +104,11 @@ export const MultipleDefinitions = (args: StoryArgs): React.ReactElement => {
103
104
  };
104
105
 
105
106
  export const ArticleDefintion = (args: StoryArgs): React.ReactElement => {
106
- return <ArticleRenderer json={article} useNewStyles />;
107
+ return (
108
+ <ArticleRenderer
109
+ json={article}
110
+ useNewStyles
111
+ dependencies={storybookDependenciesV2}
112
+ />
113
+ );
107
114
  };
@@ -1,4 +1,4 @@
1
- import {KeypadContext} from "@khanacademy/math-input";
1
+ import {KeypadContext, KeypadType} from "@khanacademy/math-input";
2
2
  import * as React from "react";
3
3
 
4
4
  import {ItemRendererWithDebugUI} from "../../../../../testing/item-renderer-with-debug-ui";
@@ -62,7 +62,7 @@ export const DesktopKitchenSink = (args: StoryArgs): React.ReactElement => {
62
62
  };
63
63
 
64
64
  const keypadConfiguration = {
65
- keypadType: "EXPRESSION",
65
+ keypadType: KeypadType.EXPRESSION,
66
66
  extraKeys: ["x", "y", "z"],
67
67
  };
68
68
 
@@ -33,13 +33,13 @@ const TestKeypadContextWrapper = (props: Props): React.ReactElement => {
33
33
  return (
34
34
  <KeypadContext.Provider
35
35
  value={{
36
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
36
+ // @ts-expect-error - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
37
37
  setKeypadElement,
38
38
  keypadElement,
39
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
39
+ // @ts-expect-error - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
40
40
  setRenderer,
41
41
  renderer,
42
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
42
+ // @ts-expect-error - TS2322 - Type 'Dispatch<SetStateAction<HTMLElement>>' is not assignable to type '(scrollableElement?: HTMLElement | null | undefined) => void'.
43
43
  setScrollableElement,
44
44
  scrollableElement,
45
45
  }}
@@ -70,7 +70,7 @@ export const percentageProblem: PerseusRenderer = {
70
70
  content: "$5008 \\div 4 =$ [[\u2603 numeric-input 1]] ",
71
71
  images: {},
72
72
  widgets: {
73
- // @ts-expect-error [FEI-5003] - TS2352 - Conversion of type '{ graded: true; version: { major: number; minor: number; }; static: false; type: "numeric-input"; options: { coefficient: false; static: false; answers: { status: string; maxError: null; strict: false; value: string; simplify: string; message: string; }[]; labelText: string; size: string; }; alignment: string; }' to type 'NumericInputWidget' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
73
+ // @ts-expect-error - TS2352 - Conversion of type '{ graded: true; version: { major: number; minor: number; }; static: false; type: "numeric-input"; options: { coefficient: false; static: false; answers: { status: string; maxError: null; strict: false; value: string; simplify: string; message: string; }[]; labelText: string; size: string; }; alignment: string; }' to type 'NumericInputWidget' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
74
74
  "numeric-input 1": {
75
75
  graded: true,
76
76
  version: {
@@ -60,7 +60,7 @@ exports[`video widget should snapshot on mobile: first mobile render 1`] = `
60
60
  class="default_xu2jcg-o_O-inlineStyles_sc01dy"
61
61
  />
62
62
  <a
63
- class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
63
+ class="shared_17fj7pd-o_O-resting_nelfll visited-no-recolor"
64
64
  href="/transcript/videoNotFound"
65
65
  rel="noopener noreferrer"
66
66
  target="_blank"
@@ -136,7 +136,7 @@ exports[`video widget should snapshot: first render 1`] = `
136
136
  class="default_xu2jcg-o_O-inlineStyles_sc01dy"
137
137
  />
138
138
  <a
139
- class="shared_htyo3s-o_O-resting_nelfll visited-no-recolor"
139
+ class="shared_17fj7pd-o_O-resting_nelfll visited-no-recolor"
140
140
  href="/transcript/videoNotFound"
141
141
  rel="noopener noreferrer"
142
142
  target="_blank"
@@ -3,9 +3,11 @@ import {screen, fireEvent} from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import "@testing-library/jest-dom";
5
5
 
6
- import {testDependencies} from "../../../../../testing/test-dependencies";
6
+ import {
7
+ testDependencies,
8
+ testDependenciesV2,
9
+ } from "../../../../../testing/test-dependencies";
7
10
  import * as Dependencies from "../../dependencies";
8
- import {PerseusItem} from "../../perseus-types";
9
11
  import {
10
12
  expressionItem2,
11
13
  expressionItem3,
@@ -15,7 +17,14 @@ import {Expression} from "../expression";
15
17
 
16
18
  import {renderQuestion} from "./renderQuestion";
17
19
 
18
- const assertComplete = (itemData: PerseusItem, input, isCorrect: boolean) => {
20
+ import type {PerseusItem} from "../../perseus-types";
21
+ import type {APIOptions} from "../../types";
22
+
23
+ const assertComplete = (
24
+ itemData: PerseusItem,
25
+ input: string,
26
+ isCorrect: boolean,
27
+ ) => {
19
28
  const {renderer} = renderQuestion(itemData.question);
20
29
  userEvent.type(screen.getByRole("textbox"), input);
21
30
  const [_, score] = renderer.guessAndScore();
@@ -26,13 +35,14 @@ const assertComplete = (itemData: PerseusItem, input, isCorrect: boolean) => {
26
35
  });
27
36
  };
28
37
 
29
- const assertCorrect = (itemData: PerseusItem, input) => {
38
+ const assertCorrect = (itemData: PerseusItem, input: string) => {
30
39
  assertComplete(itemData, input, true);
31
40
 
32
- expect(testDependencies.analytics).toHaveBeenCalledWith({
41
+ expect(testDependenciesV2.analytics.onAnalyticsEvent).toHaveBeenCalledWith({
33
42
  type: "perseus:expression-evaluated",
34
43
  payload: {
35
44
  result: "correct",
45
+ virtualKeypadVersion: "PERSEUS_MATH_INPUT",
36
46
  },
37
47
  });
38
48
  };
@@ -40,16 +50,21 @@ const assertCorrect = (itemData: PerseusItem, input) => {
40
50
  const assertIncorrect = (itemData: PerseusItem, input: string) => {
41
51
  assertComplete(itemData, input, false);
42
52
 
43
- expect(testDependencies.analytics).toHaveBeenCalledWith({
53
+ expect(testDependenciesV2.analytics.onAnalyticsEvent).toHaveBeenCalledWith({
44
54
  type: "perseus:expression-evaluated",
45
55
  payload: {
46
56
  result: "incorrect",
57
+ virtualKeypadVersion: "PERSEUS_MATH_INPUT",
47
58
  },
48
59
  });
49
60
  };
50
61
 
51
62
  // TODO: actually Assert that message is being set on the score object.
52
- const assertInvalid = (itemData: PerseusItem, input, message?: string) => {
63
+ const assertInvalid = (
64
+ itemData: PerseusItem,
65
+ input: string,
66
+ message?: string,
67
+ ) => {
53
68
  const {renderer} = renderQuestion(itemData.question);
54
69
  if (input.length) {
55
70
  userEvent.type(screen.getByRole("textbox"), input);
@@ -57,17 +72,18 @@ const assertInvalid = (itemData: PerseusItem, input, message?: string) => {
57
72
  const [_, score] = renderer.guessAndScore();
58
73
  expect(score).toMatchObject({type: "invalid"});
59
74
 
60
- expect(testDependencies.analytics).toHaveBeenCalledWith({
75
+ expect(testDependenciesV2.analytics.onAnalyticsEvent).toHaveBeenCalledWith({
61
76
  type: "perseus:expression-evaluated",
62
77
  payload: {
63
78
  result: "invalid",
79
+ virtualKeypadVersion: "PERSEUS_MATH_INPUT",
64
80
  },
65
81
  });
66
82
  };
67
83
 
68
84
  describe("Expression Widget", function () {
69
85
  beforeEach(() => {
70
- jest.spyOn(testDependencies, "analytics");
86
+ jest.spyOn(testDependenciesV2.analytics, "onAnalyticsEvent");
71
87
  jest.spyOn(Dependencies, "getDependencies").mockReturnValue(
72
88
  testDependencies,
73
89
  );
@@ -170,6 +186,56 @@ describe("Expression Widget", function () {
170
186
  expect(err).toStrictEqual({message: null, type: "invalid"});
171
187
  });
172
188
  });
189
+
190
+ describe("analytics", () => {
191
+ const assertKeypadVersion = (
192
+ apiOptions: APIOptions,
193
+ virtualKeypadVersion: string,
194
+ ) => {
195
+ const {renderer} = renderQuestion(
196
+ expressionItem2.question,
197
+ apiOptions,
198
+ );
199
+
200
+ renderer.guessAndScore();
201
+
202
+ expect(
203
+ testDependenciesV2.analytics.onAnalyticsEvent,
204
+ ).toHaveBeenCalledWith({
205
+ type: "perseus:expression-evaluated",
206
+ payload: {
207
+ // We're not interested in validating that the expression
208
+ // widget did anything useful or that the keypad worked. We
209
+ // just want to make sure the code that derives which
210
+ // keypad version it detected is correct.
211
+ result: "invalid",
212
+ virtualKeypadVersion,
213
+ },
214
+ });
215
+ };
216
+
217
+ it("should set the virtual keypad version to REACT_NATIVE_KEYPAD when nativeKeypadProxy is provided", () => {
218
+ assertKeypadVersion(
219
+ {nativeKeypadProxy: jest.fn()},
220
+ "REACT_NATIVE_KEYPAD",
221
+ );
222
+ });
223
+
224
+ it("should set the virtual keypad version to MATH_INPUT_KEYPAD_V1 when customKeypad is set and useV2Keypad is unset", () => {
225
+ assertKeypadVersion({customKeypad: true}, "MATH_INPUT_KEYPAD_V1");
226
+ });
227
+
228
+ it("should set the virtual keypad version to MATH_INPUT_KEYPAD_V2 when customKeypad is set and useV2Keypad is true", () => {
229
+ assertKeypadVersion(
230
+ {customKeypad: true, useV2Keypad: true},
231
+ "MATH_INPUT_KEYPAD_V2",
232
+ );
233
+ });
234
+
235
+ it("should default the virtual keypad version to PERSEUS_MATH_INPUT", () => {
236
+ assertKeypadVersion(Object.freeze({}), "PERSEUS_MATH_INPUT");
237
+ });
238
+ });
173
239
  });
174
240
 
175
241
  describe("getOneCorrectAnswerFromRubric", () => {
@@ -334,7 +400,7 @@ describe("interaction", () => {
334
400
  expect(score.type).toBe("points");
335
401
  // Score.total doesn't exist if the input is invalid
336
402
  // In this case we know that it'll be valid so we can assert directly
337
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'earned' does not exist on type 'PerseusScore'. | TS2339 - Property 'total' does not exist on type 'PerseusScore'.
403
+ // @ts-expect-error - TS2339 - Property 'earned' does not exist on type 'PerseusScore'. | TS2339 - Property 'total' does not exist on type 'PerseusScore'.
338
404
  expect(score.earned).toBe(score.total);
339
405
  });
340
406
 
@@ -350,7 +416,7 @@ describe("interaction", () => {
350
416
  // Assert
351
417
  // Score.total doesn't exist if the input is invalid
352
418
  // In this case we know that it'll be valid so we can assert directly
353
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'total' does not exist on type 'PerseusScore'.
419
+ // @ts-expect-error - TS2339 - Property 'total' does not exist on type 'PerseusScore'.
354
420
  expect(score.total).toBe(1);
355
421
  });
356
422
  });