@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
@@ -549,6 +549,8 @@ export type PerseusGradedGroupWidgetOptions = {
549
549
  images: {
550
550
  [key: string]: PerseusImageDetail;
551
551
  };
552
+ /** optional content extras (calculators/financial calcs/periodic tables) */
553
+ answerArea?: PerseusAnswerArea;
552
554
  };
553
555
  /** Options for the graded-group-set widget. A set of graded groups. */
554
556
  export type PerseusGradedGroupSetWidgetOptions = {
@@ -1572,16 +1574,20 @@ export type PerseusSorterWidgetOptions = {
1572
1574
  * will see the cards in a randomized order.
1573
1575
  */
1574
1576
  correct: string[];
1575
- /**
1576
- * Adds padding to the options. Padding is good for text but not needed
1577
- * for images
1578
- */
1579
- padding: boolean;
1580
1577
  /**
1581
1578
  * Use the "horizontal" layout for short text and small images. The
1582
1579
  * "vertical" layout is best for longer text and larger images.
1583
1580
  */
1584
1581
  layout: "horizontal" | "vertical";
1582
+ /**
1583
+ * Adds padding to the options. Padding is good for text but not needed
1584
+ * for images
1585
+ *
1586
+ * @deprecated
1587
+ *
1588
+ * TODO(LEMS-4538): remove padding from Sorter
1589
+ */
1590
+ padding: boolean;
1585
1591
  };
1586
1592
  /** Options for the table widget. A grid of input cells with column headers. */
1587
1593
  export type PerseusTableWidgetOptions = {
@@ -80,7 +80,9 @@ const stringOrNumberOrNullOrUndefined=union(string).or(number).or(constant(null)
80
80
 
81
81
  const parseFreeResponseWidget=parseWidget(constant("free-response"),object({allowUnlimitedCharacters:boolean,characterLimit:number,placeholder:string,question:string,scoringCriteria:array(object({text:string}))}));
82
82
 
83
- 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);
83
+ 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;
84
+
85
+ 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);
84
86
 
85
87
  const parseGradedGroupSetWidget=parseWidget(constant("graded-group-set"),object({gradedGroups:array(parseGradedGroupWidgetOptions)}));
86
88
 
@@ -144,8 +146,6 @@ union(parsePerseusRenderer).or(array(parsePerseusRenderer)).parser;
144
146
 
145
147
  const parseHint=object({replace:defaulted(optional(boolean),()=>undefined),placeholder:defaulted(optional(boolean),()=>undefined),content:string,widgets:defaulted(parseWidgetsMap,()=>({})),images:parseImages,metadata:any});
146
148
 
147
- 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;
148
-
149
149
  const parsePerseusItem=object({question:parsePerseusRenderer,hints:defaulted(array(parseHint),()=>[]),answerArea:parsePerseusAnswerArea});
150
150
 
151
151
  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;
@@ -164,6 +164,10 @@ class Registry{throwIfUnregistered(){if(!this.anythingRegistered){throw new Erro
164
164
 
165
165
  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);
166
166
 
167
+ 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)}
168
+
169
+ const defaultCorrectOptions=[toCard("$x$")];const defaultOtherOptions=[toCard("$y$")];({options:mergeCards(defaultCorrectOptions,defaultOtherOptions)});
170
+
167
171
  const defaultRows=4;const defaultColumns=1;new Array(defaultRows).fill(0).map(()=>new Array(defaultColumns).fill(""));
168
172
 
169
173
  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};