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