@khanacademy/perseus-core 35.0.0 → 36.0.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 +6 -2
  2. package/dist/es/index.item-splitting.js +4 -4
  3. package/dist/es/index.item-splitting.js.map +1 -1
  4. package/dist/es/index.js +10 -6
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.d.ts +5 -1
  7. package/dist/index.item-splitting.js +4 -4
  8. package/dist/index.item-splitting.js.map +1 -1
  9. package/dist/index.js +14 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/parse-perseus-json/general-purpose-parsers/object.d.ts +0 -19
  12. package/dist/parse-perseus-json/perseus-parsers/blank-widget.d.ts +15 -4
  13. package/dist/parse-perseus-json/perseus-parsers/categorizer-widget.d.ts +18 -7
  14. package/dist/parse-perseus-json/perseus-parsers/cs-program-widget.d.ts +22 -11
  15. package/dist/parse-perseus-json/perseus-parsers/definition-widget.d.ts +16 -5
  16. package/dist/parse-perseus-json/perseus-parsers/dropdown-widget.d.ts +21 -10
  17. package/dist/parse-perseus-json/perseus-parsers/explanation-widget.d.ts +18 -7
  18. package/dist/parse-perseus-json/perseus-parsers/expression-widget.d.ts +27 -16
  19. package/dist/parse-perseus-json/perseus-parsers/graded-group-set-widget.d.ts +26 -15
  20. package/dist/parse-perseus-json/perseus-parsers/graded-group-widget.d.ts +24 -13
  21. package/dist/parse-perseus-json/perseus-parsers/grapher-widget.d.ts +60 -49
  22. package/dist/parse-perseus-json/perseus-parsers/group-widget.d.ts +12 -1
  23. package/dist/parse-perseus-json/perseus-parsers/iframe-widget.d.ts +23 -12
  24. package/dist/parse-perseus-json/perseus-parsers/image-widget.d.ts +34 -23
  25. package/dist/parse-perseus-json/perseus-parsers/input-number-widget.d.ts +45 -23
  26. package/dist/parse-perseus-json/perseus-parsers/interaction-widget.d.ts +135 -124
  27. package/dist/parse-perseus-json/perseus-parsers/interactive-graph-widget.d.ts +375 -364
  28. package/dist/parse-perseus-json/perseus-parsers/label-image-widget.d.ts +27 -16
  29. package/dist/parse-perseus-json/perseus-parsers/matcher-widget.d.ts +18 -7
  30. package/dist/parse-perseus-json/perseus-parsers/matrix-widget.d.ts +17 -6
  31. package/dist/parse-perseus-json/perseus-parsers/measurer-widget.d.ts +28 -17
  32. package/dist/parse-perseus-json/perseus-parsers/number-line-widget.d.ts +28 -17
  33. package/dist/parse-perseus-json/perseus-parsers/numeric-input-widget.d.ts +26 -15
  34. package/dist/parse-perseus-json/perseus-parsers/orderer-widget.d.ts +18 -7
  35. package/dist/parse-perseus-json/perseus-parsers/phet-simulation-widget.d.ts +15 -4
  36. package/dist/parse-perseus-json/perseus-parsers/plotter-widget.d.ts +26 -15
  37. package/dist/parse-perseus-json/perseus-parsers/python-program-widget.d.ts +15 -4
  38. package/dist/parse-perseus-json/perseus-parsers/radio-widget.d.ts +138 -83
  39. package/dist/parse-perseus-json/perseus-parsers/sorter-widget.d.ts +16 -5
  40. package/dist/parse-perseus-json/perseus-parsers/table-widget.d.ts +17 -6
  41. package/dist/parse-perseus-json/perseus-parsers/video-widget.d.ts +14 -3
  42. package/dist/parse-perseus-json/perseus-parsers/widget.d.ts +25 -4
  43. package/dist/types.d.ts +0 -1
  44. package/dist/utils/generators/number-line-widget-generator.d.ts +3 -0
  45. package/dist/utils/generators/orderer-widget-generator.d.ts +9 -0
  46. package/dist/widgets/core-widget-registry.d.ts +1 -2
  47. package/dist/widgets/logic-export.types.d.ts +1 -2
  48. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -94,7 +94,7 @@ function nullable(parseValue){return (rawValue,ctx)=>{if(rawValue===null){return
94
94
 
95
95
  const number=(rawValue,ctx)=>{if(typeof rawValue==="number"&&Number.isFinite(rawValue)){return ctx.success(rawValue)}return ctx.failure("number",rawValue)};
96
96
 
97
- function objectWithAllPropertiesRequired(schema){return object(schema)}function object(schema){return objectParserWithInitializer(()=>({}),schema)}function looseObject(schema){return objectParserWithInitializer(rawValue=>({...rawValue}),schema)}function objectParserWithInitializer(initializeParsedValue,schema){return (rawValue,ctx)=>{if(!isPlainObject(rawValue)){return ctx.failure("object",rawValue)}const parsed=initializeParsedValue(rawValue);const mismatches=[];for(const[prop,propParser]of Object.entries(schema)){const result=propParser(rawValue[prop],ctx.forSubtree(prop));if(isSuccess(result)){if(result.value!==undefined||prop in rawValue){parsed[prop]=result.value;}}else {mismatches.push(...result.detail);}}if(mismatches.length>0){return failure(mismatches)}return ctx.success(parsed)}}
97
+ function object(schema){return objectParserWithInitializer(()=>({}),schema)}function looseObject(schema){return objectParserWithInitializer(rawValue=>({...rawValue}),schema)}function objectParserWithInitializer(initializeParsedValue,schema){return (rawValue,ctx)=>{if(!isPlainObject(rawValue)){return ctx.failure("object",rawValue)}const parsed=initializeParsedValue(rawValue);const mismatches=[];for(const[prop,propParser]of Object.entries(schema)){const result=propParser(rawValue[prop],ctx.forSubtree(prop));if(isSuccess(result)){if(result.value!==undefined||prop in rawValue){parsed[prop]=result.value;}}else {mismatches.push(...result.detail);}}if(mismatches.length>0){return failure(mismatches)}return ctx.success(parsed)}}
98
98
 
99
99
  function optional(parseValue){return (rawValue,ctx)=>{if(rawValue===undefined){return ctx.success(rawValue)}return parseValue(rawValue,ctx)}}
100
100
 
@@ -114,7 +114,9 @@ const parsePerseusImageDetail=object({width:number,height:number});
114
114
 
115
115
  const parseImages=defaulted(record(string,parsePerseusImageDetail),()=>({}));
116
116
 
117
- function parseWidget(parseType,parseOptions){return objectWithAllPropertiesRequired({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:optional(string),options:parseOptions,key:optional(nullable(number)),version:optional(object({major:number,minor:number}))})}function parseWidgetWithVersion(parseVersion,parseType,parseOptions){return objectWithAllPropertiesRequired({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:optional(string),options:parseOptions,key:optional(nullable(number)),version:parseVersion})}
117
+ function convert(f){return (rawValue,ctx)=>ctx.success(f(rawValue))}
118
+
119
+ const parseAlignment=pipeParsers(enumeration("default","block","inline-block","inline","wrap-left","wrap-right","full-width","",undefined)).then(convert(value=>value===""?"default":value)).parser;function parseWidget(parseType,parseOptions){return object({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:parseAlignment,options:parseOptions,key:optional(nullable(number)),version:optional(object({major:number,minor:number}))})}function parseWidgetWithVersion(parseVersion,parseType,parseOptions){return object({type:parseType,static:optional(boolean),graded:optional(boolean),alignment:parseAlignment,options:parseOptions,key:optional(nullable(number)),version:parseVersion})}
118
120
 
119
121
  const parseBlankWidget=parseWidget(constant("blank"),object({displayType:defaulted(enumeration("normal","superscript","subscript"),()=>"normal"),correctId:string}));
120
122
 
@@ -132,8 +134,6 @@ const KeypadKeys=["PLUS","MINUS","NEGATIVE","TIMES","DIVIDE","DECIMAL","PERIOD",
132
134
 
133
135
  function deriveExtraKeys(widgetOptions){if(widgetOptions.extraKeys){return widgetOptions.extraKeys}const defaultKeys=["PI"];if(widgetOptions.answerForms==null){return defaultKeys}const uniqueExtraVariables={};const uniqueExtraConstants={};for(const answerForm of widgetOptions.answerForms){const maybeExpr=KAS__namespace.parse(answerForm.value,widgetOptions);if(maybeExpr.parsed){const expr=maybeExpr.expr;const isGreek=symbol=>symbol==="pi"||symbol==="theta";const toKey=symbol=>isGreek(symbol)?symbol.toUpperCase():symbol;const isKey=key=>KeypadKeys.includes(key);for(const variable of expr.getVars()){const maybeKey=toKey(variable);if(isKey(maybeKey)){uniqueExtraVariables[maybeKey]=true;}}for(const constant of expr.getConsts()){const maybeKey=toKey(constant);if(isKey(maybeKey)){uniqueExtraConstants[maybeKey]=true;}}}}const extraVariables=Object.keys(uniqueExtraVariables).sort();const extraConstants=Object.keys(uniqueExtraConstants).sort();const extraKeys=[...extraVariables,...extraConstants];if(!extraKeys.length){return defaultKeys}return extraKeys}
134
136
 
135
- function convert(f){return (rawValue,ctx)=>ctx.success(f(rawValue))}
136
-
137
137
  const keypadKeys=enumeration("PLUS","MINUS","NEGATIVE","TIMES","DIVIDE","DECIMAL","PERIOD","PERCENT","CDOT","EQUAL","NEQ","GT","LT","GEQ","LEQ","FRAC_INCLUSIVE","FRAC_EXCLUSIVE","FRAC","EXP","EXP_2","EXP_3","SUB","SQRT","CUBE_ROOT","RADICAL","LEFT_PAREN","RIGHT_PAREN","LN","LOG","LOG_N","SIN","COS","TAN","PI","THETA","UP","RIGHT","DOWN","LEFT","BACKSPACE","DISMISS","JUMP_OUT_PARENTHESES","JUMP_OUT_EXPONENT","JUMP_OUT_BASE","JUMP_INTO_NUMERATOR","JUMP_OUT_NUMERATOR","JUMP_OUT_DENOMINATOR","NUM_0","NUM_1","NUM_2","NUM_3","NUM_4","NUM_5","NUM_6","NUM_7","NUM_8","NUM_9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
138
138
 
139
139
  const parseLegacyButtonSet=enumeration("basic","basic+div","trig","prealgebra","logarithms","basic relations","advanced relations","scientific");const parseLegacyButtonSets=defaulted(array(parseLegacyButtonSet),()=>["basic","trig","prealgebra","logarithms"]);
@@ -256,7 +256,7 @@ const parseUserInputMap=(rawValue,ctx)=>{if(!isPlainObject(rawValue)){return ctx
256
256
 
257
257
  function parseAndMigratePerseusItem(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusItem);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigratePerseusArticle(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusArticle);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigrateUserInputMap(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parseUserInputMap);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}function parseAndMigratePerseusRenderer(data){const object=typeof data==="string"?JSON.parse(data):data;const result=parse(object,parsePerseusRenderer);if(isFailure(result)){return failure({message:result.detail,invalidObject:object})}return result}
258
258
 
259
- const libName="@khanacademy/perseus-core";const libVersion="35.0.0";perseusUtils.addLibraryVersionToPerseusDebug(libName,libVersion);
259
+ const libName="@khanacademy/perseus-core";const libVersion="36.0.0";perseusUtils.addLibraryVersionToPerseusDebug(libName,libVersion);
260
260
 
261
261
  const Errors=Object.freeze({Unknown:"Unknown",Internal:"Internal",InvalidInput:"InvalidInput",NotAllowed:"NotAllowed",TransientService:"TransientService",Service:"Service"});
262
262
 
@@ -449,10 +449,14 @@ function generateInteractiveGraphWidget(interactiveGraphWidgetProperties){return
449
449
 
450
450
  function generateMatrixOptions(options){return {...matrixWidgetLogic.defaultWidgetOptions,...options}}function generateMatrixWidget(matrixWidgetProperties){return {type:"matrix",graded:true,version:{major:0,minor:0},static:false,alignment:"default",options:generateMatrixOptions(),...matrixWidgetProperties}}
451
451
 
452
+ function generateOrdererOption(content){return {content,widgets:{},images:{}}}function generateOrdererOptions(options){const merged={...ordererWidgetLogic.defaultWidgetOptions,...options};return {...merged,options:options?.options??[...merged.correctOptions,...merged.otherOptions]}}function generateOrdererWidget(ordererWidgetProperties){return {type:"orderer",graded:true,version:{major:0,minor:0},static:false,alignment:"default",...ordererWidgetProperties,options:generateOrdererOptions(ordererWidgetProperties?.options)}}
453
+
452
454
  function generatePlotterOptions(options){return {...plotterWidgetLogic.defaultWidgetOptions,...options}}function generatePlotterWidget(plotterWidgetProperties){return {type:"plotter",graded:true,version:{major:0,minor:0},static:false,alignment:"default",options:generatePlotterOptions(),...plotterWidgetProperties}}
453
455
 
454
456
  function generatePhetSimulationOptions(options){return {...phetSimulationWidgetLogic.defaultWidgetOptions,...options}}function generatePhetSimulationWidget(phetSimulationWidgetProperties){return {type:"phet-simulation",graded:false,version:{major:0,minor:0},static:false,alignment:"default",...phetSimulationWidgetProperties,options:generatePhetSimulationOptions(phetSimulationWidgetProperties?.options)}}
455
457
 
458
+ function generateNumberLineOptions(options){const defaultNumberLineOptions={range:[-4,4],labelRange:[null,null],labelStyle:"decimal",labelTicks:true,isInequality:false,isTickCtrl:false,divisionRange:[1,10],numDivisions:null,snapDivisions:2,tickStep:1,correctRel:"eq",correctX:null,initialX:null,showTooltips:false,static:false};return {...defaultNumberLineOptions,...options}}function generateNumberLineWidget(numberLineWidgetProperties){return {type:"number-line",graded:true,version:{major:0,minor:0},static:false,alignment:"default",...numberLineWidgetProperties,options:generateNumberLineOptions(numberLineWidgetProperties?.options)}}
459
+
456
460
  function generateNumericInputOptions(options){return {...numericInputWidgetLogic.defaultWidgetOptions,static:false,...options}}function generateNumericInputAnswer(answerOptions){return {...numericInputWidgetLogic.defaultWidgetOptions.answers[0],...answerOptions}}function generateNumericInputWidget(numericInputWidgetProperties){return {type:"numeric-input",graded:true,version:{major:0,minor:0},static:false,alignment:"default",options:generateNumericInputOptions(),...numericInputWidgetProperties}}
457
461
 
458
462
  function generateRadioOptions(options){return {...radioWidgetLogic.defaultWidgetOptions,...options}}function generateRadioWidget(radioWidgetProperties){return {type:"radio",graded:true,version:{major:0,minor:0},static:false,alignment:"default",options:generateRadioOptions(),...radioWidgetProperties}}function generateRadioChoice(text,options){return {content:text,id:`radio-choice-${Math.random()}`,correct:false,...options}}function generateSimpleRadioQuestion(options){return generateTestPerseusRenderer({content:"[[☃ radio 1]]",widgets:{"radio 1":generateRadioWidget({options:generateRadioOptions(options)})}})}function generateSimpleRadioItem(options){return generateTestPerseusItem({question:generateSimpleRadioQuestion(options)})}
@@ -558,9 +562,14 @@ exports.generateMatrixOptions = generateMatrixOptions;
558
562
  exports.generateMatrixWidget = generateMatrixWidget;
559
563
  exports.generateMeasurerOptions = generateMeasurerOptions;
560
564
  exports.generateMeasurerWidget = generateMeasurerWidget;
565
+ exports.generateNumberLineOptions = generateNumberLineOptions;
566
+ exports.generateNumberLineWidget = generateNumberLineWidget;
561
567
  exports.generateNumericInputAnswer = generateNumericInputAnswer;
562
568
  exports.generateNumericInputOptions = generateNumericInputOptions;
563
569
  exports.generateNumericInputWidget = generateNumericInputWidget;
570
+ exports.generateOrdererOption = generateOrdererOption;
571
+ exports.generateOrdererOptions = generateOrdererOptions;
572
+ exports.generateOrdererWidget = generateOrdererWidget;
564
573
  exports.generatePhetSimulationOptions = generatePhetSimulationOptions;
565
574
  exports.generatePhetSimulationWidget = generatePhetSimulationWidget;
566
575
  exports.generatePlotterOptions = generatePlotterOptions;