Skip to content

Resolve some TODO comments in the Perseus JSON parsing code #2380

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 22, 2025

Conversation

benchristel
Copy link
Member

Issue: none

Test plan:

pnpm test

Copy link
Contributor

github-actions bot commented Apr 10, 2025

Size Change: -89 B (-0.02%)

Total Size: 466 kB

Filename Size Change
packages/perseus-core/dist/es/index.js 18.5 kB -6 B (-0.03%)
packages/perseus-editor/dist/es/index.js 88.4 kB -67 B (-0.08%)
packages/perseus/dist/es/index.js 199 kB -16 B (-0.01%)
ℹ️ View Unchanged
Filename Size
packages/kas/dist/es/index.js 20.7 kB
packages/keypad-context/dist/es/index.js 1 kB
packages/kmath/dist/es/index.js 5.98 kB
packages/math-input/dist/es/index.js 98.6 kB
packages/math-input/dist/es/strings.js 1.61 kB
packages/perseus-linter/dist/es/index.js 7.05 kB
packages/perseus-score/dist/es/index.js 9.04 kB
packages/perseus-utils/dist/es/index.js 403 B
packages/perseus/dist/es/strings.js 7.49 kB
packages/pure-markdown/dist/es/index.js 1.22 kB
packages/simple-markdown/dist/es/index.js 6.71 kB

compressed-size-action

Copy link
Contributor

github-actions bot commented Apr 10, 2025

npm Snapshot: Published

Good news!! We've packaged up the latest commit from this PR (5482421) and published it to npm. You
can install it using the tag PR2380.

Example:

pnpm add @khanacademy/perseus@PR2380

If you are working in Khan Academy's webapp, you can run:

./dev/tools/bump_perseus_version.js -t PR2380

Copy link
Collaborator

@jeremywiebe jeremywiebe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really happy to see how the parsers are letting us improve things. Thanks for that!

I noticed a few linter violations at the bottom of the file listing. Not sure if they're valid...

image

