From cf3b577c7a5239db30eaacdbec60cc7599339aaa Mon Sep 17 00:00:00 2001 From: Nikolas Nyby Date: Tue, 23 Apr 2024 14:18:37 -0400 Subject: [PATCH] Migrate to better-react-mathjax There are many react/mathjax component libraries and none of them are really "officially" maintained, so it's a bit of trial and error to find one that works best. I actually wasn't able to directly reproduce the issue in the ECON-660 ticket in my browsers (Firefox / Brave), but I have definitely been seeing mathjax warnings in the JS console, and just general performance weirdness with loading these componenents, so I've migrated to a different library to see if things behave better. --- jest.config.cjs | 4 +- media/js/src/Editor.test.js | 57 +++--- media/js/src/JXGBoard.jsx | 14 +- media/js/src/JXGBoard.test.js | 12 +- media/js/src/editor-main.js | 7 +- media/js/src/editors/CobbDouglasEditor.jsx | 8 +- .../js/src/editors/CobbDouglasNLDSEditor.jsx | 20 +- .../src/editors/ConsumptionLeisureEditor.jsx | 8 +- .../src/editors/ConsumptionSavingEditor.jsx | 8 +- .../editors/NonLinearDemandSupplyEditor.jsx | 14 +- media/js/src/editors/TemplateGraphEditor.jsx | 8 +- media/js/src/form-components/RangeEditor.js | 8 +- .../src/form-components/RangeEditor.test.js | 35 ++-- media/js/src/viewer-main.js | 7 +- package-lock.json | 174 ++++++++++++------ package.json | 2 +- 16 files changed, 238 insertions(+), 148 deletions(-) diff --git a/jest.config.cjs b/jest.config.cjs index b886515d9..5a21c7a2f 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -8,8 +8,8 @@ const config = { }, transformIgnorePatterns: [], testPathIgnorePatterns: [ - // Temporary workaround for mathjax3-react issue: - // https://github.com/asnunes/mathjax3-react/issues/30 + // Temporary workaround for better-react-mathjax issue: + // https://github.com/fast-reflexes/better-react-mathjax/issues/62 "media/js/src/form-components/RangeEditor.test.js", "media/js/src/JXGBoard.test.js", "media/js/src/GraphEditor.test.js", diff --git a/media/js/src/Editor.test.js b/media/js/src/Editor.test.js index 8d5e4a350..d56e78e23 100644 --- a/media/js/src/Editor.test.js +++ b/media/js/src/Editor.test.js @@ -3,38 +3,51 @@ import React from 'react'; import TestRenderer from 'react-test-renderer'; import ReactTestUtils from 'react-dom/test-utils'; +import { MathJaxContext } from 'better-react-mathjax'; import Editor from './Editor.jsx'; import { exportGraph } from './GraphMapping.js'; it('renders without crashing', () => { - TestRenderer.create(); + TestRenderer.create( + + + + ); }); it('renders with children in the expected visibility state', () => { - TestRenderer.create(, function() { - expect(this.gp.current.props.showing).toBe(true); - expect(this.ge.current.props.showing).toBe(false); + TestRenderer.create( + + + , + function() { + expect(this.gp.current.props.showing).toBe(true); + expect(this.ge.current.props.showing).toBe(false); - expect(ReactTestUtils.isCompositeComponent(this.gp.current)).toBe(true); - expect(ReactTestUtils.isCompositeComponent(this.ge.current)).toBe(true); + expect(ReactTestUtils.isCompositeComponent(this.gp.current)).toBe(true); + expect(ReactTestUtils.isCompositeComponent(this.ge.current)).toBe(true); - expect(this.state.step).toBe(0); - expect(this.state.gType).toBe(null); - ReactTestUtils.Simulate.click(this.gp.current.b1); - // expect(this.state.step).toBe(1); - }); + expect(this.state.step).toBe(0); + expect(this.state.gType).toBe(null); + ReactTestUtils.Simulate.click(this.gp.current.b1); + // expect(this.state.step).toBe(1); + }); }); it('exports its graph state', () => { - TestRenderer.create(, function() { - let o = exportGraph(this.state); - expect(o.graph_type).toBe(null); - expect(o.show_intersection).toBe(true); - expect(o.line_1_slope).toBe(1); - expect(o.line_2_slope).toBe(-1); - expect(o.line_1_label).toBe(''); - expect(o.line_2_label).toBe(''); - expect(o.y_axis_label).toBe(''); - expect(o.x_axis_label).toBe(''); - }); + TestRenderer.create( + + + , + function() { + let o = exportGraph(this.state); + expect(o.graph_type).toBe(null); + expect(o.show_intersection).toBe(true); + expect(o.line_1_slope).toBe(1); + expect(o.line_2_slope).toBe(-1); + expect(o.line_1_label).toBe(''); + expect(o.line_2_label).toBe(''); + expect(o.y_axis_label).toBe(''); + expect(o.x_axis_label).toBe(''); + }); }); diff --git a/media/js/src/JXGBoard.jsx b/media/js/src/JXGBoard.jsx index aa9dffe05..ec0a8c7a6 100644 --- a/media/js/src/JXGBoard.jsx +++ b/media/js/src/JXGBoard.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import JXG from 'jsxgraph'; import {graphTypes} from './graphs/graphTypes.js'; import {mkNonLinearDemandSupply} from './graphs/NonLinearDemandSupplyGraph.js'; @@ -589,14 +589,14 @@ export default class JXGBoard extends React.Component { const func1 = String.raw`MP_${this.props.gNName} = (1 - \alpha)${this.props.gCobbDouglasAName}${this.props.gCobbDouglasKName}^\alpha ${this.props.gNName}^{-\alpha}`; const func2 = String.raw`MP_${this.props.gCobbDouglasKName} = \alpha ${this.props.gCobbDouglasAName}${this.props.gCobbDouglasKName}^{\alpha - 1} ${this.props.gNName}^{1 - \alpha}`; math1 = ( - - - + + {'$$' + func1 + '$$'} + ); math2 = ( - - - + + {'$$' + func2 + '$$'} + ); } figure2 = false; diff --git a/media/js/src/JXGBoard.test.js b/media/js/src/JXGBoard.test.js index 8a3af225a..354164434 100644 --- a/media/js/src/JXGBoard.test.js +++ b/media/js/src/JXGBoard.test.js @@ -2,12 +2,16 @@ import React from 'react'; import TestRenderer from 'react-test-renderer'; +import { MathJaxContext } from 'better-react-mathjax'; import JXGBoard from './JXGBoard.jsx'; it('renders without crashing', () => { TestRenderer.create( - ); + + + + ); }); diff --git a/media/js/src/editor-main.js b/media/js/src/editor-main.js index 377f36a39..0b2c379e8 100644 --- a/media/js/src/editor-main.js +++ b/media/js/src/editor-main.js @@ -1,7 +1,12 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; +import { MathJaxContext } from 'better-react-mathjax'; import Editor from './Editor.jsx'; const container = document.getElementById('root'); const root = createRoot(container); -root.render(); +root.render( + + + +); diff --git a/media/js/src/editors/CobbDouglasEditor.jsx b/media/js/src/editors/CobbDouglasEditor.jsx index 775467361..5934b6da8 100644 --- a/media/js/src/editors/CobbDouglasEditor.jsx +++ b/media/js/src/editors/CobbDouglasEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import RangeEditor from '../form-components/RangeEditor.js'; import EditableControl from '../form-components/EditableControl.jsx'; import { handleFormUpdate } from '../utils.js'; @@ -37,9 +37,9 @@ export default class CobbDouglasEditor extends React.Component { )}
- - - + + {'$$' + tex + '$$'} +

diff --git a/media/js/src/editors/CobbDouglasNLDSEditor.jsx b/media/js/src/editors/CobbDouglasNLDSEditor.jsx index 957715088..8c65873d9 100644 --- a/media/js/src/editors/CobbDouglasNLDSEditor.jsx +++ b/media/js/src/editors/CobbDouglasNLDSEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import RangeEditor from '../form-components/RangeEditor.js'; import EditableControl from '../form-components/EditableControl.jsx'; import { handleFormUpdate } from '../utils.js'; @@ -39,9 +39,9 @@ export default class CobbDouglasNLDSEditor extends React.Component { )}
- - - + + {'$$' + tex + '$$'} +
@@ -63,9 +63,9 @@ export default class CobbDouglasNLDSEditor extends React.Component { value={0} checked={this.props.gFunctionChoice === 0} /> @@ -81,9 +81,9 @@ export default class CobbDouglasNLDSEditor extends React.Component { value={1} checked={this.props.gFunctionChoice === 1} /> diff --git a/media/js/src/editors/ConsumptionLeisureEditor.jsx b/media/js/src/editors/ConsumptionLeisureEditor.jsx index 1115e23a0..4705172f9 100644 --- a/media/js/src/editors/ConsumptionLeisureEditor.jsx +++ b/media/js/src/editors/ConsumptionLeisureEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import RangeEditor from '../form-components/RangeEditor.js'; import EditableControl from '../form-components/EditableControl.jsx'; import { handleFormUpdate } from '../utils.js'; @@ -21,9 +21,9 @@ export default class ConsumptionLeisureEditor extends React.Component {

Function

- - - + + {'$$' + tex + '$$'} +

diff --git a/media/js/src/editors/ConsumptionSavingEditor.jsx b/media/js/src/editors/ConsumptionSavingEditor.jsx index 60bbc8bb8..c714ade13 100644 --- a/media/js/src/editors/ConsumptionSavingEditor.jsx +++ b/media/js/src/editors/ConsumptionSavingEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import RangeEditor from '../form-components/RangeEditor.js'; import EditableControl from '../form-components/EditableControl.jsx'; import { handleFormUpdate } from '../utils.js'; @@ -15,9 +15,9 @@ export default class ConsumptionSavingEditor extends React.Component {

Function

- - - + + {'$$' + tex + '$$'} +
} diff --git a/media/js/src/editors/NonLinearDemandSupplyEditor.jsx b/media/js/src/editors/NonLinearDemandSupplyEditor.jsx index 7bedc4e86..2a9e86125 100644 --- a/media/js/src/editors/NonLinearDemandSupplyEditor.jsx +++ b/media/js/src/editors/NonLinearDemandSupplyEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import RangeEditor from '../form-components/RangeEditor.js'; import EditableControl from '../form-components/EditableControl.jsx'; import AreaConfiguration from './AreaConfiguration.jsx'; @@ -26,9 +26,9 @@ export default class NonLinearDemandSupplyEditor extends React.Component { checked={this.props.gFunctionChoice === 0} />
@@ -40,9 +40,9 @@ export default class NonLinearDemandSupplyEditor extends React.Component { value={1} checked={this.props.gFunctionChoice === 1} />

diff --git a/media/js/src/editors/TemplateGraphEditor.jsx b/media/js/src/editors/TemplateGraphEditor.jsx index db80060b7..2a00841c2 100644 --- a/media/js/src/editors/TemplateGraphEditor.jsx +++ b/media/js/src/editors/TemplateGraphEditor.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { MathJaxProvider, MathJaxFormula } from 'mathjax3-react'; +import { MathJax } from 'better-react-mathjax'; import { create, all } from 'mathjs'; import {handleFormUpdate} from '../utils.js'; @@ -50,9 +50,9 @@ export default class TemplateGraphEditor extends React.Component { {this.props.itemlabel && (
- - - + + {'$$' + this.props.itemlabel + '$$'} +
)} diff --git a/media/js/src/form-components/RangeEditor.test.js b/media/js/src/form-components/RangeEditor.test.js index d8f1f2a51..0c6ccae80 100644 --- a/media/js/src/form-components/RangeEditor.test.js +++ b/media/js/src/form-components/RangeEditor.test.js @@ -2,31 +2,36 @@ import React from 'react'; import TestRenderer from 'react-test-renderer'; +import { MathJaxContext } from 'better-react-mathjax'; import RangeEditor from './RangeEditor.js'; it('renders without crashing', () => { const el = TestRenderer.create( - + + + ); if (!el){ console.error('el does not exist'); } }); it('Displays override radio button when configured', () => { const el = TestRenderer.create( - + + + ).root; const button = el.findByProps({type: 'radio'}); expect(button.type).toEqual('input'); diff --git a/media/js/src/viewer-main.js b/media/js/src/viewer-main.js index ec8053ea6..acc0bc01c 100644 --- a/media/js/src/viewer-main.js +++ b/media/js/src/viewer-main.js @@ -1,7 +1,12 @@ import React from 'react'; import { createRoot } from 'react-dom/client'; +import { MathJaxContext } from 'better-react-mathjax'; import Viewer from './Viewer.jsx'; const container = document.getElementById('root'); const root = createRoot(container); -root.render(); +root.render( + + + +); diff --git a/package-lock.json b/package-lock.json index acc6a2a23..6075e6d93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,10 @@ "version": "0.1.0", "license": "GPL-3.0+", "dependencies": { + "better-react-mathjax": "~2.0.3", "commonmark": "0.31.0", "decimal.js": "nikolas/decimal.js#export-fix", "jsxgraph": "~1.8.0", - "mathjax3-react": "~1.2.0", "mathjs": "^12.4.0", "object-assign": "~4.1.1", "promise": "~8.3.0", @@ -240,9 +240,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -3053,9 +3053,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz", - "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3137,9 +3137,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.6.tgz", - "integrity": "sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -4044,13 +4044,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -4071,12 +4071,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4127,6 +4127,17 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/better-react-mathjax": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/better-react-mathjax/-/better-react-mathjax-2.0.3.tgz", + "integrity": "sha512-wfifT8GFOKb1TWm2+E50I6DJpLZ5kLbch283Lu043EJtwSv0XvZDjr4YfR4d2MjAhqP6SH4VjjrKgbX8R00oCQ==", + "dependencies": { + "mathjax-full": "^3.2.2" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/bfj": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-8.0.0.tgz", @@ -4369,9 +4380,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001607", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", - "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", "funding": [ { "type": "opencollective", @@ -4599,9 +4610,12 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "engines": { + "node": "^12.20.0 || >=14" + } }, "node_modules/common-path-prefix": { "version": "3.0.0", @@ -4657,9 +4671,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -4966,9 +4980,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -5180,9 +5194,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.730", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.730.tgz", - "integrity": "sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==" + "version": "1.4.747", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.747.tgz", + "integrity": "sha512-+FnSWZIAvFHbsNVmUxhEqWiaOiPMcfum1GQzlWCg/wLigVtshOsjXHyEFfmt6cFK6+HkS3QOJBv6/3OPumbBfw==" }, "node_modules/emittery": { "version": "0.13.1", @@ -6034,6 +6048,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -10231,15 +10253,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mathjax3-react": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mathjax3-react/-/mathjax3-react-1.2.0.tgz", - "integrity": "sha512-1FLk0OiHEW4EdIRKIR9SgvjN/XtglnKgnNF/vF/bkkLypVkitFCTFDOneEl3cXU6fJebNI7AP0xE8ZQE5JhS1g==", + "node_modules/mathjax-full": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", + "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", "dependencies": { - "simple-load-script": "2.0.0" - }, - "peerDependencies": { - "react": "18.x" + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" } }, "node_modules/mathjs": { @@ -10345,6 +10367,11 @@ "node": ">= 8" } }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -10543,6 +10570,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -11193,9 +11225,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", "dev": true }, "node_modules/object-assign": { @@ -13075,11 +13107,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-load-script": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-load-script/-/simple-load-script-2.0.0.tgz", - "integrity": "sha512-KYlKaZH7jW4pI5zHZxwFuERrYZZIIQDOOz+zgB70+Xt69EHoFJ4kkyyJk1PfpUvOHLRyz3PSwDAUEIlfRQKNow==" - }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -13151,9 +13178,9 @@ } }, "node_modules/socks": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.2.tgz", - "integrity": "sha512-5Hvyu6Md91ooZzdrN/bSn/zlulFaRHrk2/6IY6qQNa3oVHTiG+CKxBV5PynKCGf31ar+3/hyPvlHFAYaBEOa3A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -13238,6 +13265,19 @@ "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, + "node_modules/speech-rule-engine": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", + "dependencies": { + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" + }, + "bin": { + "sre": "bin/sre" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13595,9 +13635,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13696,6 +13736,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -13991,9 +14036,9 @@ } }, "node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "peer": true, "bin": { @@ -14553,6 +14598,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -14681,6 +14731,14 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "engines": { + "node": ">=0.1" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 97bb3d3b0..6b3ad6df5 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "commonmark": "0.31.0", "decimal.js": "nikolas/decimal.js#export-fix", "jsxgraph": "~1.8.0", - "mathjax3-react": "~1.2.0", + "better-react-mathjax": "~2.0.3", "mathjs": "^12.4.0", "object-assign": "~4.1.1", "promise": "~8.3.0",