@khanacademy/perseus-core 37.0.0 → 38.1.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 (48) hide show
  1. package/dist/data-schema.d.ts +11 -5
  2. package/dist/es/index.item-splitting.js +7 -3
  3. package/dist/es/index.item-splitting.js.map +1 -1
  4. package/dist/es/index.js +15 -11
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/feature-flags.d.ts +1 -1
  7. package/dist/index.d.ts +7 -61
  8. package/dist/index.item-splitting.js +7 -3
  9. package/dist/index.item-splitting.js.map +1 -1
  10. package/dist/index.js +18 -10
  11. package/dist/index.js.map +1 -1
  12. package/dist/parse-perseus-json/perseus-parsers/graded-group-set-widget.d.ts +9 -0
  13. package/dist/parse-perseus-json/perseus-parsers/graded-group-widget.d.ts +18 -0
  14. package/dist/utils/generators/table-widget-generator.d.ts +10 -0
  15. package/dist/validation.types.d.ts +8 -228
  16. package/dist/widgets/categorizer/index.d.ts +0 -1
  17. package/dist/widgets/cs-program/index.d.ts +0 -1
  18. package/dist/widgets/definition/index.d.ts +0 -2
  19. package/dist/widgets/dropdown/index.d.ts +0 -1
  20. package/dist/widgets/explanation/index.d.ts +0 -2
  21. package/dist/widgets/expression/index.d.ts +0 -1
  22. package/dist/widgets/free-response/index.d.ts +0 -1
  23. package/dist/widgets/graded-group/index.d.ts +0 -2
  24. package/dist/widgets/graded-group-set/index.d.ts +0 -2
  25. package/dist/widgets/grapher/index.d.ts +0 -1
  26. package/dist/widgets/group/index.d.ts +0 -1
  27. package/dist/widgets/iframe/index.d.ts +0 -1
  28. package/dist/widgets/image/index.d.ts +0 -1
  29. package/dist/widgets/input-number/index.d.ts +0 -1
  30. package/dist/widgets/interaction/index.d.ts +0 -2
  31. package/dist/widgets/interactive-graph/index.d.ts +0 -1
  32. package/dist/widgets/label-image/index.d.ts +0 -1
  33. package/dist/widgets/matcher/index.d.ts +0 -1
  34. package/dist/widgets/matrix/index.d.ts +0 -1
  35. package/dist/widgets/measurer/index.d.ts +0 -2
  36. package/dist/widgets/number-line/index.d.ts +0 -1
  37. package/dist/widgets/numeric-input/index.d.ts +0 -1
  38. package/dist/widgets/orderer/index.d.ts +0 -1
  39. package/dist/widgets/orderer/orderer-util.d.ts +11 -1
  40. package/dist/widgets/phet-simulation/index.d.ts +0 -2
  41. package/dist/widgets/plotter/index.d.ts +0 -1
  42. package/dist/widgets/python-program/index.d.ts +0 -2
  43. package/dist/widgets/radio/index.d.ts +0 -1
  44. package/dist/widgets/sorter/index.d.ts +0 -1
  45. package/dist/widgets/sorter/sorter-util.d.ts +12 -1
  46. package/dist/widgets/table/index.d.ts +0 -1
  47. package/dist/widgets/video/index.d.ts +0 -2
  48. package/package.json +1 -1
@@ -9,7 +9,7 @@
9
9
  * export const PerseusFeatureFlags = [];
10
10
  * 4. Also update the testing/feature-flags-util.ts for testing purpose
11
11
  */
12
- declare const PerseusFeatureFlags: readonly ["perseus-renderer-upgrade", "desmos-calculator"];
12
+ declare const PerseusFeatureFlags: readonly ["perseus-renderer-upgrade", "desmos-calculator", "article-extras"];
13
13
  export default PerseusFeatureFlags;
14
14
  /**
15
15
  * Checks if a feature flag is enabled in the given props.
package/dist/index.d.ts CHANGED
@@ -53,128 +53,68 @@ export { default as blankLogic } from "./widgets/blank";
53
53
  /** @hidden */
54
54
  export { default as categorizerLogic } from "./widgets/categorizer";
55
55
  /** @hidden */
