diff --git a/jest.config.js b/jest.config.js index 0d418366..7cc26183 100644 --- a/jest.config.js +++ b/jest.config.js @@ -38,7 +38,8 @@ module.exports = { customReact: 'react', reactRedux: 'react-redux', PFReactCore: '@patternfly/react-core', - PFReactTable: '@patternfly/react-table' + PFReactTable: '@patternfly/react-table', + '^monaco-editor$': '/packages/module/src/__mocks__/monaco-editor.ts' }, globalSetup: '/config/globalSetup.js', transform: { diff --git a/package-lock.json b/package-lock.json index 34a02051..22729fe4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10140,6 +10140,12 @@ "node": ">=12" } }, + "node_modules/dompurify": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", + "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, "node_modules/dot-case": { "version": "3.0.4", "dev": true, @@ -18806,9 +18812,26 @@ } }, "node_modules/monaco-editor": { - "version": "0.52.2", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.54.0.tgz", + "integrity": "sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==", + "license": "MIT", + "dependencies": { + "dompurify": "3.1.7", + "marked": "14.0.0" + } + }, + "node_modules/monaco-editor/node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", "license": "MIT", - "peer": true + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } }, "node_modules/moniker": { "version": "0.1.2", @@ -27019,6 +27042,7 @@ "@patternfly/react-table": "^6.1.0", "@segment/analytics-next": "^1.76.0", "clsx": "^2.1.0", + "monaco-editor": "^0.54.0", "path-browserify": "^1.0.1", "posthog-js": "^1.194.4", "react-markdown": "^9.0.1", diff --git a/packages/module/package.json b/packages/module/package.json index de1dc17f..508acf55 100644 --- a/packages/module/package.json +++ b/packages/module/package.json @@ -39,6 +39,7 @@ "@patternfly/react-table": "^6.1.0", "@segment/analytics-next": "^1.76.0", "clsx": "^2.1.0", + "monaco-editor": "^0.54.0", "path-browserify": "^1.0.1", "posthog-js": "^1.194.4", "react-markdown": "^9.0.1", diff --git a/packages/module/src/CodeModal/CodeModal.tsx b/packages/module/src/CodeModal/CodeModal.tsx index 4f25286e..31baab50 100644 --- a/packages/module/src/CodeModal/CodeModal.tsx +++ b/packages/module/src/CodeModal/CodeModal.tsx @@ -5,7 +5,8 @@ import type { FunctionComponent, MouseEvent } from 'react'; import { useState, useEffect, useRef } from 'react'; import path from 'path-browserify'; -import type monaco from 'monaco-editor'; +import * as monaco from 'monaco-editor'; +import { loader } from '@monaco-editor/react'; // Import PatternFly components import { CodeEditor } from '@patternfly/react-code-editor'; @@ -22,6 +23,9 @@ import FileDetails, { extensionToLanguage } from '../FileDetails'; import { ChatbotDisplayMode } from '../Chatbot'; import ChatbotModal from '../ChatbotModal/ChatbotModal'; +// Configure Monaco loader to use the npm package instead of CDN +loader.config({ monaco }); + export interface CodeModalProps { /** Class applied to code editor */ codeEditorControlClassName?: string; diff --git a/packages/module/src/__mocks__/monaco-editor.ts b/packages/module/src/__mocks__/monaco-editor.ts new file mode 100644 index 00000000..e8a05c18 --- /dev/null +++ b/packages/module/src/__mocks__/monaco-editor.ts @@ -0,0 +1,19 @@ +const mockEditor = { + layout: jest.fn(), + focus: jest.fn(), + dispose: jest.fn(), + getModel: jest.fn(), + updateOptions: jest.fn() +}; + +const mockModel = { + updateOptions: jest.fn(), + dispose: jest.fn() +}; + +module.exports = { + editor: { + create: jest.fn(() => mockEditor), + getModels: jest.fn(() => [mockModel]) + } +};