Skip to content

Commit

Permalink
Type fixes so the mock-widget isn't part of our production widget typ…
Browse files Browse the repository at this point in the history
…e unions and maps
  • Loading branch information
jeremywiebe committed Jan 16, 2025
1 parent 0f7d4e6 commit c099e9e
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 59 deletions.
38 changes: 2 additions & 36 deletions packages/perseus-core/src/data-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export type MakeWidgetMap<TRegistry> = {
* `PerseusWidgets` with the one defined below.
*
* ```typescript
* declare module "@khanacademy/perseus" {
* declare module "@khanacademy/perseus-core" {
* interface PerseusWidgetTypes {
* // A new widget
* "new-awesomeness": MyAwesomeNewWidget;
Expand Down Expand Up @@ -377,41 +377,7 @@ export type VideoWidget = WidgetOptions<'video', PerseusVideoWidgetOptions>;
//prettier-ignore
export type DeprecatedStandinWidget = WidgetOptions<'deprecated-standin', object>;

export type PerseusWidget =
| CategorizerWidget
| CSProgramWidget
| DefinitionWidget
| DropdownWidget
| ExplanationWidget
| ExpressionWidget
| GradedGroupSetWidget
| GradedGroupWidget
| GrapherWidget
| GroupWidget
| IFrameWidget
| ImageWidget
| InputNumberWidget
| InteractionWidget
| InteractiveGraphWidget
| LabelImageWidget
| MatcherWidget
| MatrixWidget
| MeasurerWidget
| MoleculeRendererWidget
| NumberLineWidget
| NumericInputWidget
| OrdererWidget
| PassageRefWidget
| PassageWidget
| PhetSimulationWidget
| PlotterWidget
| PythonProgramWidget
| RadioWidget
| RefTargetWidget
| SorterWidget
| TableWidget
| VideoWidget
| DeprecatedStandinWidget;
export type PerseusWidget = PerseusWidgetTypes[keyof PerseusWidgetTypes];

/**
* A background image applied to various widgets.
Expand Down
3 changes: 1 addition & 2 deletions packages/perseus/src/__testdata__/renderer.testdata.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import type {MockWidget} from "../widgets/mock-widgets/mock-widget-types";
import type {RenderProps} from "../widgets/radio";
import type {
DropdownWidget,
ExpressionWidget,
ImageWidget,
NumericInputWidget,
MockWidget,
PerseusRenderer,
} from "@khanacademy/perseus-core";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import {
type ExpressionWidget,
type RadioWidget,
type NumericInputWidget,
type MockWidget,
} from "@khanacademy/perseus-core";

import type {MockWidget} from "../widgets/mock-widgets/mock-widget-types";

export const itemWithNumericInput: PerseusItem = {
question: {
content:
Expand Down Expand Up @@ -40,7 +41,7 @@ export const itemWithNumericInput: PerseusItem = {
labelText: "What's the answer?",
size: "normal",
},
} as NumericInputWidget,
} satisfies NumericInputWidget,
},
},
hints: [
Expand All @@ -64,7 +65,7 @@ export const itemWithMockWidget: PerseusItem = {
options: {
value: "3",
},
} as MockWidget,
} satisfies MockWidget,
},
},
hints: [
Expand Down Expand Up @@ -158,14 +159,14 @@ export const itemWithTwoMockWidgets: PerseusItem = {
options: {
value: "3",
},
} as MockWidget,
} satisfies MockWidget,
"mock-widget 2": {
type: "mock-widget",
graded: true,
options: {
value: "3",
},
} as MockWidget,
} satisfies MockWidget,
},
},
hints: [
Expand Down
2 changes: 1 addition & 1 deletion packages/perseus/src/__tests__/renderer-api.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import mockWidget1Item from "./test-items/mock-widget-1-item";
import mockWidget2Item from "./test-items/mock-widget-2-item";
import tableItem from "./test-items/table-item";

import type {PerseusMockWidgetUserInput} from "../widgets/mock-widgets/mock-widget";
import type {PerseusMockWidgetUserInput} from "../widgets/mock-widgets/mock-widget-types";
import type {UserEvent} from "@testing-library/user-event";

const itemWidget = mockWidget1Item;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import {registerWidget} from "../../widgets";
import {renderQuestion} from "../../widgets/__testutils__/renderQuestion";
import MockWidgetExport from "../../widgets/mock-widgets/mock-widget";

import type {PerseusRenderer, MockWidget} from "@khanacademy/perseus-core";
import type {MockWidget} from "../../widgets/mock-widgets/mock-widget-types";
import type {PerseusRenderer} from "@khanacademy/perseus-core";
import type {UserEvent} from "@testing-library/user-event";

const question: PerseusRenderer = {
Expand All @@ -25,7 +26,7 @@ const question: PerseusRenderer = {
value: "42",
},
alignment: "default",
} as MockWidget,
} satisfies MockWidget,
},
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {getPromptJSON} from "./prompt-utils";

import type {PerseusMockWidgetUserInput} from "../../widgets/mock-widgets/mock-widget";
import type {PerseusMockWidgetUserInput} from "../../widgets/mock-widgets/mock-widget-types";

describe("InputNumber getPromptJSON", () => {
it("it returns JSON with the expected format and fields", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {PerseusMockWidgetUserInput} from "../../widgets/mock-widgets/mock-widget";
import type mockWidget from "../../widgets/mock-widgets/mock-widget";
import type {PerseusMockWidgetUserInput} from "../../widgets/mock-widgets/mock-widget-types";
import type React from "react";

export type MockWidgetPromptJSON = {
Expand Down
12 changes: 7 additions & 5 deletions packages/perseus/src/widgets/mock-widgets/mock-widget-types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import type {WidgetOptions} from "@khanacademy/perseus-core";

// Extend the widget registries for testing
export interface PerseusWidgetTypes {
"mock-widget": MockWidget;
}

export type MockWidget = WidgetOptions<"mock-widget", MockWidgetOptions>;

export type MockWidgetOptions = {
Expand All @@ -19,3 +14,10 @@ export type PerseusMockWidgetRubric = {
export type PerseusMockWidgetUserInput = {
currentValue: string;
};

// Extend the widget registries for testing
declare module "@khanacademy/perseus-core" {
export interface PerseusWidgetTypes {
"mock-widget": MockWidget;
}
}
11 changes: 6 additions & 5 deletions packages/perseus/src/widgets/mock-widgets/score-mock-widget.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import validateMockWidget from "./validate-mock-widget";

import type {
PerseusMockWidgetUserInput,
PerseusMockWidgetRubric,
Expand All @@ -10,12 +12,11 @@ function scoreMockWidget(
rubric: PerseusMockWidgetRubric,
strings: PerseusStrings,
): PerseusScore {
if (userInput.currentValue == null || userInput.currentValue === "") {
return {
type: "invalid",
message: "No value provided",
};
const validationResult = validateMockWidget(userInput);
if (validationResult != null) {
return validationResult;
}

return {
type: "points",
earned: userInput.currentValue === rubric.value ? 1 : 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function validateMockWidget(
if (userInput.currentValue == null || userInput.currentValue === "") {
return {
type: "invalid",
message: "No value provided",
message: "",
};
}

Expand Down

0 comments on commit c099e9e

Please sign in to comment.