56
- export type { CategorizerDefaultWidgetOptions } from "./widgets/categorizer";
57
- /** @hidden */
58
56
  export { default as csProgramLogic } from "./widgets/cs-program";
59
57
  /** @hidden */
60
- export type { CSProgramDefaultWidgetOptions } from "./widgets/cs-program";
61
- /** @hidden */
62
58
  export { default as definitionLogic } from "./widgets/definition";
63
59
  /** @hidden */
64
- export type { DefinitionDefaultWidgetOptions } from "./widgets/definition";
65
- /** @hidden */
66
60
  export { default as dropdownLogic } from "./widgets/dropdown";
67
61
  /** @hidden */
68
- export type { DropdownDefaultWidgetOptions } from "./widgets/dropdown";
69
- /** @hidden */
70
62
  export { default as explanationLogic } from "./widgets/explanation";
71
63
  /** @hidden */
72
- export type { ExplanationDefaultWidgetOptions } from "./widgets/explanation";
73
- /** @hidden */
74
64
  export { default as expressionLogic } from "./widgets/expression";
75
65
  /** @hidden */
76
- export type { ExpressionDefaultWidgetOptions } from "./widgets/expression";
77
- /** @hidden */
78
66
  export { default as deriveExtraKeys } from "./widgets/expression/derive-extra-keys";
79
67
  /** @hidden */
80
68
  export { default as gradedGroupLogic } from "./widgets/graded-group";
81
69
  /** @hidden */
82
70
  export { default as freeResponseLogic } from "./widgets/free-response";
83
71
  /** @hidden */
84
- export type { FreeResponseDefaultWidgetOptions } from "./widgets/free-response";
85
- /** @hidden */
86
- export type { GradedGroupDefaultWidgetOptions } from "./widgets/graded-group";
87
- /** @hidden */
88
72
  export { default as gradedGroupSetLogic } from "./widgets/graded-group-set";
89
73
  /** @hidden */
90
- export type { GradedGroupSetDefaultWidgetOptions } from "./widgets/graded-group-set";
91
- /** @hidden */
92
74
  export { default as grapherLogic } from "./widgets/grapher";
93
75
  /** @hidden */
94
- export type { GrapherDefaultWidgetOptions } from "./widgets/grapher";
95
- /** @hidden */
96
76
  export { default as groupLogic } from "./widgets/group";
97
77
  /** @hidden */
98
- export type { GroupDefaultWidgetOptions } from "./widgets/group";
99
- /** @hidden */
100
78
  export { default as iframeLogic } from "./widgets/iframe";
101
79
  /** @hidden */
102
- export type { IFrameDefaultWidgetOptions } from "./widgets/iframe";
103
- /** @hidden */
104
80
  export { default as imageLogic } from "./widgets/image";
105
81
  /** @hidden */
106
- export type { ImageDefaultWidgetOptions } from "./widgets/image";
107
- /** @hidden */
108
82
  export { default as inputNumberLogic } from "./widgets/input-number";
109
83
  /** @hidden */
110
- export type { InputNumberDefaultWidgetOptions } from "./widgets/input-number";
111
- /** @hidden */
112
84
  export { default as interactionLogic } from "./widgets/interaction";
113
85
  /** @hidden */
114
- export type { InteractionDefaultWidgetOptions } from "./widgets/interaction";
115
- /** @hidden */
116
86
  export { default as interactiveGraphLogic } from "./widgets/interactive-graph";
117
87
  /** @hidden */
118
- export type { InteractiveGraphDefaultWidgetOptions } from "./widgets/interactive-graph";
119
- /** @hidden */
120
88
  export { default as labelImageLogic } from "./widgets/label-image";
121
89
  /** @hidden */
122
- export type { LabelImageDefaultWidgetOptions } from "./widgets/label-image";
123
- /** @hidden */
124
90
  export { default as matcherLogic } from "./widgets/matcher";
125
91
  /** @hidden */
126
- export type { MatcherDefaultWidgetOptions } from "./widgets/matcher";
127
- /** @hidden */
128
92
  export { default as matrixLogic } from "./widgets/matrix";
129
93
  /** @hidden */
130
- export type { MatrixDefaultWidgetOptions } from "./widgets/matrix";
131
- /** @hidden */
132
94
  export { default as measurerLogic } from "./widgets/measurer";
133
95
  /** @hidden */
134
- export type { MeasurerDefaultWidgetOptions } from "./widgets/measurer";
135
- /** @hidden */
136
96
  export { default as numberLineLogic } from "./widgets/number-line";
137
97
  /** @hidden */
138
- export type { NumberLineDefaultWidgetOptions } from "./widgets/number-line";
139
- /** @hidden */
140
98
  export { default as numericInputLogic } from "./widgets/numeric-input";
141
99
  /** @hidden */
142
- export type { NumericInputDefaultWidgetOptions } from "./widgets/numeric-input";
143
- /** @hidden */
144
100
  export { default as ordererLogic } from "./widgets/orderer";
145
101
  /** @hidden */
146
- export type { OrdererDefaultWidgetOptions } from "./widgets/orderer";
147
- /** @hidden */
148
102
  export { default as phetSimulationLogic } from "./widgets/phet-simulation";
149
103
  /** @hidden */
150
- export type { PhetSimulationDefaultWidgetOptions } from "./widgets/phet-simulation";
151
- /** @hidden */
152
104
  export { default as plotterLogic } from "./widgets/plotter";
153
105
  /** @hidden */
154
- export type { PlotterDefaultWidgetOptions } from "./widgets/plotter";
155
- /** @hidden */
156
106
  export { default as pythonProgramLogic } from "./widgets/python-program";
157
107
  /** @hidden */
158
- export type { PythonProgramDefaultWidgetOptions } from "./widgets/python-program";
159
- /** @hidden */
160
108
  export { default as radioLogic } from "./widgets/radio";
161
109
  /** @hidden */
162
- export type { RadioDefaultWidgetOptions } from "./widgets/radio";
163
- /** @hidden */
164
110
  export { usesNumCorrect } from "./widgets/radio/radio-util";
165
111
  /** @hidden */
166
112
  export { default as sorterLogic } from "./widgets/sorter";
167
113
  /** @hidden */
168
- export type { SorterDefaultWidgetOptions } from "./widgets/sorter";
169
- /** @hidden */
170
114
  export { default as tableLogic } from "./widgets/table";
171
115
  /** @hidden */
172
- export type { TableDefaultWidgetOptions } from "./widgets/table";
173
- /** @hidden */
174
116
  export { default as videoLogic } from "./widgets/video";
175
117
  /** @hidden */
176
- export type { VideoDefaultWidgetOptions } from "./widgets/video";
177
- /** @hidden */
178
118
  export { convertGrapherOptionsToInteractiveGraph, convertGrapherUserInputToInteractiveGraph, convertInteractiveGraphUserInputToGrapher, } from "./widgets/grapher/to-interactive-graph";
179
119
  /** @hidden */
180
120
  export { applyDefaultsToWidgets, applyDefaultsToWidget, } from "./widgets/apply-defaults";
@@ -191,7 +131,7 @@ export type * from "./widgets/logic-export.types";
191
131
  /** @hidden */
192
132
  export * as CoreWidgetRegistry from "./widgets/core-widget-registry";
193
133
  /** @hidden */
194
- export { getOrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
134
+ export { getOrdererPublicWidgetOptions, mergeCards, toCard, } from "./widgets/orderer/orderer-util";
195
135
  /** @hidden */
196
136
  export type { OrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
197
137
  /** @hidden */
@@ -213,6 +153,8 @@ export type { GrapherPublicWidgetOptions } from "./widgets/grapher/grapher-util"
213
153
  /** @hidden */
214
154
  export { getGroupPublicWidgetOptions } from "./widgets/group/group-util";
215
155
  /** @hidden */
156
+ export type { GroupPublicWidgetOptions } from "./widgets/group/group-util";
157
+ /** @hidden */
216
158
  export { getInteractiveGraphPublicWidgetOptions, type InteractiveGraphPublicWidgetOptions, } from "./widgets/interactive-graph/interactive-graph-util";
217
159
  /** @hidden */
218
160
  export { getLabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
@@ -318,6 +260,10 @@ export { generateRadioOptions, generateRadioChoice, generateSimpleRadioQuestion,
318
260
  export { generateVideoWidget } from "./utils/generators/video-widget-generator";
319
261
  /** @hidden */
320
262
  export { generateSorterWidget, generateSorterOptions, } from "./utils/generators/sorter-widget-generator";
263
+ /** @hidden */
264
+ export { generateTableOptions } from "./utils/generators/table-widget-generator";
265
+ /** @hidden */
266
+ export { generateGrapherWidgetOptions } from "./utils/generators/grapher-widget-generator";
321
267
  export { getAnswersFromWidgets, injectWidgets, } from "./utils/extract-perseus-ai-data";
322
268
  /** @hidden */
323
269
  export { getPerseusAIData } from "./utils/extract-perseus-ai-data";
@@ -104,7 +104,9 @@ const stringOrNumberOrNullOrUndefined=union(string).or(number).or(constant(null)
104
104
 
105
105
  const parseFreeResponseWidget=parseWidget(constant("free-response"),object({allowUnlimitedCharacters:boolean,characterLimit:number,placeholder:string,question:string,scoringCriteria:array(object({text:string}))}));
106
106
 
107
- const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),hint:union(falseToNull).or(constant(null)).or(constant(undefined)).or((rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx)).parser,content:string,widgets:(rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),images:record(string,object({width:number,height:number}))});const parseGradedGroupWidget=parseWidget(constant("graded-group"),parseGradedGroupWidgetOptions);
107
+ const booleanOrFalse=defaulted(boolean,()=>false);const calculatorVariantOrUndefined=pipeParsers(defaulted(nullable(enumeration("scientific","graphing","four_function")),()=>null)).then(convert(v=>v??undefined)).parser;const baseParser=defaulted(object({calculator:booleanOrFalse,calculatorVariant:calculatorVariantOrUndefined,financialCalculatorMonthlyPayment:booleanOrFalse,financialCalculatorTotalAmount:booleanOrFalse,financialCalculatorTimeToPayOff:booleanOrFalse,periodicTable:booleanOrFalse,periodicTableWithKey:booleanOrFalse}),()=>({calculator:false,calculatorVariant:undefined,financialCalculatorMonthlyPayment:false,financialCalculatorTotalAmount:false,financialCalculatorTimeToPayOff:false,periodicTable:false,periodicTableWithKey:false}));const parsePerseusAnswerArea=pipeParsers(baseParser).then(convert(parsed=>{const{calculatorVariant:parsedCalcVariant,...rest}=parsed;const calculatorVariant=parsed.calculator&&parsedCalcVariant===undefined?"scientific":parsedCalcVariant;return calculatorVariant!==undefined?{...rest,calculatorVariant}:rest})).parser;
108
+
109
+ const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),hint:union(falseToNull).or(constant(null)).or(constant(undefined)).or((rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx)).parser,content:string,widgets:(rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),images:record(string,object({width:number,height:number})),answerArea:optional(parsePerseusAnswerArea)});const parseGradedGroupWidget=parseWidget(constant("graded-group"),parseGradedGroupWidgetOptions);
108
110
 
109
111
  const parseGradedGroupSetWidget=parseWidget(constant("graded-group-set"),object({gradedGroups:array(parseGradedGroupWidgetOptions)}));
110
112
 
@@ -168,8 +170,6 @@ union(parsePerseusRenderer).or(array(parsePerseusRenderer)).parser;
168
170
 
169
171
  const parseHint=object({replace:defaulted(optional(boolean),()=>undefined),placeholder:defaulted(optional(boolean),()=>undefined),content:string,widgets:defaulted(parseWidgetsMap,()=>({})),images:parseImages,metadata:any});
170
172
 
171
- const booleanOrFalse=defaulted(boolean,()=>false);const calculatorVariantOrUndefined=pipeParsers(defaulted(nullable(enumeration("scientific","graphing","four_function")),()=>null)).then(convert(v=>v??undefined)).parser;const baseParser=defaulted(object({calculator:booleanOrFalse,calculatorVariant:calculatorVariantOrUndefined,financialCalculatorMonthlyPayment:booleanOrFalse,financialCalculatorTotalAmount:booleanOrFalse,financialCalculatorTimeToPayOff:booleanOrFalse,periodicTable:booleanOrFalse,periodicTableWithKey:booleanOrFalse}),()=>({calculator:false,calculatorVariant:undefined,financialCalculatorMonthlyPayment:false,financialCalculatorTotalAmount:false,financialCalculatorTimeToPayOff:false,periodicTable:false,periodicTableWithKey:false}));const parsePerseusAnswerArea=pipeParsers(baseParser).then(convert(parsed=>{const{calculatorVariant:parsedCalcVariant,...rest}=parsed;const calculatorVariant=parsed.calculator&&parsedCalcVariant===undefined?"scientific":parsedCalcVariant;return calculatorVariant!==undefined?{...rest,calculatorVariant}:rest})).parser;
172
-
173
173
  const parsePerseusItem=object({question:parsePerseusRenderer,hints:defaulted(array(parseHint),()=>[]),answerArea:parsePerseusAnswerArea});
