@khanacademy/perseus-score 8.1.2 → 8.2.1
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/es/index.js +9 -9
- package/dist/es/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/widgets/deprecated-standin/score-deprecated-standin.d.ts +10 -0
- package/package.json +4 -4
- package/dist/util/score-noop.d.ts +0 -11
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
|
|
95
|
+
function scoreDeprecatedStandin(userInput,rubric,locale){return {type:"points",earned:1,total:1,message:null}}
|
|
96
96
|
|
|
97
|
-
function
|
|
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);
|
|
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;
|