@doenet/doenetml 0.6.0-alpha1

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 (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,1496 @@
1
+ import createStateProxyHandler from "../../StateProxyHandler";
2
+ import { flattenDeep, mapDeep } from "../../utils/array";
3
+ import { deepClone } from "../../utils/deepFunctions";
4
+ import { enumerateCombinations } from "../../utils/enumeration";
5
+ import { gatherVariantComponents } from "../../utils/variants";
6
+ import { returnDefaultGetArrayKeysFromVarName } from "../../utils/stateVariables";
7
+
8
+ export default class BaseComponent {
9
+ constructor({
10
+ componentName,
11
+ ancestors,
12
+ serializedComponent,
13
+ definingChildren,
14
+ serializedChildren,
15
+ attributes,
16
+ stateVariableDefinitions,
17
+ componentInfoObjects,
18
+ coreFunctions,
19
+ flags,
20
+ shadow,
21
+ numerics,
22
+ parentSharedParameters,
23
+ sharedParameters,
24
+ }) {
25
+ this.numerics = numerics;
26
+ this.parentSharedParameters = parentSharedParameters;
27
+ this.sharedParameters = sharedParameters;
28
+
29
+ this.componentName = componentName;
30
+ this.ancestors = ancestors;
31
+ this.counters = {};
32
+
33
+ this.componentInfoObjects = componentInfoObjects;
34
+ this.coreFunctions = coreFunctions;
35
+ this.flags = flags;
36
+
37
+ if (shadow === true) {
38
+ this.isShadow = true;
39
+ }
40
+
41
+ this.definingChildren = definingChildren;
42
+ if (this.definingChildren === undefined) {
43
+ this.definingChildren = [];
44
+ }
45
+
46
+ this.serializedChildren = serializedChildren;
47
+
48
+ this.attributes = attributes;
49
+
50
+ this.state = {};
51
+ for (let stateVariable in stateVariableDefinitions) {
52
+ // need to separately create a shallow copy of each state variable
53
+ // as state variable definitions of multiple variables could be same object
54
+ this.state[stateVariable] = Object.assign(
55
+ {},
56
+ stateVariableDefinitions[stateVariable],
57
+ );
58
+ }
59
+ this.stateValues = new Proxy(this.state, createStateProxyHandler());
60
+
61
+ this.essentialState = {};
62
+
63
+ if (serializedComponent.state) {
64
+ this.essentialState = deepClone(serializedComponent.state);
65
+ }
66
+
67
+ this.doenetAttributes = {};
68
+ if (serializedComponent.doenetAttributes !== undefined) {
69
+ Object.assign(
70
+ this.doenetAttributes,
71
+ serializedComponent.doenetAttributes,
72
+ );
73
+ }
74
+
75
+ if (serializedComponent.variants !== undefined) {
76
+ this.variants = serializedComponent.variants;
77
+ }
78
+
79
+ if (serializedComponent.range) {
80
+ this.doenetMLrange = serializedComponent.range;
81
+ }
82
+
83
+ this.actions = {
84
+ copyDoenetMLToClipboard: this.copyDoenetMLToClipboard.bind(this),
85
+ };
86
+ }
87
+
88
+ static componentType = "_base";
89
+
90
+ static get rendererType() {
91
+ return this.componentType;
92
+ }
93
+
94
+ get componentType() {
95
+ return this.constructor.componentType;
96
+ }
97
+
98
+ get componentOrAdaptedName() {
99
+ if (this.adaptedFrom) {
100
+ return this.adaptedFrom.componentOrAdaptedName;
101
+ } else {
102
+ return this.componentName;
103
+ }
104
+ }
105
+
106
+ get rendererType() {
107
+ return this.constructor.rendererType;
108
+ }
109
+
110
+ get allPotentialRendererTypes() {
111
+ let allPotentialRendererTypes = [];
112
+ if (this.rendererType) {
113
+ allPotentialRendererTypes.push(this.rendererType);
114
+ }
115
+
116
+ // include any potential renderer type that could be
117
+ // created from a public state variable
118
+ for (let varName in this.state) {
119
+ let stateVarObj = this.state[varName];
120
+ if (stateVarObj.public) {
121
+ let componentTypes = stateVarObj.componentType;
122
+ if (!Array.isArray(componentTypes)) {
123
+ componentTypes = [componentTypes];
124
+ }
125
+ if (stateVarObj.wrappingComponents) {
126
+ componentTypes.push(
127
+ ...flattenDeep(stateVarObj.wrappingComponents).map((x) =>
128
+ typeof x === "object" ? x.componentType : x,
129
+ ),
130
+ );
131
+ }
132
+ for (let componentType of componentTypes) {
133
+ let componentClass =
134
+ this.componentInfoObjects.allComponentClasses[componentType];
135
+ if (componentClass) {
136
+ let rendererType = componentClass.rendererType;
137
+ if (
138
+ rendererType &&
139
+ !allPotentialRendererTypes.includes(rendererType)
140
+ ) {
141
+ allPotentialRendererTypes.push(rendererType);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ // include renderers from components it could adapt to
149
+ if (this.constructor.adapters) {
150
+ for (let adapterInfo of this.constructor.adapters) {
151
+ let componentType;
152
+ if (typeof adapterInfo === "string") {
153
+ componentType = adapterInfo;
154
+ } else {
155
+ componentType = adapterInfo.componentType;
156
+ }
157
+ let componentClass =
158
+ this.componentInfoObjects.allComponentClasses[componentType];
159
+ if (componentClass) {
160
+ let rendererType = componentClass.rendererType;
161
+ if (
162
+ rendererType &&
163
+ !allPotentialRendererTypes.includes(rendererType)
164
+ ) {
165
+ allPotentialRendererTypes.push(rendererType);
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ if (!this.rendererType) {
172
+ return allPotentialRendererTypes;
173
+ }
174
+
175
+ // recurse to all children
176
+ for (let childName in this.allChildren) {
177
+ let child = this.allChildren[childName].component;
178
+ if (typeof child !== "object") {
179
+ continue;
180
+ } else {
181
+ for (let rendererType of child.allPotentialRendererTypes) {
182
+ if (!allPotentialRendererTypes.includes(rendererType)) {
183
+ allPotentialRendererTypes.push(rendererType);
184
+ }
185
+ }
186
+ }
187
+ }
188
+
189
+ return allPotentialRendererTypes;
190
+ }
191
+
192
+ potentialRendererTypesFromSerializedComponents(serializedComponents) {
193
+ let potentialRendererTypes = [];
194
+
195
+ for (let comp of serializedComponents) {
196
+ let compClass =
197
+ this.componentInfoObjects.allComponentClasses[comp.componentType];
198
+ if (compClass) {
199
+ let rendererType = compClass.rendererType;
200
+ if (rendererType && !potentialRendererTypes.includes(rendererType)) {
201
+ potentialRendererTypes.push(rendererType);
202
+ }
203
+
204
+ // include any potential renderer type that could be
205
+ // created from a public state variable
206
+
207
+ let stateVariableDescriptions = compClass.returnStateVariableInfo({
208
+ onlyPublic: true,
209
+ }).stateVariableDescriptions;
210
+
211
+ for (let varName in stateVariableDescriptions) {
212
+ let stateDescrip = stateVariableDescriptions[varName];
213
+
214
+ let componentTypes =
215
+ stateDescrip.shadowingInstructions?.createComponentOfType;
216
+ if (!Array.isArray(componentTypes)) {
217
+ componentTypes = [componentTypes];
218
+ }
219
+ if (stateDescrip.wrappingComponents) {
220
+ componentTypes.push(
221
+ ...flattenDeep(stateDescrip.wrappingComponents).map((x) =>
222
+ typeof x === "object" ? x.componentType : x,
223
+ ),
224
+ );
225
+ }
226
+ for (let componentType of componentTypes) {
227
+ let componentClass =
228
+ this.componentInfoObjects.allComponentClasses[componentType];
229
+ if (componentClass) {
230
+ let rendererType = componentClass.rendererType;
231
+ if (
232
+ rendererType &&
233
+ !potentialRendererTypes.includes(rendererType)
234
+ ) {
235
+ potentialRendererTypes.push(rendererType);
236
+ }
237
+ }
238
+ }
239
+ }
240
+
241
+ // include renderers from components it could adapt to
242
+ if (compClass.adapters) {
243
+ for (let adapterInfo of compClass.adapters) {
244
+ let componentType;
245
+ if (typeof adapterInfo === "string") {
246
+ componentType = adapterInfo;
247
+ } else {
248
+ componentType = adapterInfo.componentType;
249
+ }
250
+ let componentClass =
251
+ this.componentInfoObjects.allComponentClasses[componentType];
252
+ if (componentClass) {
253
+ let rendererType = componentClass.rendererType;
254
+ if (
255
+ rendererType &&
256
+ !potentialRendererTypes.includes(rendererType)
257
+ ) {
258
+ potentialRendererTypes.push(rendererType);
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ if (comp.children) {
266
+ let childRenderTypes =
267
+ this.potentialRendererTypesFromSerializedComponents(comp.children);
268
+ for (let rendererType of childRenderTypes) {
269
+ if (!potentialRendererTypes.includes(rendererType)) {
270
+ potentialRendererTypes.push(rendererType);
271
+ }
272
+ }
273
+ }
274
+ }
275
+
276
+ return potentialRendererTypes;
277
+ }
278
+
279
+ get childrenMatched() {
280
+ return (
281
+ this.childrenMatchedWithPlaceholders &&
282
+ !this.placeholderActiveChildrenIndices
283
+ );
284
+ }
285
+ get matchedCompositeChildren() {
286
+ return (
287
+ this.matchedCompositeChildrenWithPlaceholders &&
288
+ !this.placeholderActiveChildrenIndices
289
+ );
290
+ }
291
+
292
+ static createAttributesObject() {
293
+ return {
294
+ hide: {
295
+ createComponentOfType: "boolean",
296
+ createStateVariable: "hide",
297
+ defaultValue: false,
298
+ public: true,
299
+ },
300
+ disabled: {
301
+ createComponentOfType: "boolean",
302
+ createStateVariable: "disabledPreliminary",
303
+ defaultValue: false,
304
+ },
305
+ fixed: {
306
+ createComponentOfType: "boolean",
307
+ createStateVariable: "fixedPreliminary",
308
+ defaultValue: false,
309
+ ignoreFixed: true,
310
+ },
311
+ fixLocation: {
312
+ createComponentOfType: "boolean",
313
+ createStateVariable: "fixLocationPreliminary",
314
+ defaultValue: false,
315
+ },
316
+ modifyIndirectly: {
317
+ createComponentOfType: "boolean",
318
+ createStateVariable: "modifyIndirectly",
319
+ defaultValue: true,
320
+ public: true,
321
+ propagateToProps: true,
322
+ },
323
+ styleNumber: {
324
+ createComponentOfType: "integer",
325
+ createStateVariable: "styleNumber",
326
+ defaultValue: 1,
327
+ public: true,
328
+ fallBackToParentStateVariable: "styleNumber",
329
+ },
330
+ isResponse: {
331
+ createPrimitiveOfType: "boolean",
332
+ createStateVariable: "isResponse",
333
+ defaultValue: false,
334
+ public: true,
335
+ },
336
+ newNamespace: {
337
+ createPrimitiveOfType: "boolean",
338
+ createStateVariable: "newNamespace",
339
+ defaultValue: false,
340
+ public: true,
341
+ },
342
+ permid: {
343
+ createPrimitiveOfType: "string",
344
+ createStateVariable: "permid",
345
+ defaultValue: "",
346
+ public: true,
347
+ },
348
+ };
349
+ }
350
+
351
+ static returnSugarInstructions() {
352
+ return [];
353
+ }
354
+
355
+ static returnChildGroups() {
356
+ return [];
357
+ }
358
+
359
+ static get childGroups() {
360
+ if (this.hasOwnProperty("childGroupsData")) {
361
+ return this.childGroupsData;
362
+ } else {
363
+ this.childGroupsData = this.returnChildGroups();
364
+ return this.childGroupsData;
365
+ }
366
+ }
367
+
368
+ static childGroupOfComponentTypeData;
369
+
370
+ static get childGroupOfComponentType() {
371
+ if (this.hasOwnProperty("childGroupOfComponentTypeData")) {
372
+ return this.childGroupOfComponentTypeData;
373
+ } else {
374
+ this.childGroupOfComponentTypeData = {};
375
+ return this.childGroupOfComponentTypeData;
376
+ }
377
+ }
378
+
379
+ static childGroupIndsByNameData;
380
+
381
+ static get childGroupIndsByName() {
382
+ if (this.hasOwnProperty("childGroupIndsByNameData")) {
383
+ return Object.assign({}, this.childGroupIndsByNameData);
384
+ }
385
+
386
+ this.childGroupIndsByNameData = {};
387
+ for (let [ind, group] of this.childGroups.entries()) {
388
+ if (group.group in this.childGroupIndsByNameData) {
389
+ throw Error(
390
+ `Invalid childGroups for componentClass ${this.componentType}: ${group} is repeated`,
391
+ );
392
+ }
393
+ this.childGroupIndsByNameData[group.group] = ind;
394
+ }
395
+
396
+ return Object.assign({}, this.childGroupIndsByNameData);
397
+ }
398
+
399
+ returnMatchedChildIndices(childGroups) {
400
+ let matchedIndices = [];
401
+ for (let groupName of childGroups) {
402
+ let matches = this.childMatchesByGroup[groupName];
403
+ if (!matches) {
404
+ return undefined;
405
+ }
406
+ matchedIndices.push(...matches);
407
+ }
408
+ return matchedIndices.sort((a, b) => a - b);
409
+ }
410
+
411
+ static returnStateVariableDefinitions() {
412
+ let stateVariableDefinitions = {};
413
+
414
+ stateVariableDefinitions.hidden = {
415
+ public: true,
416
+ shadowingInstructions: {
417
+ createComponentOfType: "boolean",
418
+ },
419
+ forRenderer: true,
420
+ returnDependencies: () => ({
421
+ hide: {
422
+ dependencyType: "stateVariable",
423
+ variableName: "hide",
424
+ variablesOptional: true,
425
+ },
426
+ parentHidden: {
427
+ dependencyType: "parentStateVariable",
428
+ variableName: "hidden",
429
+ },
430
+ sourceCompositeHidden: {
431
+ dependencyType: "sourceCompositeStateVariable",
432
+ variableName: "hidden",
433
+ },
434
+ adapterSourceHidden: {
435
+ dependencyType: "adapterSourceStateVariable",
436
+ variableName: "hidden",
437
+ },
438
+ }),
439
+ definition: ({ dependencyValues }) => ({
440
+ setValue: {
441
+ hidden: Boolean(
442
+ dependencyValues.parentHidden ||
443
+ dependencyValues.sourceCompositeHidden ||
444
+ dependencyValues.adapterSourceHidden ||
445
+ dependencyValues.hide,
446
+ ),
447
+ },
448
+ }),
449
+ markStale: () => ({ updateParentRenderedChildren: true }),
450
+ inverseDefinition({ desiredStateVariableValues }) {
451
+ return {
452
+ success: true,
453
+ instructions: [
454
+ {
455
+ setDependency: "hide",
456
+ desiredValue: desiredStateVariableValues.hidden,
457
+ },
458
+ ],
459
+ };
460
+ },
461
+ };
462
+
463
+ stateVariableDefinitions.disabled = {
464
+ public: true,
465
+ shadowingInstructions: {
466
+ createComponentOfType: "boolean",
467
+ },
468
+ forRenderer: true,
469
+ hasEssential: true,
470
+ doNotShadowEssential: true,
471
+ defaultValue: false,
472
+ returnDependencies: () => ({
473
+ disabledPreliminary: {
474
+ dependencyType: "stateVariable",
475
+ variableName: "disabledPreliminary",
476
+ variablesOptional: true,
477
+ },
478
+ readOnly: {
479
+ dependencyType: "flag",
480
+ flagName: "readOnly",
481
+ },
482
+ parentDisabled: {
483
+ dependencyType: "parentStateVariable",
484
+ variableName: "disabled",
485
+ },
486
+ sourceCompositeDisabled: {
487
+ dependencyType: "sourceCompositeStateVariable",
488
+ variableName: "disabled",
489
+ },
490
+ adapterSourceDisabled: {
491
+ dependencyType: "adapterSourceStateVariable",
492
+ variableName: "disabled",
493
+ },
494
+ }),
495
+ definition({ dependencyValues, usedDefault }) {
496
+ if (dependencyValues.readOnly) {
497
+ return { setValue: { disabled: true } };
498
+ }
499
+
500
+ if (!usedDefault.disabledPreliminary) {
501
+ return {
502
+ setValue: {
503
+ disabled: dependencyValues.disabledPreliminary,
504
+ },
505
+ };
506
+ }
507
+
508
+ let disabled = false;
509
+ let useEssential = true;
510
+
511
+ if (
512
+ dependencyValues.parentDisabled !== null &&
513
+ !usedDefault.parentDisabled
514
+ ) {
515
+ disabled = disabled || dependencyValues.parentDisabled;
516
+ useEssential = false;
517
+ }
518
+ if (
519
+ dependencyValues.sourceCompositeDisabled !== null &&
520
+ !usedDefault.sourceCompositeDisabled
521
+ ) {
522
+ disabled = disabled || dependencyValues.sourceCompositeDisabled;
523
+ useEssential = false;
524
+ }
525
+ if (
526
+ dependencyValues.adapterSourceDisabled !== null &&
527
+ !usedDefault.adapterSourceDisabled
528
+ ) {
529
+ disabled = disabled || dependencyValues.adapterSourceDisabled;
530
+ useEssential = false;
531
+ }
532
+
533
+ if (useEssential) {
534
+ return {
535
+ useEssentialOrDefaultValue: {
536
+ disabled: true,
537
+ },
538
+ };
539
+ } else {
540
+ return { setValue: { disabled } };
541
+ }
542
+ },
543
+ inverseDefinition({ dependencyValues, desiredStateVariableValues }) {
544
+ if (dependencyValues.disabledPreliminary !== null) {
545
+ return {
546
+ success: true,
547
+ instructions: [
548
+ {
549
+ setDependency: "disabledPreliminary",
550
+ desiredValue: desiredStateVariableValues.disabled,
551
+ },
552
+ ],
553
+ };
554
+ } else {
555
+ return {
556
+ success: true,
557
+ instructions: [
558
+ {
559
+ setEssentialValue: "disabled",
560
+ value: desiredStateVariableValues.disabled,
561
+ },
562
+ ],
563
+ };
564
+ }
565
+ },
566
+ };
567
+
568
+ // If fixed is set to true, then the inverseDefinitioin
569
+ // of any state variable, except those marked with ignoreFixed, will fail.
570
+ // Note that fixed does not influence the forward definition,
571
+ // so that if state variables of a fixed component are based other state variables,
572
+ // and those state variables change, the fixed component's state variable
573
+ // will change to reflect those new values.
574
+ stateVariableDefinitions.fixed = {
575
+ public: true,
576
+ shadowingInstructions: {
577
+ createComponentOfType: "boolean",
578
+ },
579
+ forRenderer: true,
580
+ defaultValue: false,
581
+ hasEssential: true,
582
+ doNotShadowEssential: true,
583
+ ignoreFixed: true,
584
+ returnDependencies: () => ({
585
+ fixedPreliminary: {
586
+ dependencyType: "stateVariable",
587
+ variableName: "fixedPreliminary",
588
+ variablesOptional: true,
589
+ },
590
+ parentFixed: {
591
+ dependencyType: "parentStateVariable",
592
+ variableName: "fixed",
593
+ },
594
+ sourceCompositeFixed: {
595
+ dependencyType: "sourceCompositeStateVariable",
596
+ variableName: "fixed",
597
+ },
598
+ adapterSourceFixed: {
599
+ dependencyType: "adapterSourceStateVariable",
600
+ variableName: "fixed",
601
+ },
602
+ ignoreParentFixed: {
603
+ dependencyType: "doenetAttribute",
604
+ attributeName: "ignoreParentFixed",
605
+ },
606
+ }),
607
+ definition({ dependencyValues, usedDefault }) {
608
+ if (!usedDefault.fixedPreliminary) {
609
+ return {
610
+ setValue: {
611
+ fixed: dependencyValues.fixedPreliminary,
612
+ },
613
+ };
614
+ }
615
+
616
+ let fixed = false;
617
+ let useEssential = true;
618
+
619
+ if (
620
+ dependencyValues.parentFixed !== null &&
621
+ !usedDefault.parentFixed &&
622
+ !dependencyValues.ignoreParentFixed
623
+ ) {
624
+ fixed = fixed || dependencyValues.parentFixed;
625
+ useEssential = false;
626
+ }
627
+ if (
628
+ dependencyValues.sourceCompositeFixed !== null &&
629
+ !usedDefault.sourceCompositeFixed
630
+ ) {
631
+ fixed = fixed || dependencyValues.sourceCompositeFixed;
632
+ useEssential = false;
633
+ }
634
+ if (
635
+ dependencyValues.adapterSourceFixed !== null &&
636
+ !usedDefault.adapterSourceFixed
637
+ ) {
638
+ fixed = fixed || dependencyValues.adapterSourceFixed;
639
+ useEssential = false;
640
+ }
641
+
642
+ if (useEssential) {
643
+ return {
644
+ useEssentialOrDefaultValue: {
645
+ fixed: true,
646
+ },
647
+ };
648
+ } else {
649
+ return { setValue: { fixed } };
650
+ }
651
+ },
652
+ inverseDefinition({ dependencyValues, desiredStateVariableValues }) {
653
+ if (dependencyValues.fixedPreliminary !== null) {
654
+ return {
655
+ success: true,
656
+ instructions: [
657
+ {
658
+ setDependency: "fixedPreliminary",
659
+ desiredValue: desiredStateVariableValues.fixed,
660
+ },
661
+ ],
662
+ };
663
+ } else {
664
+ return {
665
+ success: true,
666
+ instructions: [
667
+ {
668
+ setEssentialValue: "fixed",
669
+ value: desiredStateVariableValues.fixed,
670
+ },
671
+ ],
672
+ };
673
+ }
674
+ },
675
+ };
676
+
677
+ // If fixLocation is set to true, then the inverseDefinition
678
+ // of any state variable marked with isLocation will fail.
679
+ // The intent is that any variables specifying the location of a graphical object
680
+ // will be marked with isLocation so that authors can set the fixLocation attribute
681
+ // on components that should stay in the same location but should be modifiable
682
+ // in other respects.
683
+ // Note that fixLocation does not influence the forward definition,
684
+ // so that if an component with fixedLocation set has a location state variable
685
+ // that is based on other state variables,
686
+ // and those state variables change, the location state variable
687
+ // will change to reflect those new values.
688
+ stateVariableDefinitions.fixLocation = {
689
+ public: true,
690
+ shadowingInstructions: {
691
+ createComponentOfType: "boolean",
692
+ },
693
+ forRenderer: true,
694
+ defaultValue: false,
695
+ hasEssential: true,
696
+ doNotShadowEssential: true,
697
+ returnDependencies: () => ({
698
+ fixLocationPreliminary: {
699
+ dependencyType: "stateVariable",
700
+ variableName: "fixLocationPreliminary",
701
+ variablesOptional: true,
702
+ },
703
+ parentFixLocation: {
704
+ dependencyType: "parentStateVariable",
705
+ variableName: "fixLocation",
706
+ },
707
+ sourceCompositeFixLocation: {
708
+ dependencyType: "sourceCompositeStateVariable",
709
+ variableName: "fixLocation",
710
+ },
711
+ adapterSourceFixLocation: {
712
+ dependencyType: "adapterSourceStateVariable",
713
+ variableName: "fixLocation",
714
+ },
715
+ }),
716
+ definition({ dependencyValues, usedDefault }) {
717
+ if (!usedDefault.fixLocationPreliminary) {
718
+ return {
719
+ setValue: {
720
+ fixLocation: dependencyValues.fixLocationPreliminary,
721
+ },
722
+ };
723
+ }
724
+
725
+ let fixLocation = false;
726
+ let useEssential = true;
727
+
728
+ if (
729
+ dependencyValues.parentFixLocation !== null &&
730
+ !usedDefault.parentFixLocation
731
+ ) {
732
+ fixLocation = fixLocation || dependencyValues.parentFixLocation;
733
+ useEssential = false;
734
+ }
735
+ if (
736
+ dependencyValues.sourceCompositeFixLocation !== null &&
737
+ !usedDefault.sourceCompositeFixLocation
738
+ ) {
739
+ fixLocation =
740
+ fixLocation || dependencyValues.sourceCompositeFixLocation;
741
+ useEssential = false;
742
+ }
743
+ if (
744
+ dependencyValues.adapterSourceFixLocation !== null &&
745
+ !usedDefault.adapterSourceFixLocation
746
+ ) {
747
+ fixLocation =
748
+ fixLocation || dependencyValues.adapterSourceFixLocation;
749
+ useEssential = false;
750
+ }
751
+
752
+ if (useEssential) {
753
+ return {
754
+ useEssentialOrDefaultValue: {
755
+ fixLocation: true,
756
+ },
757
+ };
758
+ } else {
759
+ return { setValue: { fixLocation } };
760
+ }
761
+ },
762
+ inverseDefinition({ dependencyValues, desiredStateVariableValues }) {
763
+ if (dependencyValues.fixLocationPreliminary !== null) {
764
+ return {
765
+ success: true,
766
+ instructions: [
767
+ {
768
+ setDependency: "fixLocationPreliminary",
769
+ desiredValue: desiredStateVariableValues.fixLocation,
770
+ },
771
+ ],
772
+ };
773
+ } else {
774
+ return {
775
+ success: true,
776
+ instructions: [
777
+ {
778
+ setEssentialValue: "fixLocation",
779
+ value: desiredStateVariableValues.fixLocation,
780
+ },
781
+ ],
782
+ };
783
+ }
784
+ },
785
+ };
786
+
787
+ stateVariableDefinitions.isInactiveCompositeReplacement = {
788
+ defaultValue: false,
789
+ hasEssential: true,
790
+ returnDependencies: () => ({}),
791
+ definition: () => ({
792
+ useEssentialOrDefaultValue: {
793
+ isInactiveCompositeReplacement: true,
794
+ },
795
+ }),
796
+ inverseDefinition({ desiredStateVariableValues }) {
797
+ return {
798
+ success: true,
799
+ instructions: [
800
+ {
801
+ setEssentialValue: {
802
+ variableName: "isInactiveCompositeReplacement",
803
+ value:
804
+ desiredStateVariableValues.isInactiveCompositeReplacement,
805
+ },
806
+ },
807
+ ],
808
+ };
809
+ },
810
+ };
811
+
812
+ stateVariableDefinitions.doenetML = {
813
+ public: true,
814
+ shadowingInstructions: {
815
+ createComponentOfType: "text",
816
+ },
817
+ returnDependencies: () => ({
818
+ doenetML: {
819
+ dependencyType: "doenetML",
820
+ },
821
+ }),
822
+ definition({ dependencyValues }) {
823
+ let doenetML = dependencyValues.doenetML;
824
+ if (!doenetML) {
825
+ doenetML = "";
826
+ }
827
+ return { setValue: { doenetML } };
828
+ },
829
+ };
830
+
831
+ return stateVariableDefinitions;
832
+ }
833
+
834
+ static returnNormalizedStateVariableDefinitions({
835
+ attributeNames,
836
+ numerics,
837
+ }) {
838
+ // return state variable definitions
839
+ // where have added additionalStateVariablesDefined
840
+
841
+ // add state variable definitions from component class
842
+ let newDefinitions = this.returnStateVariableDefinitions({
843
+ attributeNames,
844
+ numerics,
845
+ });
846
+
847
+ if (!newDefinitions) {
848
+ throw Error(
849
+ `Error in state variable definitions of ${this.componentType}: returnStateVariableDefinitions did not return anything`,
850
+ );
851
+ }
852
+
853
+ let cleanAdditionalStateVariableDefined = function (
854
+ additionalStateVariablesDefined,
855
+ ) {
856
+ for (let [ind, varObj] of additionalStateVariablesDefined.entries()) {
857
+ if (typeof varObj === "object") {
858
+ additionalStateVariablesDefined[ind] = varObj.variableName;
859
+ }
860
+ }
861
+ };
862
+
863
+ let defAttributesToCopy = [
864
+ "returnDependencies",
865
+ "definition",
866
+ "inverseDefinition",
867
+ "stateVariablesDeterminingDependencies",
868
+ "stateVariablesDeterminingArraySizeDependencies",
869
+ "isArray",
870
+ "numDimensions",
871
+ "returnArraySizeDependencies",
872
+ "returnArraySize",
873
+ "returnArrayDependenciesByKey",
874
+ "arrayDefinitionByKey",
875
+ "inverseArrayDefinitionByKey",
876
+ "basedOnArrayKeyStateVariables",
877
+ "markStale",
878
+ "getPreviousDependencyValuesForMarkStale",
879
+ "determineDependenciesImmediately",
880
+ "createWorkspace",
881
+ "workspace",
882
+ "provideEssentialValuesInDefinition",
883
+ "providePreviousValuesInDefinition",
884
+ "isLocation",
885
+ ];
886
+
887
+ let stateVariableDefinitions = {};
888
+
889
+ for (let varName in newDefinitions) {
890
+ let thisDef = newDefinitions[varName];
891
+ stateVariableDefinitions[varName] = thisDef;
892
+
893
+ if (thisDef.createWorkspace) {
894
+ thisDef.workspace = {};
895
+ }
896
+
897
+ if (thisDef.additionalStateVariablesDefined) {
898
+ for (let [
899
+ ind,
900
+ otherVarObj,
901
+ ] of thisDef.additionalStateVariablesDefined.entries()) {
902
+ let defCopy = {};
903
+ for (let attr of defAttributesToCopy) {
904
+ if (attr in thisDef) {
905
+ defCopy[attr] = thisDef[attr];
906
+ }
907
+ }
908
+ defCopy.additionalStateVariablesDefined = [
909
+ ...thisDef.additionalStateVariablesDefined,
910
+ ];
911
+ defCopy.additionalStateVariablesDefined[ind] = varName;
912
+ cleanAdditionalStateVariableDefined(
913
+ defCopy.additionalStateVariablesDefined,
914
+ );
915
+
916
+ let otherVarName = otherVarObj;
917
+
918
+ // if otherVarObj is actually an object (rather than a string)
919
+ // then get variableName and assign other attributes
920
+ // to the copied state variable definition
921
+ if (typeof otherVarObj === "object") {
922
+ otherVarName = otherVarObj.variableName;
923
+ otherVarObj = Object.assign({}, otherVarObj);
924
+ delete otherVarObj.variableName;
925
+ Object.assign(defCopy, otherVarObj);
926
+ }
927
+
928
+ stateVariableDefinitions[otherVarName] = defCopy;
929
+ }
930
+
931
+ cleanAdditionalStateVariableDefined(
932
+ thisDef.additionalStateVariablesDefined,
933
+ );
934
+ }
935
+ }
936
+
937
+ return stateVariableDefinitions;
938
+ }
939
+
940
+ static returnStateVariableInfo({
941
+ onlyPublic = false,
942
+ onlyForRenderer = false,
943
+ } = {}) {
944
+ let attributeObject = this.createAttributesObject();
945
+
946
+ let stateVariableDescriptions = {};
947
+ let arrayEntryPrefixes = {};
948
+ let aliases = {};
949
+
950
+ for (let attrName in attributeObject) {
951
+ let attrObj = attributeObject[attrName];
952
+ let varName = attrObj.createStateVariable;
953
+ if (varName) {
954
+ if (
955
+ (!onlyPublic || attrObj.public) &&
956
+ (!onlyForRenderer || attrObj.forRenderer)
957
+ ) {
958
+ if (attrObj.public) {
959
+ let attributeFromPrimitive = !attrObj.createComponentOfType;
960
+ let createComponentOfType;
961
+ if (attributeFromPrimitive) {
962
+ createComponentOfType = attrObj.createPrimitiveOfType;
963
+ if (createComponentOfType === "string") {
964
+ createComponentOfType = "text";
965
+ }
966
+ } else {
967
+ createComponentOfType = attrObj.createComponentOfType;
968
+ }
969
+ stateVariableDescriptions[varName] = {
970
+ createComponentOfType,
971
+ public: true,
972
+ };
973
+ } else {
974
+ stateVariableDescriptions[varName] = {};
975
+ }
976
+ }
977
+ }
978
+ }
979
+
980
+ let stateDef = this.returnNormalizedStateVariableDefinitions({
981
+ attributeNames: Object.keys(stateVariableDescriptions),
982
+ });
983
+
984
+ for (let varName in stateDef) {
985
+ let theStateDef = stateDef[varName];
986
+ if (theStateDef.isAlias) {
987
+ aliases[varName] = theStateDef.targetVariableName;
988
+ continue;
989
+ }
990
+ if (
991
+ (!onlyPublic || theStateDef.public) &&
992
+ (!onlyForRenderer || theStateDef.forRenderer)
993
+ ) {
994
+ if (theStateDef.public) {
995
+ stateVariableDescriptions[varName] = {
996
+ createComponentOfType:
997
+ theStateDef.shadowingInstructions.createComponentOfType,
998
+ public: true,
999
+ };
1000
+ } else {
1001
+ stateVariableDescriptions[varName] = {};
1002
+ }
1003
+ if (theStateDef.isArray) {
1004
+ stateVariableDescriptions[varName].isArray = true;
1005
+ stateVariableDescriptions[varName].numDimensions =
1006
+ theStateDef.numDimensions === undefined
1007
+ ? 1
1008
+ : theStateDef.numDimensions;
1009
+ stateVariableDescriptions[varName].wrappingComponents = theStateDef
1010
+ .shadowingInstructions?.returnWrappingComponents
1011
+ ? theStateDef.shadowingInstructions.returnWrappingComponents()
1012
+ : [];
1013
+ let entryPrefixes;
1014
+ if (theStateDef.entryPrefixes) {
1015
+ entryPrefixes = theStateDef.entryPrefixes;
1016
+ } else {
1017
+ entryPrefixes = [varName];
1018
+ }
1019
+ for (let prefix of entryPrefixes) {
1020
+ arrayEntryPrefixes[prefix] = {
1021
+ arrayVariableName: varName,
1022
+ numDimensions: theStateDef.returnEntryDimensions
1023
+ ? theStateDef.returnEntryDimensions(prefix)
1024
+ : 1,
1025
+ wrappingComponents: theStateDef.shadowingInstructions
1026
+ ?.returnWrappingComponents
1027
+ ? theStateDef.shadowingInstructions.returnWrappingComponents(
1028
+ prefix,
1029
+ )
1030
+ : [],
1031
+ };
1032
+ }
1033
+ if (theStateDef.getArrayKeysFromVarName) {
1034
+ stateVariableDescriptions[varName].getArrayKeysFromVarName =
1035
+ theStateDef.getArrayKeysFromVarName;
1036
+ } else {
1037
+ stateVariableDescriptions[varName].getArrayKeysFromVarName =
1038
+ returnDefaultGetArrayKeysFromVarName(
1039
+ stateVariableDescriptions[varName].numDimensions,
1040
+ );
1041
+ }
1042
+ }
1043
+ }
1044
+ }
1045
+
1046
+ return { stateVariableDescriptions, arrayEntryPrefixes, aliases };
1047
+ }
1048
+
1049
+ get parentName() {
1050
+ if (this.ancestors === undefined || this.ancestors.length === 0) {
1051
+ return;
1052
+ }
1053
+ return this.ancestors[0].componentName;
1054
+ }
1055
+
1056
+ // TODO: if resurrect this, it would just be componentNames
1057
+ // getParentUpstreamComponents(includeInactive = false) {
1058
+ // const parent = this.parent;
1059
+ // let upstream = Object.values(this.upstreamDependencies)
1060
+ // if (includeInactive !== true) {
1061
+ // upstream = upstream.filter(x => x.inactive !== true);
1062
+ // }
1063
+ // upstream = upstream.map(x => x.component);
1064
+ // if (parent === undefined) {
1065
+ // return upstream;
1066
+ // } else {
1067
+ // return [parent, ...upstream];
1068
+ // }
1069
+ // }
1070
+
1071
+ getAllChildrenDownstreamComponentNames(includeInactive = false) {
1072
+ const childrenNames = Object.keys(this.allChildren);
1073
+ let downstreamNames = Object.keys(this.downstreamDependencies);
1074
+ if (includeInactive !== true) {
1075
+ downstreamNames = downstreamNames.filter(
1076
+ (x) => this.downstreamDependencies[x].inactive !== true,
1077
+ );
1078
+ }
1079
+ return [...childrenNames, ...downstreamNames];
1080
+ }
1081
+
1082
+ get allDescendants() {
1083
+ let descendants = [];
1084
+ for (let name in this.allChildren) {
1085
+ let child = this.allChildren[name].component;
1086
+ descendants = [...descendants, name, ...child.allDescendants];
1087
+ }
1088
+ return descendants;
1089
+ }
1090
+
1091
+ // returnSerializeInstructions() {
1092
+ // return {};
1093
+ // }
1094
+
1095
+ async serialize(parameters = {}) {
1096
+ // TODO: this function is converted only for the case with the parameter
1097
+ // forLink set
1098
+
1099
+ // TODO: not serializing attribute children (as don't need them with forLink)
1100
+
1101
+ let includeDefiningChildren = true;
1102
+ // let stateVariablesToInclude = [];
1103
+
1104
+ let serializedComponent = {
1105
+ componentType: this.componentType,
1106
+ };
1107
+
1108
+ let serializedChildren = [];
1109
+
1110
+ let parametersForChildren = { ...parameters };
1111
+
1112
+ let sourceAttributesToIgnore;
1113
+ if (parameters.sourceAttributesToIgnore) {
1114
+ sourceAttributesToIgnore = parameters.sourceAttributesToIgnore;
1115
+ } else {
1116
+ sourceAttributesToIgnore = [];
1117
+ }
1118
+
1119
+ if (includeDefiningChildren) {
1120
+ for (let child of this.definingChildren) {
1121
+ if (typeof child !== "object") {
1122
+ serializedChildren.push(child);
1123
+ } else {
1124
+ serializedChildren.push(await child.serialize(parametersForChildren));
1125
+ }
1126
+ }
1127
+
1128
+ if (this.serializedChildren !== undefined) {
1129
+ for (let child of this.serializedChildren) {
1130
+ serializedChildren.push(this.copySerializedComponent(child));
1131
+ }
1132
+ }
1133
+
1134
+ if (serializedChildren.length > 0) {
1135
+ serializedComponent.children = serializedChildren;
1136
+ }
1137
+ }
1138
+
1139
+ serializedComponent.attributes = {};
1140
+
1141
+ for (let attrName in this.attributes) {
1142
+ let attribute = this.attributes[attrName];
1143
+ if (attribute.component) {
1144
+ // only copy attribute components if copy all
1145
+ if (parameters.copyAll) {
1146
+ serializedComponent.attributes[attrName] = {
1147
+ component: await attribute.component.serialize(
1148
+ parametersForChildren,
1149
+ ),
1150
+ };
1151
+ }
1152
+ } else {
1153
+ // copy others if copy all or not set to be ignored
1154
+ if (
1155
+ !sourceAttributesToIgnore.includes(attrName) ||
1156
+ parameters.copyAll
1157
+ ) {
1158
+ serializedComponent.attributes[attrName] = JSON.parse(
1159
+ JSON.stringify(attribute),
1160
+ );
1161
+ }
1162
+ }
1163
+ }
1164
+
1165
+ // always copy essential state
1166
+ if (this.essentialState && Object.keys(this.essentialState).length > 0) {
1167
+ serializedComponent.state = deepClone(this.essentialState);
1168
+ }
1169
+
1170
+ if (this.doenetMLrange) {
1171
+ serializedComponent.range = JSON.parse(
1172
+ JSON.stringify(this.doenetMLrange),
1173
+ );
1174
+ }
1175
+
1176
+ if (parameters.copyVariants) {
1177
+ if (this.state.generatedVariantInfo) {
1178
+ serializedComponent.variants = {
1179
+ desiredVariant: await this.stateValues.generatedVariantInfo,
1180
+ };
1181
+ }
1182
+ }
1183
+
1184
+ serializedComponent.originalName = this.componentName;
1185
+ serializedComponent.originalDoenetAttributes = deepClone(
1186
+ this.doenetAttributes,
1187
+ );
1188
+ serializedComponent.doenetAttributes = deepClone(this.doenetAttributes);
1189
+ serializedComponent.originalAttributes = deepClone(
1190
+ serializedComponent.attributes,
1191
+ );
1192
+
1193
+ delete serializedComponent.doenetAttributes.prescribedName;
1194
+ delete serializedComponent.doenetAttributes.assignNames;
1195
+
1196
+ return serializedComponent;
1197
+ }
1198
+
1199
+ copySerializedComponent(serializedComponent) {
1200
+ if (typeof serializedComponent !== "object") {
1201
+ return serializedComponent;
1202
+ }
1203
+
1204
+ let serializedChildren = [];
1205
+ if (serializedComponent.children !== undefined) {
1206
+ for (let child of serializedComponent.children) {
1207
+ serializedChildren.push(this.copySerializedComponent(child));
1208
+ }
1209
+ }
1210
+
1211
+ let serializedCopy = {
1212
+ componentType: serializedComponent.componentType,
1213
+ originalName: serializedComponent.componentName,
1214
+ originalNameFromSerializedComponent: true,
1215
+ children: serializedChildren,
1216
+ state: {},
1217
+ doenetAttributes: {},
1218
+ };
1219
+
1220
+ if (serializedComponent.doenetAttributes !== undefined) {
1221
+ serializedCopy.originalDoenetAttributes = deepClone(
1222
+ serializedComponent.doenetAttributes,
1223
+ );
1224
+ serializedCopy.doenetAttributes = deepClone(
1225
+ serializedComponent.doenetAttributes,
1226
+ );
1227
+ serializedCopy.originalAttributes = deepClone(
1228
+ serializedComponent.attributes,
1229
+ );
1230
+ serializedCopy.attributes = deepClone(serializedComponent.attributes);
1231
+ delete serializedCopy.doenetAttributes.prescribedName;
1232
+ delete serializedCopy.doenetAttributes.assignNames;
1233
+ }
1234
+
1235
+ if (serializedComponent.range !== undefined) {
1236
+ serializedCopy.range = deepClone(serializedComponent.range);
1237
+ }
1238
+
1239
+ if (serializedComponent.state !== undefined) {
1240
+ // shallow copy of state
1241
+ Object.assign(serializedCopy.state, serializedComponent.state);
1242
+ }
1243
+
1244
+ return serializedCopy;
1245
+ }
1246
+
1247
+ static adapters = [];
1248
+
1249
+ static get numAdapters() {
1250
+ return this.adapters.length;
1251
+ }
1252
+
1253
+ getAdapter(ind) {
1254
+ if (ind >= this.constructor.adapters.length) {
1255
+ return;
1256
+ }
1257
+
1258
+ let adapter = this.constructor.adapters[ind];
1259
+
1260
+ let adapterStateVariable;
1261
+ let adapterComponentType;
1262
+ let substituteForPrimaryStateVariable;
1263
+ let stateVariablesToShadow;
1264
+
1265
+ // adapter could be either
1266
+ // - a string specifying a public state variable, or
1267
+ // - an object specify a public state variable and, optionally
1268
+ // a component type and a state variable for the new component
1269
+ if (typeof adapter === "string") {
1270
+ adapterStateVariable = adapter;
1271
+ } else {
1272
+ adapterStateVariable = adapter.stateVariable;
1273
+ adapterComponentType = adapter.componentType;
1274
+ substituteForPrimaryStateVariable =
1275
+ adapter.substituteForPrimaryStateVariable;
1276
+ stateVariablesToShadow = adapter.stateVariablesToShadow;
1277
+ }
1278
+
1279
+ // look in state for matching public value
1280
+ let stateFromAdapter = this.state[adapterStateVariable];
1281
+ if (
1282
+ stateFromAdapter === undefined ||
1283
+ (!stateFromAdapter.public && !adapterComponentType)
1284
+ ) {
1285
+ throw Error(
1286
+ "Invalid adapter " + adapterStateVariable + " in " + this.componentType,
1287
+ );
1288
+ }
1289
+
1290
+ if (adapterComponentType === undefined) {
1291
+ // if didn't override componentType, use componentType from state variable
1292
+ adapterComponentType =
1293
+ stateFromAdapter.shadowingInstructions.createComponentOfType;
1294
+ }
1295
+
1296
+ return {
1297
+ componentType: adapterComponentType,
1298
+ downstreamDependencies: {
1299
+ [this.componentName]: [
1300
+ {
1301
+ dependencyType: "adapter",
1302
+ adapterVariable: adapterStateVariable,
1303
+ adapterTargetIdentity: {
1304
+ componentName: this.componentName,
1305
+ componentType: this.componentType,
1306
+ },
1307
+ substituteForPrimaryStateVariable,
1308
+ stateVariablesToShadow,
1309
+ },
1310
+ ],
1311
+ },
1312
+ };
1313
+ }
1314
+
1315
+ static getAdapterComponentType(ind, publicStateVariableInfo) {
1316
+ if (ind >= this.adapters.length) {
1317
+ return;
1318
+ }
1319
+
1320
+ let adapter = this.adapters[ind];
1321
+
1322
+ let adapterStateVariable;
1323
+ let adapterComponentType;
1324
+
1325
+ // adapter could be either
1326
+ // - a string specifying a public state variable, or
1327
+ // - an object specify a public state variable and, optionally
1328
+ // a component type and a state variable for the new component
1329
+ if (typeof adapter === "string") {
1330
+ adapterStateVariable = adapter;
1331
+ } else {
1332
+ adapterStateVariable = adapter.stateVariable;
1333
+ adapterComponentType = adapter.componentType;
1334
+ }
1335
+
1336
+ if (adapterComponentType === undefined) {
1337
+ // if didn't override componentType, use createComponentType from state variable
1338
+
1339
+ let stateVarInfo = publicStateVariableInfo[this.componentType];
1340
+
1341
+ let varInfo =
1342
+ stateVarInfo.stateVariableDescriptions[adapterStateVariable];
1343
+ if (!varInfo) {
1344
+ throw Error(
1345
+ "Invalid adapter " +
1346
+ adapterStateVariable +
1347
+ " in " +
1348
+ this.componentType,
1349
+ );
1350
+ }
1351
+
1352
+ adapterComponentType = varInfo.createComponentOfType;
1353
+
1354
+ if (!adapterComponentType) {
1355
+ throw Error(
1356
+ `Couldn't get adapter component type for ${adapterStateVariable} of componentType ${this.componentType}`,
1357
+ );
1358
+ }
1359
+ }
1360
+
1361
+ return adapterComponentType;
1362
+ }
1363
+
1364
+ static determineNumberOfUniqueVariants({
1365
+ serializedComponent,
1366
+ componentInfoObjects,
1367
+ }) {
1368
+ let numberOfVariants = serializedComponent.variants?.numberOfVariants;
1369
+
1370
+ if (numberOfVariants !== undefined) {
1371
+ return { success: true, numberOfVariants };
1372
+ }
1373
+
1374
+ let descendantVariantComponents = [];
1375
+
1376
+ if (serializedComponent.children) {
1377
+ descendantVariantComponents = gatherVariantComponents({
1378
+ serializedComponents: serializedComponent.children,
1379
+ componentInfoObjects,
1380
+ });
1381
+ }
1382
+
1383
+ if (serializedComponent.variants === undefined) {
1384
+ serializedComponent.variants = {};
1385
+ }
1386
+
1387
+ serializedComponent.variants.descendantVariantComponents =
1388
+ descendantVariantComponents;
1389
+
1390
+ // number of variants is the product of
1391
+ // number of variants for each descendantVariantComponent
1392
+ numberOfVariants = 1;
1393
+
1394
+ let numberOfVariantsByDescendant = [];
1395
+ for (let descendant of descendantVariantComponents) {
1396
+ let descendantClass =
1397
+ componentInfoObjects.allComponentClasses[descendant.componentType];
1398
+ let result = descendantClass.determineNumberOfUniqueVariants({
1399
+ serializedComponent: descendant,
1400
+ componentInfoObjects,
1401
+ });
1402
+ if (!result.success) {
1403
+ return { success: false };
1404
+ }
1405
+ numberOfVariantsByDescendant.push(result.numberOfVariants);
1406
+ numberOfVariants *= result.numberOfVariants;
1407
+ }
1408
+
1409
+ serializedComponent.variants.numberOfVariants = numberOfVariants;
1410
+ serializedComponent.variants.uniqueVariantData = {
1411
+ numberOfVariantsByDescendant,
1412
+ };
1413
+
1414
+ return { success: true, numberOfVariants };
1415
+ }
1416
+
1417
+ static getUniqueVariant({
1418
+ serializedComponent,
1419
+ variantIndex,
1420
+ componentInfoObjects,
1421
+ }) {
1422
+ let numberOfVariants = serializedComponent.variants?.numberOfVariants;
1423
+ if (numberOfVariants === undefined) {
1424
+ return { success: false };
1425
+ }
1426
+
1427
+ if (
1428
+ !Number.isInteger(variantIndex) ||
1429
+ variantIndex < 1 ||
1430
+ variantIndex > numberOfVariants
1431
+ ) {
1432
+ return { success: false };
1433
+ }
1434
+
1435
+ let haveNontrivialSubvariants = false;
1436
+
1437
+ let numberOfVariantsByDescendant =
1438
+ serializedComponent.variants.uniqueVariantData
1439
+ .numberOfVariantsByDescendant;
1440
+ let descendantVariantComponents =
1441
+ serializedComponent.variants.descendantVariantComponents;
1442
+
1443
+ let subvariants = [];
1444
+
1445
+ if (descendantVariantComponents.length > 0) {
1446
+ let indicesForEachDescendant = enumerateCombinations({
1447
+ numberOfOptionsByIndex: numberOfVariantsByDescendant,
1448
+ maxNumber: variantIndex,
1449
+ })[variantIndex - 1].map((x) => x + 1);
1450
+
1451
+ // for each descendant, get unique variant corresponding
1452
+ // to the selected variant number and include that as a subvariant
1453
+
1454
+ for (
1455
+ let descendantNum = 0;
1456
+ descendantNum < numberOfVariantsByDescendant.length;
1457
+ descendantNum++
1458
+ ) {
1459
+ if (numberOfVariantsByDescendant[descendantNum] > 1) {
1460
+ let descendant = descendantVariantComponents[descendantNum];
1461
+ let compClass =
1462
+ componentInfoObjects.allComponentClasses[descendant.componentType];
1463
+ let result = compClass.getUniqueVariant({
1464
+ serializedComponent: descendant,
1465
+ variantIndex: indicesForEachDescendant[descendantNum],
1466
+ componentInfoObjects,
1467
+ });
1468
+ if (!result.success) {
1469
+ return { success: false };
1470
+ }
1471
+ subvariants.push(result.desiredVariant);
1472
+ haveNontrivialSubvariants = true;
1473
+ } else {
1474
+ subvariants.push({});
1475
+ }
1476
+ }
1477
+ }
1478
+
1479
+ let desiredVariant = { index: variantIndex };
1480
+ if (haveNontrivialSubvariants) {
1481
+ desiredVariant.subvariants = subvariants;
1482
+ }
1483
+
1484
+ return { success: true, desiredVariant };
1485
+ }
1486
+
1487
+ async copyDoenetMLToClipboard({ actionId }) {
1488
+ let doenetML = await this.stateValues.doenetML;
1489
+
1490
+ if (!doenetML) {
1491
+ this.coreFunctions.resolveAction({ actionId });
1492
+ } else {
1493
+ this.coreFunctions.copyToClipboard(doenetML, actionId);
1494
+ }
1495
+ }
1496
+ }