174
174
 
175
175
  const coord=pair(number,number);const coordPair=pair(coord,coord);const parseAbsoluteValueBranch=object({type:constant("absolute_value"),coords:nullable(coordPair)});const parseExponentialBranch=object({type:constant("exponential"),asymptote:coordPair,coords:nullable(coordPair)});const parseLinearBranch=object({type:constant("linear"),coords:nullable(coordPair)});const parseLogarithmBranch=object({type:constant("logarithm"),asymptote:coordPair,coords:nullable(coordPair)});const parseQuadraticBranch=object({type:constant("quadratic"),coords:nullable(coordPair)});const parseSinusoidBranch=object({type:constant("sinusoid"),coords:nullable(coordPair)});const parseTangentBranch=object({type:constant("tangent"),coords:nullable(coordPair)});discriminatedUnionOn("type").withBranch("absolute_value",parseAbsoluteValueBranch).withBranch("exponential",parseExponentialBranch).withBranch("linear",parseLinearBranch).withBranch("logarithm",parseLogarithmBranch).withBranch("quadratic",parseQuadraticBranch).withBranch("sinusoid",parseSinusoidBranch).withBranch("tangent",parseTangentBranch).parser;
@@ -188,6 +188,10 @@ class Registry{throwIfUnregistered(){if(!this.anythingRegistered){throw new Erro
188
188
 
189
189
  const seededRNG=function(seed){let randomSeed=seed;return function(){let seed=randomSeed;seed=seed+0x7ed55d16+(seed<<12)&0xffffffff;seed=(seed^0xc761c23c^seed>>>19)&0xffffffff;seed=seed+0x165667b1+(seed<<5)&0xffffffff;seed=(seed+0xd3a2646c^seed<<9)&0xffffffff;seed=seed+0xfd7046c5+(seed<<3)&0xffffffff;seed=(seed^0xb55a4f09^seed>>>16)&0xffffffff;return (randomSeed=seed&0xfffffff)/0x10000000}};seededRNG(new Date().getTime()&0xffffffff);
190
190
 
191
+ function toCard(content){return {content,widgets:{},images:{}}}function getCategoryScore(content){if(/\d/.test(content)){return 0}if(/^\$?[a-zA-Z]+\$?$/.test(content)){return 2}return 1}function mergeCards(correctOptions,otherOptions){const allCards=[...correctOptions,...otherOptions];return [...new Set(allCards.map(card=>card.content))].filter(content=>content!=="").sort().sort((a,b)=>getCategoryScore(a)-getCategoryScore(b)).map(toCard)}
192
+
193
+ const defaultCorrectOptions=[toCard("$x$")];const defaultOtherOptions=[toCard("$y$")];({options:mergeCards(defaultCorrectOptions,defaultOtherOptions)});
194
+
191
195
  const defaultRows=4;const defaultColumns=1;new Array(defaultRows).fill(0).map(()=>new Array(defaultColumns).fill(""));
192
196
 
193
197
  const widgets=new Registry("Core widget registry");function getCurrentVersion(type){const widgetLogic=widgets.get(type);return widgetLogic?.version||{major:0,minor:0}}const getPublicWidgetOptionsFunction=type=>{return widgets.get(type)?.getPublicWidgetOptions??(i=>i)};function getDefaultWidgetOptions(type){const widgetLogic=widgets.get(type);return widgetLogic?.defaultWidgetOptions||{}}const getSupportedAlignments=type=>{const widgetLogic=widgets.get(type);if(!widgetLogic?.supportedAlignments?.[0]){return ["default"]}return widgetLogic?.supportedAlignments};