@@ -32,7 +32,5 @@ export const parseMeasurerWidget: Parser<MeasurerWidget> = parseWidget(
rulerPixels: number,
rulerLength: number,
box: pair(number, number),
// TODO(benchristel): static is not used. Remove it?
static: defaulted(boolean, () => false),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! My guess is that this snuck into the object data at some point by accident.

@@ -163,7 +163,7 @@ type RenderProps = {
* Shapes (points, chords, etc) displayed on the graph that cannot be moved
* by the user.
*/
lockedFigures?: ReadonlyArray<LockedFigure>;
lockedFigures: ReadonlyArray<LockedFigure>;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love that these parsers are giving us the ability to make the production code safer/cleaner!

Copy link
Contributor

@handeyeco handeyeco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool!

@@ -1192,9 +1192,6 @@ export type PerseusMeasurerWidgetOptions = {
rulerLength: number;
// Containing area [width, height]
box: [number, number];
// TODO(benchristel): static is not used. Remove it?
// Always false. Not used for this widget
static: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, static is so annoying

Copy link
Contributor

@Myranae Myranae left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wanted to remind you to add back coords in interactive graph and to point out some checks need to be fixed. Also, since data-schema changed, we might need to inform CP, iirc? Just one NB question, but looks good otherwise :)

Comment on lines -337 to +331
{props.lockedFigures && (
<GraphLockedLabelsLayer
lockedFigures={props.lockedFigures}
/>
)}
<GraphLockedLabelsLayer
lockedFigures={props.lockedFigures}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So before when lockedFigures was optional, if it was falsy in some way, then this GraphLockedLabelsLayer element wouldn't be included. Now it's always included. Could that cause any side effects with interaction or the UI?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this would render in the DOM if lockedFigures length is 0, because the outermost layer in packages/perseus/src/widgets/interactive-graphs/graph-locked-labels-layer.tsx is a React fragment. It only renders the actual labels themselves if there are any.

So I think this is fine.

@benchristel benchristel changed the base branch from benc/radio-parser-types to main April 14, 2025 22:16
Copy link
Contributor

@nishasy nishasy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! Looks good to me.

I added one question for my own understanding, but I don't anticipate it being a problem.

Comment on lines -337 to +331
{props.lockedFigures && (
<GraphLockedLabelsLayer
lockedFigures={props.lockedFigures}
/>
)}
<GraphLockedLabelsLayer
lockedFigures={props.lockedFigures}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this would render in the DOM if lockedFigures length is 0, because the outermost layer in packages/perseus/src/widgets/interactive-graphs/graph-locked-labels-layer.tsx is a React fragment. It only renders the actual labels themselves if there are any.

So I think this is fine.

@@ -782,7 +782,7 @@ export type PerseusInteractiveGraphWidgetOptions = {
correct: PerseusGraphType;
// Shapes (points, chords, etc) displayed on the graph that cannot
// be moved by the user.
lockedFigures?: ReadonlyArray<LockedFigure>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very exciting! The rest of the code for making lockedFigures required makes sense to me. Same for labels.

Only one question for my own understanding: Is there any possibility of this causing issues for old exercise items that saved this as null or undefined? Or would that be fixed by the parser?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That will be fixed up by the parser! It will default null and undefined to an empty array.

@benchristel benchristel changed the base branch from main to benc/idempotent-defaulted April 17, 2025 22:26
@benchristel benchristel force-pushed the benc/idempotent-defaulted branch from bcb6197 to d36f830 Compare April 22, 2025 18:31
Base automatically changed from benc/idempotent-defaulted to main April 22, 2025 18:48
@benchristel benchristel merged commit 1f88cc1 into main Apr 22, 2025
8 checks passed
@benchristel benchristel deleted the benc/parser-todos branch April 22, 2025 19:09
benchristel pushed a commit that referenced this pull request May 8, 2025
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.


# Releases
## @khanacademy/[email protected]

### Major Changes

-   [#2402](#2402) [`558cc1cc6`](558cc1c) Thanks [@benchristel](https://github.com/benchristel)! - Add typetests to ensure that the data format accepted by
    `parseAndMigratePerseusItem` stays in sync with the types in `data-schema.ts`,
    exported from `@khanacademy/perseus-core`. Breaking change:
    `PerseusGraphTypeAngle.coords` can no longer be `null`; use `undefined` instead.


-   [#2436](#2436) [`79a84d31b`](79a84d3) Thanks [@benchristel](https://github.com/benchristel)! - Change the type of `PerseusNumberLineWidgetOptions.correctRel` to `"eq" | "lt" | "gt" | "le" | "ge"`, to better reflect our data and the semantics of this field.


-   [#2425](#2425) [`4282de2b2`](4282de2) Thanks [@benchristel](https://github.com/benchristel)! - Add `isInequality` to the `PerseusNumberLineWidgetOptions` type. The NumberLine component was using this field, but it wasn't represented in the types.


-   [#2417](#2417) [`4184314fe`](4184314) Thanks [@handeyeco](https://github.com/handeyeco)! - Enable Group to be rendered/answered with answerless item data


-   [#2380](#2380) [`1f88cc191`](1f88cc1) Thanks [@benchristel](https://github.com/benchristel)! - Removes `undefined` from the types of
    `PerseusInteractiveGraphWidgetOptions.lockedFigures` and
    the `labels` property of locked figures. Removes the `coords`
    property from interactive graph widget options types, for graphs that do not
    use it (all but the `point` graph type).

    This is a breaking change because assigning `undefined` to `lockedFigures` or
    `labels`, or setting `coord` in an object literal, will now give a type error.
    Callers should use an empty array instead of `undefined` for `lockedFigures` and
    `labels`. Avoid setting `coord` for graph types other than `point`.

### Minor Changes

-   [#2423](#2423) [`22e7de307`](22e7de3) Thanks [@Myranae](https://github.com/Myranae)! - Update Plotter widget to render with answerless data. Adds test and stories for answerless rendering.


-   [#2448](#2448) [`b7d3b9eaf`](b7d3b9e) Thanks [@tony-dinh](https://github.com/tony-dinh)! - Introduce `itemHasHints` & `itemHasRationales` methods to detect when a parsed PerseusItem contains widgets with hints or rationales, respectively.


-   [#2441](#2441) [`f1662239e`](f166223) Thanks [@Myranae](https://github.com/Myranae)! - Update Orderer widget to render with answerless data. Adds tests and stories for answerless rendering.


-   [#2387](#2387) [`aa7b1b621`](aa7b1b6) Thanks [@Myranae](https://github.com/Myranae)! - Update Matrix widget to render with answerless data. Adds tests and stories for answerless rendering.

### Patch Changes

-   [#2426](#2426) [`a2701f002`](a2701f0) Thanks [@handeyeco](https://github.com/handeyeco)! - Add tests/stories to prove InputNumber is interactive with answerless data


-   [#2446](#2446) [`ca4df1cf8`](ca4df1c) Thanks [@benchristel](https://github.com/benchristel)! - Internal: suppress immutable-data lint rule in a test


-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2459](#2459) [`c27162249`](c271622) Thanks [@benchristel](https://github.com/benchristel)! - Internal: use 'require' instead of 'import' in test script so it will work on more platforms


-   [#2434](#2434) [`28c395f8e`](28c395f) Thanks [@benchristel](https://github.com/benchristel)! - Internal: add tests verifying that NumberLine widgets work with answerless data


-   [#2403](#2403) [`bfa5ce68a`](bfa5ce6) Thanks [@benchristel](https://github.com/benchristel)! - Internal: add tests to ensure Perseus JSON parsers are idempotent


-   [#2439](#2439) [`1b773e2a0`](1b773e2) Thanks [@benchristel](https://github.com/benchristel)! - The Perseus JSON parser now accepts cross-realm objects.


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`e7807485e`](e780748), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Minor Changes

-   [#2423](#2423) [`22e7de307`](22e7de3) Thanks [@Myranae](https://github.com/Myranae)! - Update Plotter widget to render with answerless data. Adds test and stories for answerless rendering.


-   [#2449](#2449) [`2243316be`](2243316) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Add option to ButtonGroup component to allow selected button to be styled


-   [#2441](#2441) [`f1662239e`](f166223) Thanks [@Myranae](https://github.com/Myranae)! - Update Orderer widget to render with answerless data. Adds tests and stories for answerless rendering.


-   [#2387](#2387) [`aa7b1b621`](aa7b1b6) Thanks [@Myranae](https://github.com/Myranae)! - Update Matrix widget to render with answerless data. Adds tests and stories for answerless rendering.

### Patch Changes

-   [#2426](#2426) [`a2701f002`](a2701f0) Thanks [@handeyeco](https://github.com/handeyeco)! - Add tests/stories to prove InputNumber is interactive with answerless data


-   [#2447](#2447) [`39ca81d0f`](39ca81d) Thanks [@handeyeco](https://github.com/handeyeco)! - Clean up a ServerItemRenderer test to make it more focused


-   [#2436](#2436) [`79a84d31b`](79a84d3) Thanks [@benchristel](https://github.com/benchristel)! - Change the type of `PerseusNumberLineWidgetOptions.correctRel` to `"eq" | "lt" | "gt" | "le" | "ge"`, to better reflect our data and the semantics of this field.


-   [#2425](#2425) [`4282de2b2`](4282de2) Thanks [@benchristel](https://github.com/benchristel)! - Add `isInequality` to the `PerseusNumberLineWidgetOptions` type. The NumberLine component was using this field, but it wasn't represented in the types.


-   [#2452](#2452) [`4b25852db`](4b25852) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix types used for forwardref in `expression` widget


-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2417](#2417) [`4184314fe`](4184314) Thanks [@handeyeco](https://github.com/handeyeco)! - Enable Group to be rendered/answered with answerless item data


-   [#2380](#2380) [`1f88cc191`](1f88cc1) Thanks [@benchristel](https://github.com/benchristel)! - Removes `undefined` from the types of
    `PerseusInteractiveGraphWidgetOptions.lockedFigures` and
    the `labels` property of locked figures. Removes the `coords`
    property from interactive graph widget options types, for graphs that do not
    use it (all but the `point` graph type).

    This is a breaking change because assigning `undefined` to `lockedFigures` or
    `labels`, or setting `coord` in an object literal, will now give a type error.
    Callers should use an empty array instead of `undefined` for `lockedFigures` and
    `labels`. Avoid setting `coord` for graph types other than `point`.


-   [#2416](#2416) [`a90ebca08`](a90ebca) Thanks [@ivyolamit](https://github.com/ivyolamit)! - Update Radio Widget docs to include rationales in the test data


-   [#2434](#2434) [`28c395f8e`](28c395f) Thanks [@benchristel](https://github.com/benchristel)! - Internal: add tests verifying that NumberLine widgets work with answerless data


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Minor Changes

-   [#2449](#2449) [`2243316be`](2243316) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - UI updates to Expression editor

### Patch Changes

-   [#2402](#2402) [`558cc1cc6`](558cc1c) Thanks [@benchristel](https://github.com/benchristel)! - Add typetests to ensure that the data format accepted by
    `parseAndMigratePerseusItem` stays in sync with the types in `data-schema.ts`,
    exported from `@khanacademy/perseus-core`. Breaking change:
    `PerseusGraphTypeAngle.coords` can no longer be `null`; use `undefined` instead.


-   [#2421](#2421) [`bedcfc6f2`](bedcfc6) Thanks [@mahtabsabet](https://github.com/mahtabsabet)! - Allow widgets within hints to be collapsed/expanded through editor controls


-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2430](#2430) [`312166b0b`](312166b) Thanks [@jandrade](https://github.com/jandrade)! - Updates the `ExpressionEditor` widget to use a WB `Button` instance that resembles the previously supported `light` variant (now deprecated).


-   [#2417](#2417) [`4184314fe`](4184314) Thanks [@handeyeco](https://github.com/handeyeco)! - Enable Group to be rendered/answered with answerless item data


-   [#2380](#2380) [`1f88cc191`](1f88cc1) Thanks [@benchristel](https://github.com/benchristel)! - Removes `undefined` from the types of
    `PerseusInteractiveGraphWidgetOptions.lockedFigures` and
    the `labels` property of locked figures. Removes the `coords`
    property from interactive graph widget options types, for graphs that do not
    use it (all but the `point` graph type).

    This is a breaking change because assigning `undefined` to `lockedFigures` or
    `labels`, or setting `coord` in an object literal, will now give a type error.
    Callers should use an empty array instead of `undefined` for `lockedFigures` and
    `labels`. Avoid setting `coord` for graph types other than `point`.


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`39ca81d0f`](39ca81d), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`4b25852db`](4b25852), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`a90ebca08`](a90ebca), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`2243316be`](2243316), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`e7807485e`](e780748), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2417](#2417) [`4184314fe`](4184314) Thanks [@handeyeco](https://github.com/handeyeco)! - Enable Group to be rendered/answered with answerless item data


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses

-   Updated dependencies \[[`e7807485e`](e780748), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`e7807485e`](e780748), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses


-   [#2438](#2438) [`3f32593c9`](3f32593) Thanks [@benchristel](https://github.com/benchristel)! - Internal: Add a linter to prevent accidental mutation of object and array values

-   Updated dependencies \[[`a2701f002`](a2701f0), [`558cc1cc6`](558cc1c), [`79a84d31b`](79a84d3), [`ca4df1cf8`](ca4df1c), [`4282de2b2`](4282de2), [`e7807485e`](e780748), [`4184314fe`](4184314), [`1f88cc191`](1f88cc1), [`22e7de307`](22e7de3), [`c27162249`](c271622), [`28c395f8e`](28c395f), [`bfa5ce68a`](bfa5ce6), [`b7d3b9eaf`](b7d3b9e), [`f1662239e`](f166223), [`aa7b1b621`](aa7b1b6), [`1b773e2a0`](1b773e2), [`3f32593c9`](3f32593)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## [email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses

## [email protected]

### Patch Changes

-   [#2414](#2414) [`e7807485e`](e780748) Thanks [@jeremywiebe](https://github.com/jeremywiebe)! - Fix dependencies so that the package correctly depends on all of the packages it uses

Author: khan-actions-bot

Reviewers: benchristel

Required Reviewers:

Approved By: benchristel

Checks: ⏭️  1 check has been skipped, ✅ 4 checks were successful

Pull Request URL: #2412
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants