@khanacademy/perseus-core 0.0.0-PR3084-20251204231904 → 0.0.0-PR3084-20251218010953

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.
@@ -0,0 +1,39 @@
1
+ import type { PerseusItem, PerseusWidgetsMap, PerseusRenderer } from "../data-schema";
2
+ /**
3
+ * This function extracts the answers from the widgets.
4
+ *
5
+ * For each widget type, we first check to make sure the path to the answer exists,
6
+ * then we extract the answer and add it to the list of answers.
7
+ *
8
+ * A list is returned because some widgets, like multi-select radio widgets and groups
9
+ * can have multiple answers.
10
+ *
11
+ * @param {PerseusRenderer["widgets"]} widgets
12
+ * @returns a list of strings that are the answers to the widgets
13
+ */
14
+ export declare function getAnswersFromWidgets(widgets: PerseusRenderer["widgets"]): ReadonlyArray<string>;
15
+ /**
16
+ * Inject a string equivalent of the widgets into the content.
17
+ *
18
+ * Content may contain Perseus widgets, that looks like this: '[[☃ Radio 1]]'.
19
+ * This function replaces those widgets with its equivalent string.
20
+ *
21
+ * @param {string} content
22
+ * @param {PerseusRenderer["widgets"]} widgets
23
+ * @returns
24
+ */
25
+ export declare function injectWidgets(content: string, widgets: PerseusRenderer["widgets"], widgetProps?: PerseusWidgetsMap): string;
26
+ /**
27
+ * Get AI-ready data from a Perseus item for Khanmigo.
28
+ *
29
+ * This function extracts the correct answers from widgets and injects
30
+ * widget content into hints to provide Khanmigo with the context it needs
31
+ * to help students without requiring React rendering.
32
+ *
33
+ * @param {PerseusItem} perseusItem - The Perseus item containing question and hints
34
+ * @returns Object containing answers and processed hints
35
+ */
36
+ export declare function getPerseusAIData(perseusItem: PerseusItem): {
37
+ answers: ReadonlyArray<string>;
38
+ hints: ReadonlyArray<string>;
39
+ };
@@ -0,0 +1,3 @@
1
+ import type { DefinitionWidget, PerseusDefinitionWidgetOptions } from "../../data-schema";
2
+ export declare function generateDefinitionOptions(options?: Partial<PerseusDefinitionWidgetOptions>): PerseusDefinitionWidgetOptions;
3
+ export declare function generateDefinitionWidget(definitionWidgetProperties?: Partial<Omit<DefinitionWidget, "type">>): DefinitionWidget;
@@ -0,0 +1,3 @@
1
+ import type { DropdownWidget, PerseusDropdownWidgetOptions } from "../../data-schema";
2
+ export declare function generateDropdownOptions(options?: Partial<PerseusDropdownWidgetOptions>): PerseusDropdownWidgetOptions;
3
+ export declare function generateDropdownWidget(dropdownWidgetProperties?: Partial<Omit<DropdownWidget, "type">>): DropdownWidget;
@@ -0,0 +1,3 @@
1
+ import type { ExplanationWidget, PerseusExplanationWidgetOptions } from "../../data-schema";
2
+ export declare function generateExplanationOptions(options?: Partial<PerseusExplanationWidgetOptions>): PerseusExplanationWidgetOptions;
3
+ export declare function generateExplanationWidget(explanationWidgetProperties?: Partial<Omit<ExplanationWidget, "type">>): ExplanationWidget;
@@ -0,0 +1,4 @@
1
+ import type { PerseusExpressionWidgetOptions, ExpressionWidget, PerseusExpressionAnswerForm } from "../../data-schema";
2
+ export declare function generateExpressionOptions(options?: Partial<PerseusExpressionWidgetOptions>): PerseusExpressionWidgetOptions;
3
+ export declare function generateExpressionAnswerForm(answerFormOptions?: Partial<PerseusExpressionAnswerForm>): PerseusExpressionAnswerForm;
4
+ export declare function generateExpressionWidget(expressionWidgetProperties?: Partial<Omit<ExpressionWidget, "type">>): ExpressionWidget;
@@ -0,0 +1,2 @@
1
+ import type { GradedGroupSetWidget } from "../../data-schema";
2
+ export declare function generateGradedGroupSetWidget(gradedGroupSetWidgetProperties?: Partial<Omit<GradedGroupSetWidget, "type">>): GradedGroupSetWidget;
@@ -0,0 +1,3 @@
1
+ import type { GradedGroupWidget, PerseusGradedGroupWidgetOptions } from "../../data-schema";
2
+ export declare function generateGradedGroupOptions(options?: Partial<PerseusGradedGroupWidgetOptions>): PerseusGradedGroupWidgetOptions;
3
+ export declare function generateGradedGroupWidget(gradedGroupWidgetProperties?: Partial<Omit<GradedGroupWidget, "type">>): GradedGroupWidget;
@@ -0,0 +1,3 @@
1
+ import type { GroupWidget, PerseusGroupWidgetOptions } from "../../data-schema";
2
+ export declare function generateGroupOptions(options?: Partial<PerseusGroupWidgetOptions>): PerseusGroupWidgetOptions;
3
+ export declare function generateGroupWidget(groupWidgetProperties?: Partial<Omit<GroupWidget, "type">>): GroupWidget;
@@ -0,0 +1,21 @@
1
+ import type { InteractiveGraphWidget, LockedEllipseType, LockedFunctionType, LockedLabelType, LockedLineType, LockedPointType, LockedPolygonType, LockedVectorType, PerseusGraphTypeAngle, PerseusGraphTypeCircle, PerseusGraphTypeLinear, PerseusGraphTypeLinearSystem, PerseusGraphTypeNone, PerseusGraphTypePoint, PerseusGraphTypePolygon, PerseusGraphTypeQuadratic, PerseusGraphTypeRay, PerseusGraphTypeSegment, PerseusGraphTypeSinusoid, PerseusInteractiveGraphWidgetOptions } from "../../data-schema";
2
+ export declare function generateInteractiveGraphWidget(interactiveGraphWidgetProperties?: Partial<Omit<InteractiveGraphWidget, "type">>): InteractiveGraphWidget;
3
+ export declare function generateInteractiveGraphOptions(options?: Partial<PerseusInteractiveGraphWidgetOptions>): PerseusInteractiveGraphWidgetOptions;
4
+ export declare function generateIGAngleGraph(options?: Partial<PerseusGraphTypeAngle>): PerseusGraphTypeAngle;
5
+ export declare function generateIGCircleGraph(options?: Partial<PerseusGraphTypeCircle>): PerseusGraphTypeCircle;
6
+ export declare function generateIGLinearGraph(options?: Partial<PerseusGraphTypeLinear>): PerseusGraphTypeLinear;
7
+ export declare function generateIGLinearSystemGraph(options?: Partial<PerseusGraphTypeLinearSystem>): PerseusGraphTypeLinearSystem;
8
+ export declare function generateIGNoneGraph(): PerseusGraphTypeNone;
9
+ export declare function generateIGPointGraph(options?: Partial<Omit<PerseusGraphTypePoint, "type">>): PerseusGraphTypePoint;
10
+ export declare function generateIGPolygonGraph(options?: Partial<Omit<PerseusGraphTypePolygon, "type">>): PerseusGraphTypePolygon;
11
+ export declare function generateIGQuadraticGraph(options?: Partial<Omit<PerseusGraphTypeQuadratic, "type">>): PerseusGraphTypeQuadratic;
12
+ export declare function generateIGRayGraph(options?: Partial<Omit<PerseusGraphTypeRay, "type">>): PerseusGraphTypeRay;
13
+ export declare function generateIGSegmentGraph(options?: Partial<Omit<PerseusGraphTypeSegment, "type">>): PerseusGraphTypeSegment;
14
+ export declare function generateIGSinusoidGraph(options?: Partial<Omit<PerseusGraphTypeSinusoid, "type">>): PerseusGraphTypeSinusoid;
15
+ export declare function generateIGLockedPoint(options?: Partial<Omit<LockedPointType, "type">>): LockedPointType;
16
+ export declare function generateIGLockedLine(options?: Partial<Omit<LockedLineType, "type">>): LockedLineType;
17
+ export declare function generateIGLockedVector(options?: Partial<Omit<LockedVectorType, "type">>): LockedVectorType;
18
+ export declare function generateIGLockedEllipse(options?: Partial<Omit<LockedEllipseType, "type">>): LockedEllipseType;
19
+ export declare function generateIGLockedPolygon(options?: Partial<Omit<LockedPolygonType, "type">>): LockedPolygonType;
20
+ export declare function generateIGLockedFunction(options?: Partial<Omit<LockedFunctionType, "type">>): LockedFunctionType;
21
+ export declare function generateIGLockedLabel(options?: Partial<Omit<LockedLabelType, "type">>): LockedLabelType;
@@ -0,0 +1,3 @@
1
+ import type { PerseusLabelImageWidgetOptions, LabelImageWidget } from "../../data-schema";
2
+ export declare function generateLabelImageOptions(options?: Partial<PerseusLabelImageWidgetOptions>): PerseusLabelImageWidgetOptions;
3
+ export declare function generateLabelImageWidget(labelImageWidgetProperties?: Partial<Omit<LabelImageWidget, "type">>): LabelImageWidget;
@@ -0,0 +1,4 @@
1
+ import type { PerseusNumericInputWidgetOptions, NumericInputWidget, PerseusNumericInputAnswer } from "../../data-schema";
2
+ export declare function generateNumericInputOptions(options?: Partial<PerseusNumericInputWidgetOptions>): PerseusNumericInputWidgetOptions;
3
+ export declare function generateNumericInputAnswer(answerOptions?: Partial<PerseusNumericInputAnswer>): PerseusNumericInputAnswer;
4
+ export declare function generateNumericInputWidget(numericInputWidgetProperties?: Partial<Omit<NumericInputWidget, "type">>): NumericInputWidget;
@@ -0,0 +1,16 @@
1
+ import type { PerseusItem, PerseusRadioChoice, PerseusRadioWidgetOptions, RadioWidget } from "../../data-schema";
2
+ export declare function generateRadioOptions(options?: Partial<PerseusRadioWidgetOptions>): PerseusRadioWidgetOptions;
3
+ export declare function generateRadioWidget(radioWidgetProperties?: Partial<Omit<RadioWidget, "type">>): RadioWidget;
4
+ export declare function generateRadioChoice(text: string, options?: Partial<PerseusRadioChoice>): PerseusRadioChoice;
5
+ /**
6
+ * A simple question (PerseusRenderer) with a single radio widget,
7
+ * in which the `content` is only "[[☃ radio 1]]" and the widget has
8
+ * no properties other than the options.
9
+ */
10
+ export declare function generateSimpleRadioQuestion(options?: Partial<PerseusRadioWidgetOptions>): import("../..").PerseusRenderer;
11
+ /**
12
+ * A simple item (PerseusItem) with a single radio widget,
13
+ * in which the `content` is only "[[☃ radio 1]]" and the widget has
14
+ * no properties other than the options.
15
+ */
16
+ export declare function generateSimpleRadioItem(options?: Partial<PerseusRadioWidgetOptions>): PerseusItem;
@@ -0,0 +1,9 @@
1
+ import { type LockedEllipseType, type LockedFigure, type LockedFigureType, type LockedFunctionType, type LockedLabelType, type LockedLineType, type LockedPointType, type LockedPolygonType, type LockedVectorType } from "../data-schema";
2
+ export declare function getDefaultFigureForType(type: "point"): LockedPointType;
3
+ export declare function getDefaultFigureForType(type: "line"): LockedLineType;
4
+ export declare function getDefaultFigureForType(type: "vector"): LockedVectorType;
5
+ export declare function getDefaultFigureForType(type: "ellipse"): LockedEllipseType;
6
+ export declare function getDefaultFigureForType(type: "polygon"): LockedPolygonType;
7
+ export declare function getDefaultFigureForType(type: "function"): LockedFunctionType;
8
+ export declare function getDefaultFigureForType(type: "label"): LockedLabelType;
9
+ export declare function getDefaultFigureForType(type: LockedFigureType): LockedFigure;
@@ -28,7 +28,7 @@
28
28
  * } & Perseus<Widget>ValidationData;
