@khanacademy/perseus 7.2.1 → 8.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 (380) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/article-renderer.d.ts +26 -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/es/index.js +1139 -1189
  7. package/dist/es/index.js.map +1 -1
  8. package/dist/hints-renderer.d.ts +1 -1
  9. package/dist/index.js +1141 -1192
  10. package/dist/index.js.map +1 -1
  11. package/dist/mixins/provide-keypad.d.ts +15 -12
  12. package/dist/perseus-api.d.ts +1 -1
  13. package/dist/types.d.ts +3 -2
  14. package/dist/widgets/expression.d.ts +1 -1
  15. package/dist/widgets/graded-group.d.ts +1 -1
  16. package/dist/widgets/interactive-graph.d.ts +1 -1
  17. package/dist/widgets/sequence.d.ts +1 -1
  18. package/dist/widgets/table.d.ts +8 -1
  19. package/dist/widgets.d.ts +1 -1
  20. package/package.json +33 -33
  21. package/src/__testdata__/article-renderer.testdata.ts +3 -1
  22. package/src/__testdata__/item-renderer.testdata.ts +1 -1
  23. package/src/__testdata__/renderer.testdata.ts +1 -1
  24. package/src/__tests__/item-renderer.test.tsx +1 -1
  25. package/src/__tests__/mock-asset-loading-widget.tsx +1 -1
  26. package/src/__tests__/perseus-markdown.test.ts +17 -17
  27. package/src/__tests__/renderer-api.test.tsx +21 -21
  28. package/src/__tests__/renderer.test.tsx +13 -13
  29. package/src/__tests__/server-item-renderer.test.tsx +3 -3
  30. package/src/__tests__/tex-wrangler.test.ts +1 -1
  31. package/src/article-renderer.tsx +39 -38
  32. package/src/components/__tests__/number-input.test.tsx +4 -4
  33. package/src/components/__tests__/sortable.test.tsx +2 -2
  34. package/src/components/fixed-to-responsive.tsx +1 -1
  35. package/src/components/graph.tsx +11 -11
  36. package/src/components/graphie-classes.ts +7 -7
  37. package/src/components/graphie.tsx +14 -14
  38. package/src/components/highlighting/highlightable-content.tsx +1 -1
  39. package/src/components/highlighting/ui/highlight-renderer.tsx +1 -1
  40. package/src/components/highlighting/ui/util.ts +2 -2
  41. package/src/components/highlighting/word-indexer.tsx +4 -4
  42. package/src/components/icon.tsx +1 -1
  43. package/src/components/image-loader.tsx +4 -4
  44. package/src/components/input-with-examples.tsx +2 -2
  45. package/src/components/lint.tsx +1 -1
  46. package/src/components/math-input.tsx +5 -5
  47. package/src/components/math-output.tsx +1 -1
  48. package/src/components/multi-button-group.tsx +1 -1
  49. package/src/components/number-input.tsx +10 -10
  50. package/src/components/prop-check-box.tsx +1 -1
  51. package/src/components/simple-keypad-input.tsx +4 -4
  52. package/src/components/sortable.tsx +42 -41
  53. package/src/components/svg-image.tsx +12 -12
  54. package/src/components/tex-buttons.tsx +4 -3
  55. package/src/components/text-input.tsx +8 -8
  56. package/src/components/text-list-editor.tsx +11 -11
  57. package/src/components/visibility-observer/create-visibility-observer.ts +1 -1
  58. package/src/components/visibility-observer/visibility-observer.tsx +2 -2
  59. package/src/components/zoomable-tex.tsx +3 -3
  60. package/src/components/zoomable.tsx +8 -8
  61. package/src/hint-renderer.tsx +3 -3
  62. package/src/hints-renderer.tsx +11 -11
  63. package/src/init.ts +1 -1
  64. package/src/interaction-tracker.ts +4 -4
  65. package/src/interactive2/__tests__/movable-point.test.ts +1 -1
  66. package/src/interactive2/interactive-util.ts +6 -6
  67. package/src/interactive2/movable-helper-methods.ts +2 -2
  68. package/src/interactive2/movable-line-options.ts +37 -37
  69. package/src/interactive2/movable-line.ts +2 -2
  70. package/src/interactive2/movable-point-options.ts +29 -29
  71. package/src/interactive2/movable-point.tsx +2 -2
  72. package/src/interactive2/movable-polygon-options.ts +45 -45
  73. package/src/interactive2/movable-polygon.ts +2 -2
  74. package/src/interactive2/movable.ts +2 -2
  75. package/src/interactive2/objective_.ts +1 -1
  76. package/src/interactive2/wrapped-defaults.ts +2 -2
  77. package/src/interactive2/wrapped-ellipse.ts +9 -9
  78. package/src/interactive2/wrapped-line.ts +8 -8
  79. package/src/interactive2/wrapped-path.ts +5 -5
  80. package/src/item-renderer.tsx +5 -5
  81. package/src/mixins/changeable.ts +2 -2
  82. package/src/mixins/editor-jsonify.ts +1 -1
  83. package/src/mixins/provide-keypad.tsx +23 -37
  84. package/src/mixins/widget-jsonify-deprecated.ts +1 -1
  85. package/src/multi-items/__tests__/items.test.ts +1 -1
  86. package/src/multi-items/__tests__/multi-renderer.test.tsx +7 -7
  87. package/src/multi-items/__tests__/trees.test.ts +12 -12
  88. package/src/multi-items/item-types.ts +2 -2
  89. package/src/multi-items/items.ts +1 -1
  90. package/src/multi-items/multi-renderer.tsx +14 -14
  91. package/src/multi-items/prop-type-builders.ts +2 -2
  92. package/src/multi-items/tree-types.ts +4 -4
  93. package/src/multi-items/trees.ts +16 -16
  94. package/src/perseus-env.ts +2 -2
  95. package/src/perseus-markdown.tsx +5 -5
  96. package/src/renderer.tsx +38 -38
  97. package/src/server-item-renderer.tsx +5 -5
  98. package/src/sigfigs.ts +1 -1
  99. package/src/traversal.ts +1 -1
  100. package/src/types.ts +3 -3
  101. package/src/util/answer-types.ts +14 -14
  102. package/src/util/geometry.ts +7 -7
  103. package/src/util/graphie.ts +32 -32
  104. package/src/util/interactive.ts +118 -118
  105. package/src/util/math.ts +4 -4
  106. package/src/util/react-render.tsx +1 -1
  107. package/src/util/scroll-utils.ts +2 -2
  108. package/src/util/tex.ts +3 -3
  109. package/src/util.ts +15 -15
  110. package/src/widget-container.tsx +1 -1
  111. package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +3 -3
  112. package/src/widgets/__testdata__/numeric-input.testdata.ts +1 -1
  113. package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +2 -2
  114. package/src/widgets/__tests__/expression.test.ts +4 -3
  115. package/src/widgets/__tests__/grapher.cypress.ts +32 -32
  116. package/src/widgets/__tests__/group.test.tsx +1 -1
  117. package/src/widgets/__tests__/interactive-graph.cypress.ts +40 -40
  118. package/src/widgets/__tests__/interactive-graph.test.ts +1 -1
  119. package/src/widgets/__tests__/numeric-input.test.ts +1 -1
  120. package/src/widgets/__tests__/passage.test.tsx +2 -2
  121. package/src/widgets/__tests__/plotter.test.tsx +2 -1
  122. package/src/widgets/__tests__/radio/base-radio.test.tsx +7 -7
  123. package/src/widgets/__tests__/renderQuestion.tsx +3 -3
  124. package/src/widgets/categorizer.tsx +4 -4
  125. package/src/widgets/cs-program.tsx +2 -2
  126. package/src/widgets/dropdown.tsx +1 -1
  127. package/src/widgets/expression.tsx +10 -9
  128. package/src/widgets/graded-group-set.tsx +5 -5
  129. package/src/widgets/graded-group.tsx +18 -19
  130. package/src/widgets/grapher/util.tsx +6 -6
  131. package/src/widgets/grapher.tsx +10 -10
  132. package/src/widgets/group.tsx +3 -3
  133. package/src/widgets/iframe.tsx +2 -2
  134. package/src/widgets/image.tsx +1 -1
  135. package/src/widgets/input-number.tsx +4 -4
  136. package/src/widgets/interaction.tsx +77 -77
  137. package/src/widgets/interactive-graph.tsx +109 -107
  138. package/src/widgets/label-image/marker.tsx +2 -2
  139. package/src/widgets/label-image.test.ts +1 -1
  140. package/src/widgets/label-image.tsx +7 -7
  141. package/src/widgets/lights-puzzle.tsx +2 -2
  142. package/src/widgets/matcher.tsx +6 -6
  143. package/src/widgets/matrix.tsx +20 -20
  144. package/src/widgets/measurer.tsx +3 -3
  145. package/src/widgets/molecule/__tests__/layout.test.ts +4 -4
  146. package/src/widgets/molecule/__tests__/parser.test.ts +14 -14
  147. package/src/widgets/molecule/smiles-parser.ts +3 -3
  148. package/src/widgets/molecule.tsx +4 -4
  149. package/src/widgets/number-line.tsx +11 -11
  150. package/src/widgets/numeric-input.tsx +11 -11
  151. package/src/widgets/orderer.tsx +38 -38
  152. package/src/widgets/passage/__tests__/passage-markdown.test.ts +1 -1
  153. package/src/widgets/passage/passage-markdown.tsx +4 -4
  154. package/src/widgets/passage-ref-target.tsx +1 -1
  155. package/src/widgets/passage-ref.tsx +4 -6
  156. package/src/widgets/passage.tsx +11 -11
  157. package/src/widgets/plotter.tsx +9 -9
  158. package/src/widgets/radio/base-radio.tsx +11 -11
  159. package/src/widgets/radio/choice-icon/choice-icon.tsx +2 -2
  160. package/src/widgets/radio/choice.tsx +1 -1
  161. package/src/widgets/radio/option-status.tsx +1 -1
  162. package/src/widgets/radio/widget.tsx +6 -6
  163. package/src/widgets/radio.ts +1 -1
  164. package/src/widgets/reaction-diagram.tsx +8 -8
  165. package/src/widgets/sequence.tsx +2 -2
  166. package/src/widgets/simulator.tsx +14 -14
  167. package/src/widgets/sorter.tsx +4 -4
  168. package/src/widgets/table.tsx +8 -8
  169. package/src/widgets/transformer.tsx +92 -92
  170. package/src/widgets/unit.tsx +17 -17
  171. package/src/widgets/video-transcript-link.test.tsx +3 -3
  172. package/src/widgets/video-transcript-link.tsx +1 -1
  173. package/src/widgets/video.tsx +1 -1
  174. package/src/widgets.ts +5 -5
  175. package/src/zoom.ts +22 -22
  176. package/tsconfig-build.tsbuildinfo +1 -1
  177. package/dist/a11y.js.flow +0 -11
  178. package/dist/all-widgets.js.flow +0 -33
  179. package/dist/article-renderer.js.flow +0 -73
  180. package/dist/asset-context.js.flow +0 -15
  181. package/dist/basic-widgets.js.flow +0 -33
  182. package/dist/components/button-group.js.flow +0 -33
  183. package/dist/components/constants.js.flow +0 -13
  184. package/dist/components/fixed-to-responsive.js.flow +0 -34
  185. package/dist/components/graph.js.flow +0 -66
  186. package/dist/components/graphie-classes.js.flow +0 -19
  187. package/dist/components/graphie-movables.js.flow +0 -22
  188. package/dist/components/graphie.js.flow +0 -69
  189. package/dist/components/highlighting/highlightable-content.js.flow +0 -56
  190. package/dist/components/highlighting/highlights.js.flow +0 -54
  191. package/dist/components/highlighting/ranges.js.flow +0 -60
  192. package/dist/components/highlighting/types.js.flow +0 -70
  193. package/dist/components/highlighting/ui/highlight-renderer.js.flow +0 -43
  194. package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +0 -41
  195. package/dist/components/highlighting/ui/highlight-tooltip.js.flow +0 -22
  196. package/dist/components/highlighting/ui/highlighting-ui.js.flow +0 -30
  197. package/dist/components/highlighting/ui/selection-tracker.js.flow +0 -54
  198. package/dist/components/highlighting/ui/types.js.flow +0 -22
  199. package/dist/components/highlighting/ui/util.js.flow +0 -42
  200. package/dist/components/highlighting/word-indexer.js.flow +0 -21
  201. package/dist/components/hud.js.flow +0 -14
  202. package/dist/components/icon.js.flow +0 -31
  203. package/dist/components/image-loader.js.flow +0 -49
  204. package/dist/components/info-tip/info-tip.js.flow +0 -20
  205. package/dist/components/info-tip.js.flow +0 -18
  206. package/dist/components/inline-icon.js.flow +0 -39
  207. package/dist/components/input-with-examples.js.flow +0 -58
  208. package/dist/components/lint.js.flow +0 -58
  209. package/dist/components/math-input.js.flow +0 -49
  210. package/dist/components/math-output.js.flow +0 -33
  211. package/dist/components/multi-button-group.js.flow +0 -35
  212. package/dist/components/number-input.js.flow +0 -42
  213. package/dist/components/prop-check-box.js.flow +0 -8
  214. package/dist/components/range-input.js.flow +0 -20
  215. package/dist/components/simple-keypad-input.js.flow +0 -16
  216. package/dist/components/sortable.js.flow +0 -91
  217. package/dist/components/stub-tag-editor.js.flow +0 -18
  218. package/dist/components/svg-image.js.flow +0 -85
  219. package/dist/components/tex-buttons.js.flow +0 -26
  220. package/dist/components/tex.js.flow +0 -25
  221. package/dist/components/text-input.js.flow +0 -39
  222. package/dist/components/text-list-editor.js.flow +0 -22
  223. package/dist/components/tooltip.js.flow +0 -51
  224. package/dist/components/visibility-observer/create-visibility-observer.js.flow +0 -23
  225. package/dist/components/visibility-observer/get-scroll-parent.js.flow +0 -7
  226. package/dist/components/visibility-observer/visibility-observer.js.flow +0 -36
  227. package/dist/components/zoomable-tex.js.flow +0 -18
  228. package/dist/components/zoomable.js.flow +0 -70
  229. package/dist/components.js.flow +0 -22
  230. package/dist/definition-context.js.flow +0 -25
  231. package/dist/dependencies.js.flow +0 -9
  232. package/dist/error-boundary.js.flow +0 -19
  233. package/dist/extra-widgets.js.flow +0 -33
  234. package/dist/hint-renderer.js.flow +0 -32
  235. package/dist/hints-renderer.js.flow +0 -41
  236. package/dist/icon-paths.js.flow +0 -123
  237. package/dist/index.js.flow +0 -134
  238. package/dist/init.js.flow +0 -20
  239. package/dist/interaction-tracker.js.flow +0 -35
  240. package/dist/interactive2/interactive-util.js.flow +0 -50
  241. package/dist/interactive2/movable-helper-methods.js.flow +0 -15
  242. package/dist/interactive2/movable-line-options.js.flow +0 -44
  243. package/dist/interactive2/movable-line.js.flow +0 -8
  244. package/dist/interactive2/movable-point-options.js.flow +0 -44
  245. package/dist/interactive2/movable-point.js.flow +0 -8
  246. package/dist/interactive2/movable-polygon-options.js.flow +0 -47
  247. package/dist/interactive2/movable-polygon.js.flow +0 -8
  248. package/dist/interactive2/movable.js.flow +0 -8
  249. package/dist/interactive2/objective_.js.flow +0 -25
  250. package/dist/interactive2/types.js.flow +0 -8
  251. package/dist/interactive2/wrapped-defaults.js.flow +0 -11
  252. package/dist/interactive2/wrapped-ellipse.js.flow +0 -14
  253. package/dist/interactive2/wrapped-line.js.flow +0 -14
  254. package/dist/interactive2/wrapped-path.js.flow +0 -13
  255. package/dist/interactive2.js.flow +0 -16
  256. package/dist/item-renderer.js.flow +0 -132
  257. package/dist/item-version.js.flow +0 -11
  258. package/dist/jipt-paragraphs.js.flow +0 -14
  259. package/dist/loading-context.js.flow +0 -12
  260. package/dist/logging/log.js.flow +0 -62
  261. package/dist/mixins/changeable.js.flow +0 -33
  262. package/dist/mixins/editor-jsonify.js.flow +0 -10
  263. package/dist/mixins/provide-keypad.js.flow +0 -33
  264. package/dist/mixins/widget-jsonify-deprecated.js.flow +0 -11
  265. package/dist/mixins/widget-prop-denylist.js.flow +0 -20
  266. package/dist/multi-items/item-types.js.flow +0 -55
  267. package/dist/multi-items/items.js.flow +0 -66
  268. package/dist/multi-items/multi-renderer.js.flow +0 -213
  269. package/dist/multi-items/prop-type-builders.js.flow +0 -22
  270. package/dist/multi-items/shape-types.js.flow +0 -60
  271. package/dist/multi-items/shapes.js.flow +0 -25
  272. package/dist/multi-items/tree-types.js.flow +0 -45
  273. package/dist/multi-items/trees.js.flow +0 -147
  274. package/dist/multi-items.js.flow +0 -36
  275. package/dist/perseus-api.js.flow +0 -151
  276. package/dist/perseus-env.js.flow +0 -6
  277. package/dist/perseus-error.js.flow +0 -16
  278. package/dist/perseus-markdown.js.flow +0 -20
  279. package/dist/perseus-types.js.flow +0 -1041
  280. package/dist/question-paragraph.js.flow +0 -17
  281. package/dist/renderability.js.flow +0 -19
  282. package/dist/renderer.js.flow +0 -325
  283. package/dist/server-item-renderer.js.flow +0 -132
  284. package/dist/sigfigs.js.flow +0 -41
  285. package/dist/styles/constants.js.flow +0 -62
  286. package/dist/styles/global-constants.js.flow +0 -348
  287. package/dist/styles/global-styles.js.flow +0 -53
  288. package/dist/styles/media-queries.js.flow +0 -35
  289. package/dist/styles/shared.js.flow +0 -8
  290. package/dist/tex-wrangler.js.flow +0 -13
  291. package/dist/translation-linter.js.flow +0 -32
  292. package/dist/traversal.js.flow +0 -26
  293. package/dist/types.js.flow +0 -318
  294. package/dist/util/a11y.js.flow +0 -8
  295. package/dist/util/answer-types.js.flow +0 -49
  296. package/dist/util/colors.js.flow +0 -95
  297. package/dist/util/fix-passage-refs.js.flow +0 -8
  298. package/dist/util/geometry.js.flow +0 -37
  299. package/dist/util/graph-utils.js.flow +0 -9
  300. package/dist/util/graphie.js.flow +0 -8
  301. package/dist/util/interactive.js.flow +0 -11
  302. package/dist/util/katex-preprocess.js.flow +0 -12
  303. package/dist/util/math.js.flow +0 -62
  304. package/dist/util/mobile-native-utils.js.flow +0 -12
  305. package/dist/util/react-render.js.flow +0 -12
  306. package/dist/util/register-all-widgets-for-testing.js.flow +0 -7
  307. package/dist/util/scroll-utils.js.flow +0 -19
  308. package/dist/util/sizing-utils.js.flow +0 -20
  309. package/dist/util/tex.js.flow +0 -17
  310. package/dist/util/url-utils.js.flow +0 -11
  311. package/dist/util.graphie.js.flow +0 -14
  312. package/dist/util.js.flow +0 -319
  313. package/dist/version.js.flow +0 -17
  314. package/dist/widget-container.js.flow +0 -33
  315. package/dist/widgets/categorizer.js.flow +0 -70
  316. package/dist/widgets/cs-program.js.flow +0 -54
  317. package/dist/widgets/definition.js.flow +0 -57
  318. package/dist/widgets/dropdown.js.flow +0 -63
  319. package/dist/widgets/explanation.js.flow +0 -58
  320. package/dist/widgets/expression.js.flow +0 -116
  321. package/dist/widgets/graded-group-answer-bar.js.flow +0 -24
  322. package/dist/widgets/graded-group-set.js.flow +0 -65
  323. package/dist/widgets/graded-group.js.flow +0 -78
  324. package/dist/widgets/grapher/util.js.flow +0 -38
  325. package/dist/widgets/grapher.js.flow +0 -102
  326. package/dist/widgets/group.js.flow +0 -60
  327. package/dist/widgets/iframe.js.flow +0 -53
  328. package/dist/widgets/image.js.flow +0 -73
  329. package/dist/widgets/input-number.js.flow +0 -94
  330. package/dist/widgets/interaction/arrow-picker.js.flow +0 -21
  331. package/dist/widgets/interaction/color-picker.js.flow +0 -23
  332. package/dist/widgets/interaction/dash-picker.js.flow +0 -21
  333. package/dist/widgets/interaction/element-container.js.flow +0 -28
  334. package/dist/widgets/interaction.js.flow +0 -60
  335. package/dist/widgets/interactive-graph.js.flow +0 -239
  336. package/dist/widgets/label-image/answer-choices.js.flow +0 -55
  337. package/dist/widgets/label-image/marker.js.flow +0 -31
  338. package/dist/widgets/label-image/types.js.flow +0 -23
  339. package/dist/widgets/label-image.js.flow +0 -142
  340. package/dist/widgets/lights-puzzle.js.flow +0 -58
  341. package/dist/widgets/matcher.js.flow +0 -106
  342. package/dist/widgets/matrix.js.flow +0 -80
  343. package/dist/widgets/measurer.js.flow +0 -30
  344. package/dist/widgets/molecule/molecule-drawing.js.flow +0 -11
  345. package/dist/widgets/molecule/molecule-layout.js.flow +0 -96
  346. package/dist/widgets/molecule/smiles-parser.js.flow +0 -26
  347. package/dist/widgets/molecule.js.flow +0 -60
  348. package/dist/widgets/number-line.js.flow +0 -102
  349. package/dist/widgets/numeric-input.js.flow +0 -105
  350. package/dist/widgets/orderer.js.flow +0 -81
  351. package/dist/widgets/passage/passage-markdown.js.flow +0 -33
  352. package/dist/widgets/passage-ref-target.js.flow +0 -52
  353. package/dist/widgets/passage-ref.js.flow +0 -85
  354. package/dist/widgets/passage.js.flow +0 -157
  355. package/dist/widgets/plotter.js.flow +0 -112
  356. package/dist/widgets/radio/base-radio.js.flow +0 -50
  357. package/dist/widgets/radio/choice-a11y-text.js.flow +0 -14
  358. package/dist/widgets/radio/choice-icon/choice-icon.js.flow +0 -22
  359. package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +0 -16
  360. package/dist/widgets/radio/choice-icon/shared-styles.js.flow +0 -11
  361. package/dist/widgets/radio/choice-none-above.js.flow +0 -16
  362. package/dist/widgets/radio/choice.js.flow +0 -29
  363. package/dist/widgets/radio/choice.jsx.fixture.js.flow +0 -7
  364. package/dist/widgets/radio/focus-ring.js.flow +0 -22
  365. package/dist/widgets/radio/option-status.js.flow +0 -16
  366. package/dist/widgets/radio/util.js.flow +0 -12
  367. package/dist/widgets/radio/widget.js.flow +0 -80
  368. package/dist/widgets/radio.js.flow +0 -31
  369. package/dist/widgets/reaction-diagram.js.flow +0 -46
  370. package/dist/widgets/sequence.js.flow +0 -53
  371. package/dist/widgets/simulator.js.flow +0 -107
  372. package/dist/widgets/sorter.js.flow +0 -102
  373. package/dist/widgets/table.js.flow +0 -67
  374. package/dist/widgets/transformer.js.flow +0 -127
  375. package/dist/widgets/unit.js.flow +0 -93
  376. package/dist/widgets/video-transcript-link.js.flow +0 -15
  377. package/dist/widgets/video.js.flow +0 -57
  378. package/dist/widgets.js.flow +0 -108
  379. package/dist/zoom.js.flow +0 -7
  380. package/src/multi-items/item-types.js.flow +0 -55
