diff --git a/.changeset/witty-suns-mate.md b/.changeset/witty-suns-mate.md new file mode 100644 index 0000000000..c2440edd67 --- /dev/null +++ b/.changeset/witty-suns-mate.md @@ -0,0 +1,6 @@ +--- +"@khanacademy/perseus": minor +"@khanacademy/perseus-core": minor +--- + +Make `values` field optional on the `PerseusCategorizerWidgetOptions` type. This will allow us to remove `values` (which represents the correct answer) from the data sent to the client. diff --git a/packages/perseus-core/src/data-schema.ts b/packages/perseus-core/src/data-schema.ts index 32d5d3a03b..5bf5ac6c81 100644 --- a/packages/perseus-core/src/data-schema.ts +++ b/packages/perseus-core/src/data-schema.ts @@ -423,7 +423,7 @@ export type PerseusCategorizerWidgetOptions = { // Whether this widget is displayed with the results and immutable static: boolean; // The correct answers where index relates to the items and value relates to the category. e.g. [0, 1, 0, 1, 2] - values: ReadonlyArray; + values?: ReadonlyArray; // Whether we should highlight i18n linter errors found on this widget highlightLint?: boolean; // Internal editor configuration. Can be ignored by consumers. diff --git a/packages/perseus/src/util/extract-perseus-data.ts b/packages/perseus/src/util/extract-perseus-data.ts index 829bbf3032..43d4156259 100644 --- a/packages/perseus/src/util/extract-perseus-data.ts +++ b/packages/perseus/src/util/extract-perseus-data.ts @@ -59,9 +59,9 @@ function getAnswersFromWidgets( categorizer.options?.items && categorizer.options?.values ) { - const categories = categorizer.options?.categories; - const items = categorizer.options?.items; - const values = categorizer.options?.values; + const categories = categorizer.options.categories; + const items = categorizer.options.items; + const values = categorizer.options.values; answers.push( ...values.map( (value, index) => diff --git a/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.test.ts b/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.test.ts new file mode 100644 index 0000000000..9f04bd1116 --- /dev/null +++ b/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.test.ts @@ -0,0 +1,32 @@ +import {parse} from "../parse"; +import {success} from "../result"; + +import {parseCategorizerWidget} from "./categorizer-widget"; + +import type {CategorizerWidget} from "@khanacademy/perseus-core"; + +describe("parseCategorizerWidget", () => { + const baseWidget: CategorizerWidget = { + type: "categorizer", + version: {major: 0, minor: 0}, + graded: true, + options: { + items: [], + categories: [], + randomizeItems: false, + static: false, + }, + }; + + it("allows `values` to be undefined", () => { + const widget = { + ...baseWidget, + options: { + ...baseWidget.options, + values: undefined, + }, + }; + const result = parse(widget, parseCategorizerWidget); + expect(result).toEqual(success(widget)); + }); +}); diff --git a/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.ts b/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.ts index f436848306..2a649b0e78 100644 --- a/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.ts +++ b/packages/perseus/src/util/parse-perseus-json/perseus-parsers/categorizer-widget.ts @@ -21,7 +21,7 @@ export const parseCategorizerWidget: Parser = parseWidget( categories: array(string), randomizeItems: defaulted(boolean, () => false), static: defaulted(boolean, () => false), - values: array(defaulted(number, () => 0)), + values: optional(array(defaulted(number, () => 0))), highlightLint: optional(boolean), linterContext: optional( object({ diff --git a/packages/perseus/src/widgets/categorizer/categorizer.tsx b/packages/perseus/src/widgets/categorizer/categorizer.tsx index ab4c47e366..fd77de05c5 100644 --- a/packages/perseus/src/widgets/categorizer/categorizer.tsx +++ b/packages/perseus/src/widgets/categorizer/categorizer.tsx @@ -28,13 +28,13 @@ import type {CategorizerPromptJSON} from "../../widget-ai-utils/categorizer/cate import type {PerseusCategorizerWidgetOptions} from "@khanacademy/perseus-core"; type Props = WidgetProps & { - values: ReadonlyArray; + values: ReadonlyArray; }; type DefaultProps = { items: Props["items"]; categories: Props["categories"]; - values: Props["values"]; + values: ReadonlyArray; linterContext: Props["linterContext"]; }; @@ -79,7 +79,6 @@ export class Categorizer onChange(itemNum, catNum) { const values = [...this.props.values]; - // @ts-expect-error - TS2322 - Type 'number' is not assignable to type 'never'. values[itemNum] = catNum; this.change("values", values); this.props.trackInteraction();