29
29
  * ```
30
30
  */
31
- import type { GrapherAnswerTypes, PerseusDropdownChoice, PerseusExpressionAnswerForm, PerseusGradedGroupSetWidgetOptions, PerseusGradedGroupWidgetOptions, PerseusGraphType, PerseusGroupWidgetOptions, PerseusMatrixWidgetAnswers, PerseusNumericInputAnswer, PerseusOrdererWidgetOptions, PerseusRadioChoice, PerseusGraphCorrectType, MakeWidgetMap, PerseusFreeResponseWidgetScoringCriterion } from "./data-schema";
31
+ import type { GrapherAnswerTypes, PerseusDropdownChoice, PerseusExpressionAnswerForm, PerseusGradedGroupSetWidgetOptions, PerseusGradedGroupWidgetOptions, PerseusGraphType, PerseusGroupWidgetOptions, PerseusMatrixWidgetAnswers, PerseusNumericInputAnswer, PerseusOrdererWidgetOptions, PerseusRadioChoice, PerseusGraphCorrectType, MakeWidgetMap, PerseusFreeResponseWidgetScoringCriterion, PerseusRenderer } from "./data-schema";
32
32
  import type { ErrorCode } from "./error-codes";
33
33
  import type { Relationship } from "./types";
34
34
  export type WidgetValidatorFunction = (userInput: UserInput | undefined, validationData: ValidationData, locale: string) => ValidationResult;
@@ -72,9 +72,7 @@ export type PerseusExpressionRubric = {
72
72
  };
73
73
  export type PerseusExpressionUserInput = string;
74
74
  export type PerseusGroupRubric = PerseusGroupWidgetOptions;
75
- export type PerseusGroupValidationData = {
76
- widgets: ValidationDataMap;
77
- };
75
+ export type PerseusGroupValidationData = PerseusRenderer;
78
76
  export type PerseusGroupUserInput = UserInputMap;
79
77
  export type PerseusGradedGroupRubric = PerseusGradedGroupWidgetOptions;
80
78
  export type PerseusGradedGroupSetRubric = PerseusGradedGroupSetWidgetOptions;
@@ -267,24 +265,6 @@ export interface ValidationDataTypes {
267
265
  group: PerseusGroupValidationData;
268
266
  plotter: PerseusPlotterValidationData;
269
267
  }
270
- /**
271
- * A map of validation data, keyed by `widgetId`. This data is used to check if
272
- * a question is answerable. This data represents the minimal intersection of
273
- * data that's available in the client (widget options) and server (scoring
274
- * data) and is represented by a group of types known as "validation data".
275
- *
276
- * NOTE: The value in this map is intentionally a subset of WidgetOptions<T>.
277
- * By using the same shape (minus any unneeded data), we are able to pass a
278
- * `PerseusWidgetsMap` or ` into any function that accepts a
279
- * `ValidationDataMap` without any mutation of data.
280
- */
281
- export type ValidationDataMap = {
282
- [Property in keyof ValidationDataTypes as `${Property} ${number}`]: {
283
- type: Property;
284
- static?: boolean;
285
- options: ValidationDataTypes[Property];
286
- };
287
- };
288
268
  /**
289
269
  * A union type of all the different widget validation data types that exist.
290
270
  */