@@ -12,13 +12,13 @@
12
12
  */
13
13
 
14
14
  import {MobileKeypad} from "@khanacademy/math-input";
15
- import PropTypes from "prop-types";
16
15
  import * as React from "react";
17
16
  import ReactDOM from "react-dom";
18
17
 
19
18
  import reactRender from "../util/react-render";
20
19
 
21
20
  import type {APIOptions} from "../types";
21
+ import type {KeypadAPI} from "@khanacademy/math-input";
22
22
  import type {CSSProperties} from "aphrodite";
23
23
 
24
24
  export type KeypadProps = {
@@ -34,48 +34,44 @@ export type KeypadApiOptions = {
34
34
  nativeKeypadProxy: any;
35
35
  };
36
36
 
37
+ // This represents the shape of any component that uses this ProvideKeypad
38
+ // mixin.
39
+ type KeypadMixinHostComponent = {
40
+ _keypadContainer?: HTMLDivElement | null;
41
+ props: {
42
+ apiOptions: APIOptions;
43
+ blur?: () => void;
44
+ };
45
+ state: {
46
+ keypadElement: any | null;
47
+ };
48
+ };
49
+
37
50
  // NOTE: This is not a real component. It's a collection of methods used to
38
51
  // create and manage a Keypad instances.
39
52
  // TODO(LP-10789): replace this with a React Context object to pass information
40
53
  // between Perseus and the Keypad.
41
54
  const ProvideKeypad = {
42
- propTypes: {
43
- apiOptions: PropTypes.shape({
44
- customKeypad: PropTypes.bool,
45
- nativeKeypadProxy: PropTypes.func,
46
- }),
47
- // An Aphrodite style object, to be applied to the keypad container.
48
- // Note that, given our awkward structure of injecting the keypad, this
49
- // style won't be applied or updated dynamically. Rather, it will only
50
- // be applied in `componentDidMount`.
51
- keypadStyle: PropTypes.any,
52
- },
53
-
54
- getInitialState(): {
55
+ getInitialState(this: KeypadMixinHostComponent): {
55
56
  keypadElement: any | null;
56
57
  } {
57
58
  const _this = this;
58
- let keypadElement = null;
59
+ let keypadElement: KeypadAPI | null = null;
59
60
  if (
60
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
61
61
  _this.props.apiOptions &&
62
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
63
62
  _this.props.apiOptions.customKeypad &&
64
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
65
63
  _this.props.apiOptions.nativeKeypadProxy
66
64
  ) {
67
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
68
65
  keypadElement = _this.props.apiOptions.nativeKeypadProxy(
69
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
66
+ // @ts-expect-error - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
70
67
  () => _this.blur && _this.blur(),
71
68
  );
72
69
  }
73
70
  return {keypadElement};
74
71
  },
75
72
 
76
- componentDidMount() {
73
+ componentDidMount(this: KeypadMixinHostComponent) {
77
74
  const _this = this;
78
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
79
75
  const apiOptions: APIOptions = _this.props.apiOptions;
80
76
 
81
77
  if (
@@ -86,9 +82,7 @@ const ProvideKeypad = {
86
82
  // TODO(charlie): Render this and the wrapped component in the same
87
83
  // React tree. We may also want to add this keypad asynchronously
88
84
  // or on-demand in the future.
89
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
90
85
  _this._keypadContainer = document.createElement("div");
91
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
92
86
  document.body?.appendChild(_this._keypadContainer);
93
87
 
94
88
  reactRender(
@@ -97,49 +91,41 @@ const ProvideKeypad = {
97
91
  // NOTE(kevinb): The reason why this setState works is
98
92
  // b/c we're calling it manually from item-renderer.jsx
99
93
  // and we're manually setting the 'this' by using 'call'
100
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'setState' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
94
+ // @ts-expect-error - TS2339 - Property 'setState' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
101
95
  _this.setState({
102
96
  keypadElement: element,
103
97
  });
104
98
  }}
105
99
  onDismiss={() => {
106
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
100
+ // @ts-expect-error - TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'. | TS2339 - Property 'blur' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
107
101
  _this.blur && _this.blur();
108
102
  }}
109
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
103
+ // @ts-expect-error - TS2339 - Property 'props' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
110
104
  style={_this.props.keypadStyle}
111
105
  useV2Keypad={apiOptions.useV2Keypad}
112
106
  />,
113
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
114
107
  _this._keypadContainer,
115
108
  );
116
109
  }
117
110
  },
118
111
 
119
- componentWillUnmount() {
112
+ componentWillUnmount(this: KeypadMixinHostComponent) {
120
113
  const _this = this;
121
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
122
114
  if (_this._keypadContainer) {
123
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
124
115
  ReactDOM.unmountComponentAtNode(_this._keypadContainer);
125
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
126
116
  if (_this._keypadContainer.parentNode) {
127
117
  // Note ChildNode.remove() isn't available in older Android
128
118
  // webviews.
129
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
130
119
  _this._keypadContainer.parentNode.removeChild(
131
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
132
120
  _this._keypadContainer,
133
121
  );
134
122
  }
135
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_keypadContainer' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
136
123
  _this._keypadContainer = null;
137
124
  }
138
125
  },
139
126
 
140
- keypadElement(): any {
127
+ keypadElement(this: KeypadMixinHostComponent): any {
141
128
  const _this = this;
142
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'state' does not exist on type '{ readonly propTypes: { readonly apiOptions: React.PropType<{ customKeypad?: boolean | undefined; nativeKeypadProxy?: ((...a: readonly any[]) => unknown) | undefined; }>; readonly keypadStyle: Requireable<any>; }; readonly getInitialState: () => { ...; }; readonly componentDidMount: () => void; readonly componentWil...'.
143
129
  return _this.state.keypadElement;
144
130
  },
145
131
  } as const;
@@ -9,7 +9,7 @@ import WIDGET_PROP_DENYLIST from "./widget-prop-denylist";
9
9
  const WidgetJsonifyDeprecated = {
10
10
  getUserInput: function (): any {
11
11
  // Omit props that get passed to all widgets
12
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'props' does not exist on type '{ readonly getUserInput: () => any; readonly getUserInputFromProps: (props: any) => any; }'.
12
+ // @ts-expect-error - TS2339 - Property 'props' does not exist on type '{ readonly getUserInput: () => any; readonly getUserInputFromProps: (props: any) => any; }'.
13
13
  return _.omit(this.props, WIDGET_PROP_DENYLIST);
14
14
  },
15
15
 
@@ -217,7 +217,7 @@ const item: Item = treeToItem({
217
217
  describe("findContentNodesInItem", () => {
218
218
  it("calls the callback for each content node in the item", () => {
219
219
  const contents = [];
220
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'ContentNode' is not assignable to parameter of type 'never'.
220
+ // @ts-expect-error - TS2345 - Argument of type 'ContentNode' is not assignable to parameter of type 'never'.
221
221
  findContentNodesInItem(item, shape, (c) => contents.push(c));
222
222
  contents.sort();
223
223
  expect([
@@ -69,7 +69,7 @@ const renderSimpleQuestion = (question: Item) => {
69
69
  const _findWidgets = (
70
70
  renderer: MultiRenderer,
71
71
  filterCriterion: FilterCriterion,
72
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
72
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
73
73
  ): Tree<
74
74
  ReadonlyArray<Widget | null | undefined>,
75
75
  ReadonlyArray<Widget | null | undefined>,
@@ -144,7 +144,7 @@ describe("multi-item renderer", () => {
144
144
  userEvent.paste(screen.getByRole("textbox"), "+42"); // Correct
145
145
 
146
146
  // Act
147
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
147
+ // @ts-expect-error - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
148
148
  const state = renderer._getSerializedState(null);
149
149
 
150
150
  // Assert
@@ -277,7 +277,7 @@ describe("multi-item renderer", () => {
277
277
  userEvent.paste(screen.getByRole("textbox"), "99");
278
278
 
279
279
  // Act
280
- // @ts-expect-error [FEI-5003] - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
280
+ // @ts-expect-error - TS2339 - Property '_getSerializedState' does not exist on type 'never'.
281
281
  const state = renderer._getSerializedState({
282
282
  blurb: "last blurb",
283
283
  hints: ["uno", "dos" /* intentionally not passing a third */],
@@ -528,7 +528,7 @@ describe("multi-item renderer", () => {
528
528
  } as const;
529
529
 
530
530
  // Act
531
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
531
+ // @ts-expect-error - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
532
532
  renderer.restoreSerializedState(state);
533
533
 
534
534
  // Assert
@@ -546,7 +546,7 @@ describe("multi-item renderer", () => {
546
546
  const callback = jest.fn();
547
547
 
548
548
  // Act
549
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
549
+ // @ts-expect-error - TS2339 - Property 'restoreSerializedState' does not exist on type 'never'.
550
550
  renderer.restoreSerializedState(
551
551
  {
552
552
  blurb: {"mock-widget 1": 1},
@@ -594,7 +594,7 @@ describe("multi-item renderer", () => {
594
594
  userEvent.paste(screen.getByRole("textbox"), "-42"); // Correct
595
595
 
596
596
  // Act
597
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'getScores' does not exist on type 'never'.
597
+ // @ts-expect-error - TS2339 - Property 'getScores' does not exist on type 'never'.
598
598
  const score = renderer.getScores();
599
599
 
600
600
  // Assert
@@ -756,7 +756,7 @@ describe("multi-item renderer", () => {
756
756
  userEvent.paste(screen.getByRole("textbox"), "-42"); // Correct
757
757
 
758
758
  // Act
759
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'score' does not exist on type 'never'.
759
+ // @ts-expect-error - TS2339 - Property 'score' does not exist on type 'never'.
760
760
  const score = renderer.score();
761
761
 
762
762
  // Assert
@@ -66,7 +66,7 @@ describe("buildMapper", () => {
66
66
  it("calls the content mapper for each of the content nodes", () => {
67
67
  const calledWith = [];
68
68
  buildMapper()
69
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
69
+ // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
70
70
  .setContentMapper((c) => calledWith.push(c))
71
71
  .mapTree(tree, shape);
72
72
  calledWith.sort();
@@ -83,7 +83,7 @@ describe("buildMapper", () => {
83
83
  it("calls the hint mapper for each of the hint nodes", () => {
84
84
  const calledWith = [];
85
85
  buildMapper()
86
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
86
+ // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'never'.
87
87
  .setHintMapper((h) => calledWith.push(h))
88
88
  .mapTree(tree, shape);
89
89
  calledWith.sort();
@@ -110,9 +110,9 @@ describe("buildMapper", () => {
110
110
  TagsNode,
111
111
  string
112
112
  > = buildMapper()
113
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
113
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
114
114
  .setContentMapper((c) => `mapped content: ${c.content || "<none>"}`)
115
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
115
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
116
116
  .setHintMapper((h) => `mapped hint: ${h.content || "<none>"}`)
117
117
  .setTagsMapper((t) => `mapped tags: ${t.join(", ")}`);
118
118
  const result = mapper.mapTree(tree, shape);
@@ -188,7 +188,7 @@ describe("buildMapper", () => {
188
188
 
189
189
  const tree = {a: {b: {c: content(1)}}} as const;
190
190
 
191
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
191
+ // @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
192
192
  const mapper: TreeMapper<
193
193
  ContentNode,
194
194
  string | null | undefined,
@@ -212,7 +212,7 @@ describe("buildMapper", () => {
212
212
  array(array(content(2)), array(content(3), content(4))),
213
213
  );
214
214
 
215
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
215
+ // @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
216
216
  const mapper: TreeMapper<
217
217
  ContentNode,
218
218
  string | null | undefined,
@@ -234,7 +234,7 @@ describe("buildMapper", () => {
234
234
 
235
235
  const tree = array(array(), array(content(1)), array());
236
236
 
237
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
237
+ // @ts-expect-error - TS2322 - Type 'TreeMapperJustForLeaves<ContentNode, string | null | undefined, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
238
238
  const mapper: TreeMapper<
239
239
  ContentNode,
240
240
  string | null | undefined,
@@ -258,7 +258,7 @@ describe("buildMapper", () => {
258
258
 
259
259
  let wasCalled = false;
260
260
  let callArgs: Record<string, any> = {};
261
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'TreeMapperForLeavesAndCollections<unknown, any, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
261
+ // @ts-expect-error - TS2322 - Type 'TreeMapperForLeavesAndCollections<unknown, any, unknown, unknown, unknown, unknown>' is not assignable to type 'TreeMapper<ContentNode, string | null | undefined, HintNode, HintNode, TagsNode, TagsNode>'.
262
262
  const mapper: TreeMapper<
263
263
  ContentNode,
264
264
  string | null | undefined,
@@ -267,7 +267,7 @@ describe("buildMapper", () => {
267
267
  TagsNode,
268
268
  TagsNode
269
269
  > = buildMapper()
270
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
270
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
271
271
  .setContentMapper((c) => c.content)
272
272
  .setArrayMapper((mappedArray, originalArray, shape, path) => {
273
273
  wasCalled = true;
@@ -288,11 +288,11 @@ describe("buildMapper", () => {
288
288
 
289
289
  it("uses the array mapper return value to construct the new tree", () => {
290
290
  const mapper = buildMapper()
291
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
291
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
292
292
  .setContentMapper((c) => c.content)
293
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
293
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
294
294
  .setHintMapper((h) => h.content)
295
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
295
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
296
296
  .setTagsMapper((t) => t.join(", "))
297
297
  .setArrayMapper((mappedArray, originalArray, shape, path) => {
298
298
  return mappedArray.map((child) => `${String(child)} in array`);
@@ -37,10 +37,10 @@ export type HintNode = {
37
37
  };
38
38
  export type TagsNode = ReadonlyArray<string>;
39
39
 
40
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
40
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
41
41
  export type ItemArrayNode = ArrayNode<ContentNode, HintNode, TagsNode>;
42
42
  export type ItemObjectNode = ObjectNode<ContentNode, HintNode, TagsNode>;
43
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
43
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
44
44
  export type ItemTree = Tree<ContentNode, HintNode, TagsNode>;
45
45
 
46
46
  // TODO(jeremy): I think we could refine this root type for multi items. Right
@@ -66,7 +66,7 @@ export function buildEmptyItemTreeForShape(shape: Shape): ItemTree {
66
66
  return object;
67
67
  }
68
68
  throw new PerseusError(
69
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'type' does not exist on type 'never'.
69
+ // @ts-expect-error - TS2339 - Property 'type' does not exist on type 'never'.
70
70
  `unexpected shape type ${shape.type}`,
71
71
  Errors.InvalidInput,
72
72
  );
@@ -62,7 +62,7 @@ type SerializedState = any; // TODO(mdr)
62
62
 
63
63
  type RendererProps = JSX.LibraryManagedAttributes<
64
64
  typeof Renderer,
65
- // @ts-expect-error [FEI-5003] - TS2344 - Type 'typeof Renderer' does not satisfy the constraint 'keyof IntrinsicElements | JSXElementConstructor<any>'.
65
+ // @ts-expect-error - TS2344 - Type 'typeof Renderer' does not satisfy the constraint 'keyof IntrinsicElements | JSXElementConstructor<any>'.
66
66
  React.ComponentProps<typeof Renderer>
67
67
  >;
68
68
 
@@ -82,7 +82,7 @@ type HintRendererData = {
82
82
  hint: Hint;
83
83
  };
84
84
  type RendererData = ContentRendererData | HintRendererData;
85
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
85
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
86
86
  type RendererDataTree = Tree<ContentRendererData, HintRendererData, null>;
87
87
 
88
88
  /**
@@ -93,11 +93,11 @@ type RendererDataTree = Tree<ContentRendererData, HintRendererData, null>;
93
93
  * really helping us out as I now have to suppress this rather than
94
94
  * get value from the type. :(
95
95
  */
96
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
96
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
97
97
  type RendererTree = Tree<ContentRendererElement, HintRendererElement, null>;
98
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
98
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
99
99
  type ScoreTree = Tree<Score, null, null>;
100
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
100
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
101
101
  type SerializedStateTree = Tree<SerializedState, null, null>;
102
102
 
103
103
  type Props = {
@@ -141,17 +141,17 @@ class MultiRenderer extends React.Component<Props, State> {
141
141
  super(props);
142
142
 
143
143
  this.rendererDataTreeMapper = buildMapper()
144
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'ContentNode'.
144
+ // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'ContentNode'.
145
145
  .setContentMapper((c, _, p) => this._makeContentRendererData(c, p))
146
- // @ts-expect-error [FEI-5003] - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'HintNode'.
146
+ // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'HintNode'.
147
147
  .setHintMapper((h) => this._makeHintRendererData(h))
148
148
  .setTagsMapper((t) => null);
149
149
 
150
- // @ts-expect-error [FEI-5003] - TS2322 - Type 'TreeMapperForLeavesAndCollections<unknown, any, unknown, any, unknown, unknown>' is not assignable to type 'TreeMapper<ContentRendererData, ContentRendererElement, HintRendererData, HintRendererElement, null, null>'.
150
+ // @ts-expect-error - TS2322 - Type 'TreeMapperForLeavesAndCollections<unknown, any, unknown, any, unknown, unknown>' is not assignable to type 'TreeMapper<ContentRendererData, ContentRendererElement, HintRendererData, HintRendererElement, null, null>'.
151
151
  this.getRenderersMapper = buildMapper()
152
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
152
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
153
153
  .setContentMapper((c) => c.makeRenderer())
154
- // @ts-expect-error [FEI-5003] - TS2571 - Object is of type 'unknown'.
154
+ // @ts-expect-error - TS2571 - Object is of type 'unknown'.
155
155
  .setHintMapper((h) => h.makeRenderer())
156
156
  .setArrayMapper((renderers, data, shape) =>
157
157
  this._annotateRendererArray(
@@ -264,7 +264,7 @@ class MultiRenderer extends React.Component<Props, State> {
264
264
  * if this spread is including undocumented props so mapping
265
265
  * one to one could introduce a bug. Need to work out the exact
266
266
  * type for ContentNode and then fix this.
267
- */ // @ts-expect-error [FEI-5003] - TS2322 - Type '{ ref: (e: any) => any; findExternalWidgets: (criterion: any) => readonly (Widget | null | undefined)[]; serializedState: any; onSerializedStateUpdated: (state: any) => void; __type: "content" | "item"; ... 9 more ...; reviewMode?: boolean | ... 1 more ... | undefined; }' is not assignable to type 'InexactPartial<Pick<Readonly<Props> & Readonly<{ children?: ReactNode; }>, "content" | "images" | "onRender" | "linterContext" | "widgets" | "alwaysUpdate" | ... 6 more ... | "serializedState">>'.
267
+ */ // @ts-expect-error - TS2322 - Type '{ ref: (e: any) => any; findExternalWidgets: (criterion: any) => readonly (Widget | null | undefined)[]; serializedState: any; onSerializedStateUpdated: (state: any) => void; __type: "content" | "item"; ... 9 more ...; reviewMode?: boolean | ... 1 more ... | undefined; }' is not assignable to type 'InexactPartial<Pick<Readonly<Props> & Readonly<{ children?: ReactNode; }>, "content" | "images" | "onRender" | "linterContext" | "widgets" | "alwaysUpdate" | ... 6 more ... | "serializedState">>'.
268
268
  <Renderer
269
269
  {...this._getRendererProps()}
270
270
  {...content}
@@ -306,7 +306,7 @@ class MultiRenderer extends React.Component<Props, State> {
306
306
  makeRenderer: () => (
307
307
  <HintsRenderer
308
308
  {...this._getRendererProps()}
309
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
309
+ // @ts-expect-error - TS2769 - No overload matches this call.
310
310
  findExternalWidgets={findExternalWidgets}
311
311
  hints={[hint]}
312
312
  />
@@ -361,7 +361,7 @@ class MultiRenderer extends React.Component<Props, State> {
361
361
  // eslint-disable-next-line no-restricted-syntax
362
362
  leafMapper: ContentMapper<RendererData, O> &
363
363
  HintMapper<RendererData, O>,
364
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
364
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
365
365
  ): Tree<O, O, null> | null | undefined {
366
366
  const {rendererDataTree} = this.state;
367
367
 
@@ -506,7 +506,7 @@ class MultiRenderer extends React.Component<Props, State> {
506
506
  (renderers as any).firstN = (n: any) => (
507
507
  <HintsRenderer
508
508
  {...this._getRendererProps()}
509
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
509
+ // @ts-expect-error - TS2769 - No overload matches this call.
510
510
  findExternalWidgets={
511
511
  hintRendererDatas[0]
512
512
  ? hintRendererDatas[0].findExternalWidgets
@@ -39,7 +39,7 @@ export function shapePropType(...args: ReadonlyArray<any>): any {
39
39
  }).isRequired,
40
40
  ]);
41
41
 
42
- // @ts-expect-error [FEI-5003] - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
42
+ // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.
43
43
  return itemShape(...args);
44
44
  }
45
45
 
@@ -99,7 +99,7 @@ function buildTreePropTypeForShape(shape: Shape): any {
99
99
  return PropTypes.shape(propTypeShape);
100
100
  }
101
101
  throw new PerseusError(
102
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'type' does not exist on type 'never'.
102
+ // @ts-expect-error - TS2339 - Property 'type' does not exist on type 'never'.
103
103
  `unexpected shape type ${shape.type}`,
104
104
  Errors.InvalidInput,
105
105
  );
@@ -23,10 +23,10 @@
23
23
 
24
24
  // TODO(jeremy): We lost "arrayness" in D69450. It'd be nice to restore that
25
25
  // because right now ArrayNode doesn't add anything.
26
- // @ts-expect-error [FEI-5003] - TS2456 - Type alias 'ArrayNode' circularly references itself. | TS2315 - Type 'Tree' is not generic.
26
+ // @ts-expect-error - TS2456 - Type alias 'ArrayNode' circularly references itself. | TS2315 - Type 'Tree' is not generic.
27
27
  export type ArrayNode<C, H, T> = Tree<C, H, T>;
28
28
  export type ObjectNode<C, H, T> = {
29
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
29
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
30
30
  [k: string]: Tree<C, H, T>;
31
31
  };
32
32
 
@@ -37,11 +37,11 @@ export type ObjectNode<C, H, T> = {
37
37
  * in order to ensure that TypeScript can track its refinement and appropriate use.
38
38
  * It's messy.
39
39
  */
40
- // @ts-expect-error [FEI-5003] - TS2456 - Type alias 'Tree' circularly references itself. | TS2315 - Type 'ArrayNode' is not generic.
40
+ // @ts-expect-error - TS2456 - Type alias 'Tree' circularly references itself. | TS2315 - Type 'ArrayNode' is not generic.
41
41
  export type Tree<C, H, T> =
42
42
  | C
43
43
  | H
44
44
  | T
45
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
45
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
46
46
  | ArrayNode<C, H, T>
47
47
  | ObjectNode<C, H, T>;
@@ -98,13 +98,13 @@ export type ContentMapper<CI, CO> = (
98
98
  export type HintMapper<HI, HO> = (hint: HI, shape: HintShape, path: Path) => HO;
99
99
  export type TagsMapper<TI, TO> = (tag: TI, shape: TagsShape, path: Path) => TO;
100
100
  export type ArrayMapper<CI, CO, HI, HO, TI, TO> = (
101
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
101
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
102
102
  mappedArray: ArrayNode<CO, HO, TO>,
103
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
103
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
104
104
  originalArray: ArrayNode<CI, HI, TI>,
105
105
  shape: ArrayShape,
106
106
  path: Path,
107
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
107
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
108
108
  ) => ArrayNode<CO, HO, TO>;
109
109
 
110
110
  /**
@@ -120,7 +120,7 @@ export interface TreeMapper<CI, CO, HI, HO, TI, TO> {
120
120
  hint: HintMapper<HI, HO>;
121
121
  tags: TagsMapper<TI, TO>;
122
122
  array: ArrayMapper<CI, CO, HI, HO, TI, TO>;
123
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
123
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
124
124
  mapTree(tree: Tree<CI, HI, TI>, shape: Shape): Tree<CO, HO, TO>;
125
125
  }
126
126
 
@@ -196,7 +196,7 @@ class TreeMapperJustForLeaves<CI, CO, HI, HO, TI, TO> {
196
196
  );
197
197
  }
198
198
 
199
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
199
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
200
200
  mapTree(tree: Tree<CI, HI, TI>, shape: Shape): Tree<CO, HO, TO> {
201
201
  return mapTree(tree, shape, [], this);
202
202
  }
@@ -235,7 +235,7 @@ class TreeMapperForLeavesAndCollections<CI, CO, HI, HO, TI, TO> {
235
235
  );
236
236
  }
237
237
 
238
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
238
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic. | TS2315 - Type 'Tree' is not generic.
239
239
  mapTree(tree: Tree<CI, HI, TI>, shape: Shape): Tree<CO, HO, TO> {
240
240
  return mapTree(tree, shape, [], this);
241
241
  }
@@ -251,7 +251,7 @@ function identity<T>(x: T): T {
251
251
  * `setHintMapper`, `setTagMapper`, and `setArrayMapper` to specify
252
252
  * transformations for the individual node types.
253
253
  */
254
- // @ts-expect-error [FEI-5003] - TS2300 - Duplicate identifier 'C'. | TS2300 - Duplicate identifier 'H'. | TS2300 - Duplicate identifier 'T'.
254
+ // @ts-expect-error - TS2300 - Duplicate identifier 'C'. | TS2300 - Duplicate identifier 'H'. | TS2300 - Duplicate identifier 'T'.
255
255
  export function buildMapper<C, C, H, H, T, T>(): TreeMapperJustForLeaves<
256
256
  C,
257
257
  C,
@@ -268,12 +268,12 @@ export function buildMapper<C, C, H, H, T, T>(): TreeMapperJustForLeaves<
268
268
  * TreeMapper to each node, and return the resulting tree.
269
269
  */
270
270
  function mapTree<CI, CO, HI, HO, TI, TO>(
271
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
271
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
272
272
  tree: Tree<CI, HI, TI>,
273
273
  shape: Shape,
274
274
  path: Path,
275
275
  mappers: TreeMapper<CI, CO, HI, HO, TI, TO>,
276
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'Tree' is not generic.
276
+ // @ts-expect-error - TS2315 - Type 'Tree' is not generic.
277
277
  ): Tree<CO, HO, TO> {
278
278
  // We trust the shape of the multi-item to match the shape provided at
279
279
  // runtime. Therefore, in each shape branch, we cast the node to `any` and
@@ -291,20 +291,20 @@ function mapTree<CI, CO, HI, HO, TI, TO>(
291
291
  return mappers.tags(tags, shape, path);
292
292
  }
293
293
  if (shape.type === "array") {
294
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
294
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
295
295
  const array: ArrayNode<CI, HI, TI> = tree as any;
296
296
 
297
297
  if (!Array.isArray(array)) {
298
298
  throw new PerseusError(
299
299
  `Invalid object of type "${typeof array}" found at path ` +
300
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
300
+ // @ts-expect-error - TS2769 - No overload matches this call.
301
301
  `${["<root>"].concat(path).join(".")}. Expected array.`,
302
302
  Errors.Internal,
303
303
  );
304
304
  }
305
305
 
306
306
  const elementShape = shape.elementShape;
307
- // @ts-expect-error [FEI-5003] - TS2315 - Type 'ArrayNode' is not generic.
307
+ // @ts-expect-error - TS2315 - Type 'ArrayNode' is not generic.
308
308
  const mappedElements: ArrayNode<CO, HO, TO> = array.map((inner, i) =>
309
309
  mapTree(inner, elementShape, path.concat(i), mappers),
310
310
  );
@@ -316,7 +316,7 @@ function mapTree<CI, CO, HI, HO, TI, TO>(
316
316
  if (object && typeof object !== "object") {
317
317
  throw new PerseusError(
318
318
  `Invalid object of type "${typeof object}" found at ` +
319
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
319
+ // @ts-expect-error - TS2769 - No overload matches this call.
320
320
  `path ${["<root>"].concat(path).join(".")}. Expected ` +
321
321
  `"object" type.`,
322
322
  Errors.InvalidInput,
@@ -327,7 +327,7 @@ function mapTree<CI, CO, HI, HO, TI, TO>(
327
327
  if (!valueShapes) {
328
328
  throw new PerseusError(
329
329
  `Unexpected shape ${JSON.stringify(shape)} at path ` +
330
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
330
+ // @ts-expect-error - TS2769 - No overload matches this call.
331
331
  `${["<root>"].concat(path).join(".")}.`,
332
332
  Errors.InvalidInput,
333
333
  );
@@ -337,7 +337,7 @@ function mapTree<CI, CO, HI, HO, TI, TO>(
337
337
  if (!(key in object)) {
338
338
  throw new PerseusError(
339
339
  `Key "${key}" is missing from shape at path ` +
340
- // @ts-expect-error [FEI-5003] - TS2769 - No overload matches this call.
340
+ // @ts-expect-error - TS2769 - No overload matches this call.
341
341
  `${["<root>"].concat(path).join(".")}.`,
342
342
  Errors.InvalidInput,
343
343
  );
@@ -353,7 +353,7 @@ function mapTree<CI, CO, HI, HO, TI, TO>(
353
353
  return newObject;
354
354
  }
355
355
  throw new PerseusError(
356
- // @ts-expect-error [FEI-5003] - TS2339 - Property 'type' does not exist on type 'never'.
356
+ // @ts-expect-error - TS2339 - Property 'type' does not exist on type 'never'.
357
357
  `unexpected shape type ${shape.type}`,
358
358
  Errors.InvalidInput,
359
359
  );