From e187c6b67cb4d83e42907527acfe6562346e92d8 Mon Sep 17 00:00:00 2001 From: Ben Christel Date: Tue, 18 Feb 2025 11:33:56 -0800 Subject: [PATCH] Deprecate `metadata` in renderer, hint, and Group widget data schemas (#2242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We aren't using `metadata`. As near as I can tell, [it was added in 2014][1] so content creators could add "tags" to content, but I don't know why it was added or if it was ever used. We are seeing Perseus JSON parser errors in webapp because `metadata` is null in some exercises. This PR fixes the errors by changing the type of `metadata` to `any`, marking it deprecated, and removing references to it. [1]: https://phabricator.khanacademy.org/D13929 Issue: none ## Test plan: - Install the build of Perseus from this PR - Visit https://www.khanacademy.dev/internal-courses/test-everything/test-everything-1/te-group/a/group-article - You should be able to view and edit the article without errors. Author: benchristel Reviewers: handeyeco, benchristel, jeremywiebe Required Reviewers: Approved By: handeyeco Checks: ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Check builds for changes in size (ubuntu-latest, 20.x), ✅ Lint, Typecheck, Format, and Test (ubuntu-latest, 20.x), ✅ Cypress (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ⏹️ [cancelled] Publish npm snapshot (ubuntu-latest, 20.x), ⏹️ [cancelled] Lint, Typecheck, Format, and Test (ubuntu-latest, 20.x), ⏹️ [cancelled] Cypress (ubuntu-latest, 20.x), ⏹️ [cancelled] Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ⏹️ [cancelled] Check builds for changes in size (ubuntu-latest, 20.x), ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ⏹️ [cancelled] Check builds for changes in size (ubuntu-latest, 20.x), ✅ Cypress (ubuntu-latest, 20.x), ✅ Publish Storybook to Chromatic (ubuntu-latest, 20.x), ⏹️ [cancelled] Lint, Typecheck, Format, and Test (ubuntu-latest, 20.x) Pull Request URL: https://github.com/Khan/perseus/pull/2242 --- .changeset/tall-llamas-crash.md | 7 +++++++ packages/perseus-core/src/data-schema.ts | 12 +++++++---- .../parse-perseus-json.test.ts | 5 ++--- .../perseus-parsers/hint.ts | 5 +++-- .../perseus-parsers/perseus-renderer.ts | 5 +++-- .../perseus-parsers/widgets-map.test.ts | 1 - .../perseus-core/src/widgets/group/index.ts | 5 +---- .../src/__tests__/traversal.test.ts | 1 - .../src/widgets/group-editor.tsx | 21 +------------------ packages/perseus/src/types.ts | 4 +++- 10 files changed, 28 insertions(+), 38 deletions(-) create mode 100644 .changeset/tall-llamas-crash.md diff --git a/.changeset/tall-llamas-crash.md b/.changeset/tall-llamas-crash.md new file mode 100644 index 0000000000..3b640d94bb --- /dev/null +++ b/.changeset/tall-llamas-crash.md @@ -0,0 +1,7 @@ +--- +"@khanacademy/perseus": minor +"@khanacademy/perseus-core": minor +"@khanacademy/perseus-editor": minor +--- + +Deprecate the `metadata` field in renderer, hint, and Group widget data schemas. diff --git a/packages/perseus-core/src/data-schema.ts b/packages/perseus-core/src/data-schema.ts index a95865f6a9..6aef4a74ae 100644 --- a/packages/perseus-core/src/data-schema.ts +++ b/packages/perseus-core/src/data-schema.ts @@ -244,10 +244,14 @@ export type PerseusRenderer = { * field. */ widgets: PerseusWidgetsMap; - // Used in the PerseusGradedGroup widget. A list of "tags" that are keys - // that represent other content in the system. Not rendered to the user. - // NOTE: perseus_data.go says this is required even though it isn't necessary. - metadata?: ReadonlyArray; + /** + * Formerly used in the PerseusGradedGroup widget. A list of "tags" that + * are keys that represent other content in the system. Not rendered to + * the user. NOTE: perseus_data.go says this is required even though it + * isn't necessary. + * @deprecated + */ + metadata?: any; /** * A dictionary of {[imageUrl]: PerseusImageDetail}. */ diff --git a/packages/perseus-core/src/parse-perseus-json/parse-perseus-json.test.ts b/packages/perseus-core/src/parse-perseus-json/parse-perseus-json.test.ts index b864d544c3..8a0a4bf5c4 100644 --- a/packages/perseus-core/src/parse-perseus-json/parse-perseus-json.test.ts +++ b/packages/perseus-core/src/parse-perseus-json/parse-perseus-json.test.ts @@ -69,7 +69,6 @@ describe("parseAndMigratePerseusArticle", () => { content: "", widgets: {}, images: {}, - metadata: undefined, }), ); }); @@ -80,8 +79,8 @@ describe("parseAndMigratePerseusArticle", () => { ); expect(result).toEqual( success([ - {content: "one", widgets: {}, images: {}, metadata: undefined}, - {content: "two", widgets: {}, images: {}, metadata: undefined}, + {content: "one", widgets: {}, images: {}}, + {content: "two", widgets: {}, images: {}}, ]), ); }); diff --git a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/hint.ts b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/hint.ts index 822e788411..1b0b54edd3 100644 --- a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/hint.ts +++ b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/hint.ts @@ -1,5 +1,5 @@ import { - array, + any, boolean, object, optional, @@ -17,6 +17,7 @@ export const parseHint: Parser = object({ replace: optional(boolean), content: string, widgets: defaulted(parseWidgetsMap, () => ({})), - metadata: optional(array(string)), images: parseImages, + // deprecated + metadata: any, }); diff --git a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/perseus-renderer.ts b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/perseus-renderer.ts index fbf3c7ab59..3c207c4640 100644 --- a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/perseus-renderer.ts +++ b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/perseus-renderer.ts @@ -1,4 +1,4 @@ -import {array, object, optional, string} from "../general-purpose-parsers"; +import {any, object, string} from "../general-purpose-parsers"; import {defaulted} from "../general-purpose-parsers/defaulted"; import {parseImages} from "./images-map"; @@ -20,8 +20,9 @@ export const parsePerseusRenderer: Parser = defaulted( (rawVal, ctx) => parseWidgetsMap(rawVal, ctx), () => ({}), ), - metadata: optional(array(string)), images: parseImages, + // deprecated + metadata: any, }), // Default value () => ({ diff --git a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/widgets-map.test.ts b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/widgets-map.test.ts index a4dc519cba..7bcea6b4b0 100644 --- a/packages/perseus-core/src/parse-perseus-json/perseus-parsers/widgets-map.test.ts +++ b/packages/perseus-core/src/parse-perseus-json/perseus-parsers/widgets-map.test.ts @@ -272,7 +272,6 @@ describe("parseWidgetsMap", () => { options: { content: "", widgets: {}, - metadata: [], images: {}, }, }, diff --git a/packages/perseus-core/src/widgets/group/index.ts b/packages/perseus-core/src/widgets/group/index.ts index 12ce86763f..16528f6e22 100644 --- a/packages/perseus-core/src/widgets/group/index.ts +++ b/packages/perseus-core/src/widgets/group/index.ts @@ -3,16 +3,13 @@ import type {WidgetLogic} from "../logic-export.types"; export type GroupDefaultWidgetOptions = Pick< PerseusGroupWidgetOptions, - "content" | "widgets" | "images" | "metadata" + "content" | "widgets" | "images" >; const defaultWidgetOptions: GroupDefaultWidgetOptions = { content: "", widgets: {}, images: {}, - // `undefined` instead of `null` so that getDefaultProps works for - // `the GroupMetadataEditor` - metadata: undefined, }; const groupWidgetLogic: WidgetLogic = { diff --git a/packages/perseus-editor/src/__tests__/traversal.test.ts b/packages/perseus-editor/src/__tests__/traversal.test.ts index 5b72253530..9743d59c75 100644 --- a/packages/perseus-editor/src/__tests__/traversal.test.ts +++ b/packages/perseus-editor/src/__tests__/traversal.test.ts @@ -220,7 +220,6 @@ const sampleGroupUpgraded = { alignment: "default", }, }, - metadata: undefined, }, version: { major: 0, diff --git a/packages/perseus-editor/src/widgets/group-editor.tsx b/packages/perseus-editor/src/widgets/group-editor.tsx index 5a6074157b..cdcae3f963 100644 --- a/packages/perseus-editor/src/widgets/group-editor.tsx +++ b/packages/perseus-editor/src/widgets/group-editor.tsx @@ -19,7 +19,6 @@ class GroupEditor extends React.Component { content: PropTypes.string, widgets: PropTypes.object, images: PropTypes.object, - metadata: PropTypes.any, apiOptions: ApiOptions.propTypes, }; @@ -30,17 +29,6 @@ class GroupEditor extends React.Component { editor = React.createRef(); - _renderMetadataEditor: () => React.ReactElement = () => { - const GroupMetadataEditor = this.props.apiOptions.GroupMetadataEditor; - return ( - - ); - }; - change: (arg1: any, arg2: any, arg3: any) => any = (...args) => { return Changeable.change.apply(this, args); }; @@ -50,19 +38,12 @@ class GroupEditor extends React.Component { }; serialize: () => any = () => { - return _.extend({}, this.editor.current?.serialize(), { - metadata: this.props.metadata, - }); + return _.extend({}, this.editor.current?.serialize()); }; render(): React.ReactNode { return (
-
- {/* the metadata editor; used for tags on - khanacademy.org */} - {this._renderMetadataEditor()} -
unknown; + /** + * @deprecated - metadata is no longer used by the Group widget + */ GroupMetadataEditor?: React.ComponentType; showAlignmentOptions?: boolean; /** @@ -425,7 +428,6 @@ export interface PerseusDependenciesV2 { */ export type APIOptionsWithDefaults = Readonly< APIOptions & { - GroupMetadataEditor: NonNullable; baseElements: NonNullable; canScrollPage: NonNullable; crossOutEnabled: NonNullable;