@khanacademy/perseus-score 8.1.1 → 8.2.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.
package/dist/index.d.ts CHANGED
@@ -31,5 +31,6 @@ export { scorePerseusItem, scoreWidgetsFunctional } from "./score";
31
31
  export { default as flattenScores } from "./util/flatten-scores";
32
32
  export { validateUserInput, emptyWidgetsFunctional } from "./validate";
33
33
  export { default as hasEmptyDINERWidgets } from "./has-empty-diner-widgets";
34
+ export { default as isWidgetScoreable } from "./util/is-widget-scoreable";
34
35
  export type { PerseusMockWidgetRubric, PerseusMockWidgetUserInput, } from "./widgets/mock-widget/mock-widget-validation.types";
35
36
  export * from "./widgets/widget-registry";
package/dist/index.js CHANGED
@@ -92,13 +92,9 @@ const inputNumberAnswerTypes={number:{name:"Numbers",forms:"integer, decimal, pr
92
92
 
93
93
  const noScore={type:"points",earned:0,total:0,message:null};function combineScores(scoreA,scoreB){let message;if(scoreA.type==="points"&&scoreB.type==="points"){if(scoreA.message&&scoreB.message&&scoreA.message!==scoreB.message){message=null;}else {message=scoreA.message||scoreB.message;}return {type:"points",earned:scoreA.earned+scoreB.earned,total:scoreA.total+scoreB.total,message:message}}if(scoreA.type==="points"&&scoreB.type==="invalid"){return scoreB}if(scoreA.type==="invalid"&&scoreB.type==="points"){return scoreA}if(scoreA.type==="invalid"&&scoreB.type==="invalid"){if(scoreA.message&&scoreB.message&&scoreA.message!==scoreB.message){message=null;}else {message=scoreA.message||scoreB.message;}return {type:"invalid",message:message}}throw new perseusCore.PerseusError("PerseusScore with unknown type encountered",perseusCore.Errors.InvalidInput,{metadata:{scoreA:JSON.stringify(scoreA),scoreB:JSON.stringify(scoreB)}})}function flattenScores(widgetScoreMap){return Object.values(widgetScoreMap).reduce(combineScores,noScore)}
94
94
 
95
- function isWidgetScoreable(widget){if(!widget){return false}const widgetIsGraded=widget.graded==null||widget.graded;const widgetIsStatic=!!widget.static;return widgetIsGraded&&!widgetIsStatic}
95
+ function scoreDeprecatedStandin(userInput,rubric,locale){return {type:"points",earned:1,total:1,message:null}}
96
96
 
97
- function getScoreableWidgets(perseusRenderData){const usedWidgetIds=perseusCore.getWidgetIdsFromContent(perseusRenderData.content);const upgradedWidgets=perseusCore.applyDefaultsToWidgets(perseusRenderData.widgets);const scoreableWidgetIds=usedWidgetIds.filter(id=>isWidgetScoreable(upgradedWidgets[id]));return {upgradedWidgets,scoreableWidgetIds}}
98
-
99
- function scoreNoop(points=0){return {type:"points",earned:points,total:points,message:null}}
100
-
101
- function scoreFreeResponse(userInput,rubric,locale){return scoreNoop()}
97
+ function scoreFreeResponse(userInput,rubric,locale){return {type:"points",earned:0,total:0,message:null}}
102
98
 
103
99
  function validateFreeResponse(userInput,widgetOptions){const userInputLength=userInput?.currentValue.trim().length??0;if(userInputLength===0){return {type:"invalid",message:perseusCore.ErrorCodes.USER_INPUT_EMPTY}}if(!widgetOptions.allowUnlimitedCharacters&&userInputLength>widgetOptions.characterLimit){return {type:"invalid",message:perseusCore.ErrorCodes.USER_INPUT_TOO_LONG}}return null}
104
100
 
@@ -116,7 +112,11 @@ function validateMockWidget(userInput){if(userInput?.currentValue==null||userInp
116
112
 
117
113
  function scoreMockWidget(userInput,rubric){const validationResult=validateMockWidget(userInput);if(validationResult!=null){return validationResult}return {type:"points",earned:userInput?.currentValue===rubric.value?1:0,total:1,message:""}}
118
114
 
119
- const widgets=new perseusCore.Registry("Score widget registry");function registerWidget(type,scorer,validator){const logic={scorer,validator};widgets.set(type,logic);}const getWidgetValidator=type=>{return widgets.get(type)?.validator??null};const getWidgetScorer=type=>{return widgets.get(type)?.scorer??null};registerWidget("categorizer",scoreCategorizer,validateCategorizer);registerWidget("cs-program",scoreCSProgram);registerWidget("dropdown",scoreDropdown,validateDropdown);registerWidget("expression",scoreExpression,validateExpression);registerWidget("free-response",scoreFreeResponse,validateFreeResponse);registerWidget("grapher",scoreGrapher);registerWidget("group",scoreGroup,validateGroup);registerWidget("iframe",scoreIframe);registerWidget("input-number",scoreInputNumber);registerWidget("interactive-graph",scoreInteractiveGraph);registerWidget("label-image",scoreLabelImage,validateLabelImage);registerWidget("matcher",scoreMatcher);registerWidget("matrix",scoreMatrix,validateMatrix);registerWidget("mock-widget",scoreMockWidget,scoreMockWidget);registerWidget("number-line",scoreNumberLine);registerWidget("numeric-input",scoreNumericInput);registerWidget("orderer",scoreOrderer,validateOrderer);registerWidget("plotter",scorePlotter,validatePlotter);registerWidget("radio",scoreRadio,validateRadio);registerWidget("sorter",scoreSorter,validateSorter);registerWidget("table",scoreTable,validateTable);registerWidget("deprecated-standin",()=>scoreNoop(1));registerWidget("measurer",()=>scoreNoop(1));registerWidget("definition",scoreNoop);registerWidget("explanation",scoreNoop);registerWidget("image",scoreNoop);registerWidget("interaction",scoreNoop);registerWidget("molecule",scoreNoop);registerWidget("passage",scoreNoop);registerWidget("passage-ref",scoreNoop);registerWidget("passage-ref-target",scoreNoop);registerWidget("video",scoreNoop);
115
+ const widgets=new perseusCore.Registry("Score widget registry");function registerWidget(type,scorer,validator){const logic={scorer,validator};widgets.set(type,logic);}const getWidgetValidator=type=>{return widgets.get(type)?.validator??null};const getWidgetScorer=type=>{return widgets.get(type)?.scorer??null};registerWidget("categorizer",scoreCategorizer,validateCategorizer);registerWidget("cs-program",scoreCSProgram);registerWidget("deprecated-standin",scoreDeprecatedStandin);registerWidget("dropdown",scoreDropdown,validateDropdown);registerWidget("expression",scoreExpression,validateExpression);registerWidget("free-response",scoreFreeResponse,validateFreeResponse);registerWidget("grapher",scoreGrapher);registerWidget("group",scoreGroup,validateGroup);registerWidget("iframe",scoreIframe);registerWidget("input-number",scoreInputNumber);registerWidget("interactive-graph",scoreInteractiveGraph);registerWidget("label-image",scoreLabelImage,validateLabelImage);registerWidget("matcher",scoreMatcher);registerWidget("matrix",scoreMatrix,validateMatrix);registerWidget("mock-widget",scoreMockWidget,scoreMockWidget);registerWidget("number-line",scoreNumberLine);registerWidget("numeric-input",scoreNumericInput);registerWidget("orderer",scoreOrderer,validateOrderer);registerWidget("plotter",scorePlotter,validatePlotter);registerWidget("radio",scoreRadio,validateRadio);registerWidget("sorter",scoreSorter,validateSorter);registerWidget("table",scoreTable,validateTable);
116
+
117
+ function isWidgetScoreable(widget){if(!widget){return false}const widgetIsGraded=widget.graded==null||widget.graded;const widgetIsStatic=!!widget.static;const widgetHasScorer=getWidgetScorer(widget.type)!==null;return widgetIsGraded&&!widgetIsStatic&&widgetHasScorer}
118
+
119
+ function getScoreableWidgets(perseusRenderData){const usedWidgetIds=perseusCore.getWidgetIdsFromContent(perseusRenderData.content);const upgradedWidgets=perseusCore.applyDefaultsToWidgets(perseusRenderData.widgets);const scoreableWidgetIds=usedWidgetIds.filter(id=>isWidgetScoreable(upgradedWidgets[id]));return {upgradedWidgets,scoreableWidgetIds}}
120
120
 
121
121
  function scorePerseusItem(perseusRenderData,userInputMap,locale){const{upgradedWidgets,scoreableWidgetIds}=getScoreableWidgets(perseusRenderData);const scores=scoreWidgetsFunctional(upgradedWidgets,scoreableWidgetIds,userInputMap,locale);return flattenScores(scores)}function scoreWidgetsFunctional(widgets,widgetIds,userInputMap,locale){const upgradedWidgets=perseusCore.applyDefaultsToWidgets(widgets);const gradedWidgetIds=widgetIds.filter(id=>isWidgetScoreable(upgradedWidgets[id]));const widgetScores={};gradedWidgetIds.forEach(id=>{const widget=upgradedWidgets[id];const userInput=userInputMap[id];const validator=getWidgetValidator(widget.type);const scorer=getWidgetScorer(widget.type);const score=validator?.(userInput,widget.options,locale)??scorer?.(userInput,widget.options,locale);if(score!=null){widgetScores[id]=score;}});return widgetScores}
122
122
 
@@ -129,6 +129,7 @@ exports.getWidgetScorer = getWidgetScorer;
129
129
  exports.getWidgetValidator = getWidgetValidator;
130
130
  exports.hasEmptyDINERWidgets = hasEmptyDINERWidgets;
131
131
  exports.inputNumberAnswerTypes = inputNumberAnswerTypes;
132
+ exports.isWidgetScoreable = isWidgetScoreable;
132
133
  exports.registerWidget = registerWidget;
133
134
  exports.scoreCSProgram = scoreCSProgram;
134
135
  exports.scoreCategorizer = scoreCategorizer;