@@ -1,5 +1,5 @@
1
1
  import type { PerseusInteractiveGraphWidgetOptions } from "../../data-schema";
2
2
  import type { WidgetLogic } from "../logic-export.types";
3
- export type InteractiveGraphDefaultWidgetOptions = Pick<PerseusInteractiveGraphWidgetOptions, "labels" | "labelLocation" | "range" | "step" | "backgroundImage" | "markings" | "showTooltips" | "showProtractor" | "graph" | "correct">;
3
+ export type InteractiveGraphDefaultWidgetOptions = Pick<PerseusInteractiveGraphWidgetOptions, "labels" | "labelLocation" | "lockedFigures" | "range" | "step" | "backgroundImage" | "markings" | "showAxisArrows" | "showTooltips" | "showProtractor" | "graph" | "correct">;
4
4
  declare const interactiveGraphWidgetLogic: WidgetLogic;
5
5
  export default interactiveGraphWidgetLogic;
@@ -1,4 +1,4 @@
1
- import type { PerseusLabelImageMarker, PerseusLabelImageWidgetOptions } from "../../data-schema";
1
+ import type { PerseusLabelImageMarker, PerseusLabelImageWidgetOptions, PerseusWidgetOptions } from "../../data-schema";
2
2
  /**
3
3
  * For details on the individual options, see the
4
4
  * PerseusLabelImageWidgetOptions type
@@ -16,3 +16,4 @@ export type LabelImagePublicWidgetOptions = {
16
16
  };
17
17
  export type LabelImageMarkerPublicData = Pick<PerseusLabelImageMarker, "x" | "y" | "label">;
18
18
  export default function getLabelImagePublicWidgetOptions(options: PerseusLabelImageWidgetOptions): LabelImagePublicWidgetOptions;
19
+ export declare function isLabelImageAccessible(options: PerseusWidgetOptions): boolean;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Shared Perseus infrastructure",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "0.0.0-PR3084-20251204231904",
6
+ "version": "0.0.0-PR3084-20251218010953",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -1 +0,0 @@
1
- export {};