From aa02a99d1f830ec2abebfd3628dc2f51df5d4f64 Mon Sep 17 00:00:00 2001 From: Filipe Marins Date: Tue, 16 Aug 2022 17:38:25 -0300 Subject: [PATCH] [FIX] Katex is not respecting the 'Katex_Enabled' setting (#26542) --- .../server/functions/settings.mocks.ts | 3 - .../hooks/useParsedMessage.spec.tsx | 86 +++++++++++ .../MessageList/hooks/useParsedMessage.ts | 13 +- apps/meteor/package.json | 5 +- .../server/hooks/messages/markdownParser.ts | 10 +- .../unit/app/apps/server/messages.tests.js | 18 ++- .../application/RoomServiceReceiver.spec.ts | 2 - .../queue/InMemoryQueue.spec.ts | 22 +-- .../meteor/tests/unit/app/lib/server.mocks.js | 9 -- .../meteor/tests/unit/app/lib/server.tests.js | 19 ++- .../tests/unit/app/markdown/client.mocks.js | 67 +++------ .../tests/unit/app/markdown/client.tests.js | 6 +- .../app/meteor-accounts-saml/server.tests.ts | 15 +- .../tests/unit/app/ui-utils/server.mocks.js | 7 - .../tests/unit/app/ui-utils/server.tests.js | 10 +- .../tests/unit/app/utils/lib/getURL.tests.js | 17 ++- yarn.lock | 138 ++++++++++++++---- 17 files changed, 307 insertions(+), 140 deletions(-) create mode 100644 apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.spec.tsx delete mode 100644 apps/meteor/tests/unit/app/lib/server.mocks.js delete mode 100644 apps/meteor/tests/unit/app/ui-utils/server.mocks.js diff --git a/apps/meteor/app/settings/server/functions/settings.mocks.ts b/apps/meteor/app/settings/server/functions/settings.mocks.ts index 66300ce638e..4612f8bc3ef 100644 --- a/apps/meteor/app/settings/server/functions/settings.mocks.ts +++ b/apps/meteor/app/settings/server/functions/settings.mocks.ts @@ -1,4 +1,3 @@ -import mock from 'mock-require'; import type { ISetting } from '@rocket.chat/core-typings'; import type { ICachedSettings } from '../CachedSettings'; @@ -70,5 +69,3 @@ class SettingsClass { } export const Settings = new SettingsClass(); - -mock('@rocket.chat/models', { Settings }); diff --git a/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.spec.tsx b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.spec.tsx new file mode 100644 index 00000000000..75569d5778f --- /dev/null +++ b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.spec.tsx @@ -0,0 +1,86 @@ +import { renderHook } from '@testing-library/react-hooks'; +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +const date = new Date('2021-10-27T00:00:00.000Z'); +const baseMessage = { + ts: date, + u: { + _id: 'userId', + name: 'userName', + username: 'userName', + }, + msg: 'message', + rid: 'roomId', + _id: 'messageId', + _updatedAt: date, + urls: [], +}; + +const baseStubs = { + './useAutotranslateLanguage': { + useAutotranslateLanguage: (): boolean => false, + }, + '@rocket.chat/ui-contexts': { + useSetting: (): boolean => false, + }, +}; + +describe('useParsedMessage', () => { + it('should call the parse function with message and parse options parameters if all settings is false', () => { + const messageParser = sinon.spy(); + const { useParsedMessage } = proxyquire.noCallThru().load('./useParsedMessage', { + ...baseStubs, + '@rocket.chat/message-parser': { + parse: messageParser, + }, + }); + renderHook(() => useParsedMessage(baseMessage)); + + expect(messageParser.calledOnceWith(baseMessage.msg, { colors: false, emoticons: true })).to.be.true; + }); + + it('should call the parse function with katex in options parameters if Katex_Enabled is true', () => { + const messageParser = sinon.spy(); + const { useParsedMessage } = proxyquire.noCallThru().load('./useParsedMessage', { + ...baseStubs, + '@rocket.chat/ui-contexts': { + useSetting: (setting: string): boolean => setting === 'Katex_Enabled', + }, + '@rocket.chat/message-parser': { + parse: messageParser, + }, + }); + renderHook(() => useParsedMessage(baseMessage)); + + expect( + messageParser.calledOnceWith(baseMessage.msg, { + colors: false, + emoticons: true, + katex: { dollarSyntax: false, parenthesisSyntax: false }, + }), + ).to.be.true; + }); + + it('should call the parse function without katex in options parameters if Katex_Enabled is false', () => { + const messageParser = sinon.spy(); + const { useParsedMessage } = proxyquire.noCallThru().load('./useParsedMessage', { + ...baseStubs, + '@rocket.chat/ui-contexts': { + useSetting: (setting: string): boolean => setting !== 'Katex_Enabled', + }, + '@rocket.chat/message-parser': { + parse: messageParser, + }, + }); + renderHook(() => useParsedMessage(baseMessage)); + + expect( + messageParser.calledOnceWith(baseMessage.msg, { + colors: true, + emoticons: true, + }), + ).to.be.true; + }); +}); diff --git a/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts index 63bcba91e7b..294cdd483af 100644 --- a/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts +++ b/apps/meteor/client/views/room/MessageList/hooks/useParsedMessage.ts @@ -8,6 +8,7 @@ import { useAutotranslateLanguage } from './useAutotranslateLanguage'; export function useParsedMessage(message: IMessage & Partial): Root { const colors = useSetting('HexColorPreview_Enabled') as boolean; + const katexEnabled = useSetting('Katex_Enabled') as boolean; const katexDollarSyntax = useSetting('Katex_Dollar_Syntax') as boolean; const katexParenthesisSyntax = useSetting('Katex_Parenthesis_Syntax') as boolean; const autoTranslateLanguage = useAutotranslateLanguage(message.rid); @@ -19,10 +20,12 @@ export function useParsedMessage(message: IMessage & Partial const parseOptions = { colors, emoticons: true, - katex: { - dollarSyntax: katexDollarSyntax, - parenthesisSyntax: katexParenthesisSyntax, - }, + ...(katexEnabled && { + katex: { + dollarSyntax: katexDollarSyntax, + parenthesisSyntax: katexParenthesisSyntax, + }, + }), }; if (translated && autoTranslateLanguage && translations) { @@ -37,5 +40,5 @@ export function useParsedMessage(message: IMessage & Partial } return parse(msg, parseOptions); - }, [colors, katexDollarSyntax, katexParenthesisSyntax, autoTranslateLanguage, md, msg, translated, translations]); + }, [colors, katexEnabled, katexDollarSyntax, katexParenthesisSyntax, autoTranslateLanguage, md, msg, translated, translations]); } diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 0283707a0c1..292edefb7da 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -79,6 +79,7 @@ "@storybook/react": "~6.5.9", "@storybook/testing-library": "0.0.13", "@testing-library/react": "~12.1.5", + "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "~13.5.0", "@types/adm-zip": "^0.5.0", "@types/bad-words": "^3.0.1", @@ -114,7 +115,6 @@ "@types/meteor": "2.7.1", "@types/mkdirp": "^1.0.2", "@types/mocha": "^8.2.3", - "@types/mock-require": "^2.0.1", "@types/moment-timezone": "^0.5.30", "@types/node": "^14.18.21", "@types/node-rsa": "^1.1.1", @@ -122,6 +122,7 @@ "@types/parseurl": "^1.3.1", "@types/photoswipe": "^4.1.2", "@types/prometheus-gc-stats": "^0.6.2", + "@types/proxyquire": "^1.3.28", "@types/psl": "^1.1.0", "@types/react": "~17.0.47", "@types/react-dom": "~17.0.17", @@ -161,7 +162,6 @@ "i18next": "^20.6.1", "jsdom-global": "^3.0.2", "mocha": "^9.2.2", - "mock-require": "^3.0.3", "nyc": "^15.1.0", "outdent": "~0.8.0", "pino-pretty": "^7.6.1", @@ -173,6 +173,7 @@ "postcss-nested": "^5.0.6", "postcss-url": "^10.1.3", "prettier": "2.7.1", + "proxyquire": "^2.1.3", "rewire": "^6.0.0", "sinon": "^14.0.0", "source-map": "^0.7.4", diff --git a/apps/meteor/server/hooks/messages/markdownParser.ts b/apps/meteor/server/hooks/messages/markdownParser.ts index 2c731785ede..abc3e75217b 100644 --- a/apps/meteor/server/hooks/messages/markdownParser.ts +++ b/apps/meteor/server/hooks/messages/markdownParser.ts @@ -16,10 +16,12 @@ if (process.env.DISABLE_MESSAGE_PARSER !== 'true') { message.md = parse(message.msg, { colors: settings.get('HexColorPreview_Enabled'), emoticons: true, - katex: { - dollarSyntax: settings.get('Katex_Dollar_Syntax'), - parenthesisSyntax: settings.get('Katex_Parenthesis_Syntax'), - }, + ...(settings.get('Katex_Enabled') && { + katex: { + dollarSyntax: settings.get('Katex_Dollar_Syntax'), + parenthesisSyntax: settings.get('Katex_Parenthesis_Syntax'), + }, + }), }); } catch (e) { SystemLogger.error(e); // errors logged while the parser is at experimental stage diff --git a/apps/meteor/tests/unit/app/apps/server/messages.tests.js b/apps/meteor/tests/unit/app/apps/server/messages.tests.js index 574492831c5..23a740504a2 100644 --- a/apps/meteor/tests/unit/app/apps/server/messages.tests.js +++ b/apps/meteor/tests/unit/app/apps/server/messages.tests.js @@ -1,5 +1,5 @@ -import mock from 'mock-require'; import { expect } from 'chai'; +import proxyquire from 'proxyquire'; import { AppServerOrchestratorMock } from './mocks/orchestrator.mock'; import { appMessageMock, appMessageInvalidRoomMock } from './mocks/data/messages.data'; @@ -7,13 +7,19 @@ import { MessagesMock } from './mocks/models/Messages.mock'; import { RoomsMock } from './mocks/models/Rooms.mock'; import { UsersMock } from './mocks/models/Users.mock'; -mock('../../../../../app/models/server', './mocks/models'); -mock('meteor/random', { - id: () => 1, +const { AppMessagesConverter } = proxyquire.noCallThru().load('../../../../../app/apps/server/converters/messages', { + '../../../models/server': { + Messages: new MessagesMock(), + Rooms: new RoomsMock(), + Users: new UsersMock(), + }, + 'meteor/random': { + Random: { + id: () => 1, + }, + }, }); -const { AppMessagesConverter } = require('../../../../../app/apps/server/converters/messages'); - describe('The AppMessagesConverter instance', function () { let messagesConverter; let messagesMock; diff --git a/apps/meteor/tests/unit/app/federation-v2/server/unit/application/RoomServiceReceiver.spec.ts b/apps/meteor/tests/unit/app/federation-v2/server/unit/application/RoomServiceReceiver.spec.ts index 9242865da14..d6464496f46 100644 --- a/apps/meteor/tests/unit/app/federation-v2/server/unit/application/RoomServiceReceiver.spec.ts +++ b/apps/meteor/tests/unit/app/federation-v2/server/unit/application/RoomServiceReceiver.spec.ts @@ -2,8 +2,6 @@ import { expect } from 'chai'; import sinon from 'sinon'; import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; -import '../../../../lib/server.mocks'; - import { FederationRoomServiceReceiver } from '../../../../../../../app/federation-v2/server/application/RoomServiceReceiver'; import { FederatedUser } from '../../../../../../../app/federation-v2/server/domain/FederatedUser'; import { FederatedRoom } from '../../../../../../../app/federation-v2/server/domain/FederatedRoom'; diff --git a/apps/meteor/tests/unit/app/federation-v2/server/unit/infrastructure/queue/InMemoryQueue.spec.ts b/apps/meteor/tests/unit/app/federation-v2/server/unit/infrastructure/queue/InMemoryQueue.spec.ts index a99f99e14d8..2ba401d8221 100644 --- a/apps/meteor/tests/unit/app/federation-v2/server/unit/infrastructure/queue/InMemoryQueue.spec.ts +++ b/apps/meteor/tests/unit/app/federation-v2/server/unit/infrastructure/queue/InMemoryQueue.spec.ts @@ -1,16 +1,18 @@ import { expect, spy } from 'chai'; -import mock from 'mock-require'; +import proxyquire from 'proxyquire'; import type fastq from 'fastq'; -import { InMemoryQueue } from '../../../../../../../../app/federation-v2/server/infrastructure/queue/InMemoryQueue'; - -mock('fastq', { - promise(this: C, handler: fastq.asyncWorker): Pick, 'push'> { - return { - push: (task) => handler.call(this, task), - }; - }, -}); +const { InMemoryQueue } = proxyquire + .noCallThru() + .load('../../../../../../../../app/federation-v2/server/infrastructure/queue/InMemoryQueue', { + fastq: { + promise(this: C, handler: fastq.asyncWorker): Pick, 'push'> { + return { + push: (task) => handler.call(this, task), + }; + }, + }, + }); describe('Federation - Infrastructure - Queue - InMemoryQueue', () => { const queue = new InMemoryQueue(); diff --git a/apps/meteor/tests/unit/app/lib/server.mocks.js b/apps/meteor/tests/unit/app/lib/server.mocks.js deleted file mode 100644 index 47155e9084c..00000000000 --- a/apps/meteor/tests/unit/app/lib/server.mocks.js +++ /dev/null @@ -1,9 +0,0 @@ -import mock from 'mock-require'; - -mock('meteor/meteor', { - Meteor: { - absoluteUrl() { - return 'http://localhost:3000/'; - }, - }, -}); diff --git a/apps/meteor/tests/unit/app/lib/server.tests.js b/apps/meteor/tests/unit/app/lib/server.tests.js index 788cf4eb822..1ea2fb0a934 100644 --- a/apps/meteor/tests/unit/app/lib/server.tests.js +++ b/apps/meteor/tests/unit/app/lib/server.tests.js @@ -1,7 +1,20 @@ import { expect } from 'chai'; -import './server.mocks.js'; - -import PasswordPolicyClass from '../../../../app/lib/server/lib/PasswordPolicyClass'; +import proxyquire from 'proxyquire'; + +const { default: PasswordPolicyClass } = proxyquire.noCallThru().load('../../../../app/lib/server/lib/PasswordPolicyClass', { + 'meteor/meteor': { + Meteor: { + absoluteUrl() { + return 'http://localhost:3000/'; + }, + }, + }, + 'meteor/random': { + Random: { + id: () => 1, + }, + }, +}); describe('PasswordPolicyClass', () => { describe('Default options', () => { diff --git a/apps/meteor/tests/unit/app/markdown/client.mocks.js b/apps/meteor/tests/unit/app/markdown/client.mocks.js index 443a35b92cc..6f004b4262c 100644 --- a/apps/meteor/tests/unit/app/markdown/client.mocks.js +++ b/apps/meteor/tests/unit/app/markdown/client.mocks.js @@ -1,61 +1,30 @@ -import mock from 'mock-require'; +import proxyquire from 'proxyquire'; import _ from 'underscore'; import s from 'underscore.string'; _.mixin(s.exports()); -mock('meteor/meteor', { - Meteor: { - absoluteUrl() { - return 'http://localhost:3000/'; +const mocks = { + 'meteor/meteor': { + 'Meteor': { + absoluteUrl() { + return 'http://localhost:3000/'; + }, }, + '@global': true, }, -}); - -mock('meteor/blaze', { - Blaze: {}, -}); - -mock('../../../../app/settings', { - settings: { - get(setting) { - switch (setting) { - case 'DeepLink_Url': - return 'https://go.rocket.chat'; - case 'Markdown_SupportSchemesForLink': - return 'http,https'; - case 'Markdown_Parser': - return 'original'; - case 'Markdown_Headers': - // case 'Markdown_Marked_GFM': - // case 'Markdown_Marked_Tables': - // case 'Markdown_Marked_Breaks': - // case 'Markdown_Marked_Pedantic': - // case 'Markdown_Marked_SmartLists': - // case 'Markdown_Marked_Smartypants': - return true; - default: - throw new Error(`Missing setting mock ${setting}`); - } + 'meteor/random': { + 'Random': { + id() { + return Math.random().toString().replace('0.', 'A'); + }, }, + '@global': true, }, -}); +}; -mock('../../callbacks', { - callbacks: { - add() {}, - priority: { - HIGH: 1, - }, - }, -}); - -mock('meteor/random', { - Random: { - id() { - return Math.random().toString().replace('0.', 'A'); - }, - }, -}); +export const { Markdown } = proxyquire.noCallThru().load('../../../../app/markdown/lib/markdown', mocks); +export const { original } = proxyquire.noCallThru().load('../../../../app/markdown/lib/parser/original/original', mocks); +export const { filtered } = proxyquire.noCallThru().load('../../../../app/markdown/lib/parser/filtered/filtered', mocks); global.s = s; diff --git a/apps/meteor/tests/unit/app/markdown/client.tests.js b/apps/meteor/tests/unit/app/markdown/client.tests.js index 45182992d17..1bc20d99e51 100644 --- a/apps/meteor/tests/unit/app/markdown/client.tests.js +++ b/apps/meteor/tests/unit/app/markdown/client.tests.js @@ -1,11 +1,7 @@ -import './client.mocks.js'; - import { expect } from 'chai'; import { escapeHTML } from '@rocket.chat/string-helpers'; -import { original } from '../../../../app/markdown/lib/parser/original/original'; -import { filtered } from '../../../../app/markdown/lib/parser/filtered/filtered'; -import { Markdown } from '../../../../app/markdown/lib/markdown'; +import { Markdown, original, filtered } from './client.mocks.js'; const wrapper = (text, tag) => `${tag}${text}${tag}`; const boldWrapper = (text) => wrapper(`${text}`, '*'); diff --git a/apps/meteor/tests/unit/app/meteor-accounts-saml/server.tests.ts b/apps/meteor/tests/unit/app/meteor-accounts-saml/server.tests.ts index 35fa300a1fb..aacf0d2fac0 100644 --- a/apps/meteor/tests/unit/app/meteor-accounts-saml/server.tests.ts +++ b/apps/meteor/tests/unit/app/meteor-accounts-saml/server.tests.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; +import proxyquire from 'proxyquire'; import { AuthorizeRequest } from '../../../../app/meteor-accounts-saml/server/lib/generators/AuthorizeRequest'; import { LogoutRequest } from '../../../../app/meteor-accounts-saml/server/lib/generators/LogoutRequest'; import { LogoutResponse } from '../../../../app/meteor-accounts-saml/server/lib/generators/LogoutResponse'; -import { ServiceProviderMetadata } from '../../../../app/meteor-accounts-saml/server/lib/generators/ServiceProviderMetadata'; import { LogoutRequestParser } from '../../../../app/meteor-accounts-saml/server/lib/parsers/LogoutRequest'; import { LogoutResponseParser } from '../../../../app/meteor-accounts-saml/server/lib/parsers/LogoutResponse'; import { ResponseParser } from '../../../../app/meteor-accounts-saml/server/lib/parsers/Response'; @@ -35,7 +35,18 @@ import { privateKey, } from './data'; import { isTruthy } from '../../../../lib/isTruthy'; -import '../lib/server.mocks'; + +const { ServiceProviderMetadata } = proxyquire + .noCallThru() + .load('../../../../app/meteor-accounts-saml/server/lib/generators/ServiceProviderMetadata', { + 'meteor/meteor': { + Meteor: { + absoluteUrl() { + return 'http://localhost:3000/'; + }, + }, + }, + }); describe('SAML', () => { describe('[AuthorizeRequest]', () => { diff --git a/apps/meteor/tests/unit/app/ui-utils/server.mocks.js b/apps/meteor/tests/unit/app/ui-utils/server.mocks.js deleted file mode 100644 index b00c4ed43a1..00000000000 --- a/apps/meteor/tests/unit/app/ui-utils/server.mocks.js +++ /dev/null @@ -1,7 +0,0 @@ -import mock from 'mock-require'; - -mock('/app/emoji', { - emoji: { - list: {}, - }, -}); diff --git a/apps/meteor/tests/unit/app/ui-utils/server.tests.js b/apps/meteor/tests/unit/app/ui-utils/server.tests.js index c443d145760..c4170f9afc8 100644 --- a/apps/meteor/tests/unit/app/ui-utils/server.tests.js +++ b/apps/meteor/tests/unit/app/ui-utils/server.tests.js @@ -1,7 +1,13 @@ +import proxyquire from 'proxyquire'; import { expect } from 'chai'; -import './server.mocks.js'; -import { messageProperties } from '../../../../app/ui-utils/lib/MessageProperties'; +const { messageProperties } = proxyquire.noCallThru().load('../../../../app/ui-utils/lib/MessageProperties', { + '../../emoji': { + emoji: { + list: {}, + }, + }, +}); const messages = { 'Sample Message': 14, diff --git a/apps/meteor/tests/unit/app/utils/lib/getURL.tests.js b/apps/meteor/tests/unit/app/utils/lib/getURL.tests.js index eb1406acf74..924e92e5587 100644 --- a/apps/meteor/tests/unit/app/utils/lib/getURL.tests.js +++ b/apps/meteor/tests/unit/app/utils/lib/getURL.tests.js @@ -1,7 +1,22 @@ import { expect } from 'chai'; +import proxyquire from 'proxyquire'; import s from 'underscore.string'; -import { _getURL } from '../../../../../app/utils/lib/getURL'; +const { _getURL } = proxyquire.noCallThru().load('../../../../../app/utils/lib/getURL', { + 'meteor/meteor': { + 'Meteor': { + absoluteUrl() { + return 'http://localhost:3000/'; + }, + }, + '@global': true, + }, + '../../settings': { + settings: { + get: () => 'https://go.rocket.chat', + }, + }, +}); const testPaths = (o, _processPath) => { let processPath = _processPath; diff --git a/yarn.lock b/yarn.lock index b9e57ba6a45..ddc2822e157 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4288,6 +4288,7 @@ __metadata: "@storybook/testing-library": 0.0.13 "@tanstack/react-query": ^4.0.10 "@testing-library/react": ~12.1.5 + "@testing-library/react-hooks": ^8.0.1 "@testing-library/user-event": ~13.5.0 "@types/adm-zip": ^0.5.0 "@types/bad-words": ^3.0.1 @@ -4327,7 +4328,6 @@ __metadata: "@types/meteor": 2.7.1 "@types/mkdirp": ^1.0.2 "@types/mocha": ^8.2.3 - "@types/mock-require": ^2.0.1 "@types/moment-timezone": ^0.5.30 "@types/node": ^14.18.21 "@types/node-rsa": ^1.1.1 @@ -4337,6 +4337,7 @@ __metadata: "@types/photoswipe": ^4.1.2 "@types/prometheus-gc-stats": ^0.6.2 "@types/proxy-from-env": ^1.0.1 + "@types/proxyquire": ^1.3.28 "@types/psl": ^1.1.0 "@types/react": ~17.0.47 "@types/react-dom": ~17.0.17 @@ -4457,7 +4458,6 @@ __metadata: mime-type: ^4.0.0 mkdirp: ^1.0.4 mocha: ^9.2.2 - mock-require: ^3.0.3 moleculer: ^0.14.21 moment: ^2.29.3 moment-timezone: ^0.5.34 @@ -4489,6 +4489,7 @@ __metadata: prom-client: ^14.0.1 prometheus-gc-stats: ^0.6.3 proxy-from-env: ^1.1.0 + proxyquire: ^2.1.3 psl: ^1.8.0 query-string: ^7.1.1 queue-fifo: ^0.2.6 @@ -6190,6 +6191,28 @@ __metadata: languageName: node linkType: hard +"@testing-library/react-hooks@npm:^8.0.1": + version: 8.0.1 + resolution: "@testing-library/react-hooks@npm:8.0.1" + dependencies: + "@babel/runtime": ^7.12.5 + react-error-boundary: ^3.1.0 + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + react-dom: + optional: true + react-test-renderer: + optional: true + checksum: 7fe44352e920deb5cb1876f80d64e48615232072c9d5382f1e0284b3aab46bb1c659a040b774c45cdf084a5257b8fe463f7e08695ad8480d8a15635d4d3d1f6d + languageName: node + linkType: hard + "@testing-library/react@npm:~12.1.5": version: 12.1.5 resolution: "@testing-library/react@npm:12.1.5" @@ -6889,15 +6912,6 @@ __metadata: languageName: node linkType: hard -"@types/mock-require@npm:^2.0.1": - version: 2.0.1 - resolution: "@types/mock-require@npm:2.0.1" - dependencies: - "@types/node": "*" - checksum: 8749a4b3fcb9f3d6ebaeff442f00997ca59c4806bc00fea648a1fd06b1ea8510a6900b8e47070561ddf15ce98abc80dfe24ff21a307c2b0d1a6845bd865f708b - languageName: node - linkType: hard - "@types/moment-timezone@npm:^0.5.30": version: 0.5.30 resolution: "@types/moment-timezone@npm:0.5.30" @@ -7075,6 +7089,13 @@ __metadata: languageName: node linkType: hard +"@types/proxyquire@npm:^1.3.28": + version: 1.3.28 + resolution: "@types/proxyquire@npm:1.3.28" + checksum: 9f0267b4516c2686a2e99a6d4dbd2ed660133180aad775a4000f3e103d8b2fe6b1bfe5b36003edf7adfb02542aed6c2fa6049fc217daea73ebced2942a762f27 + languageName: node + linkType: hard + "@types/psl@npm:^1.1.0": version: 1.1.0 resolution: "@types/psl@npm:1.1.0" @@ -15172,6 +15193,16 @@ __metadata: languageName: node linkType: hard +"fill-keys@npm:^1.0.2": + version: 1.0.2 + resolution: "fill-keys@npm:1.0.2" + dependencies: + is-object: ~1.0.1 + merge-descriptors: ~1.0.0 + checksum: 6ac5ff60ff08f2f44d19e919c9ca579f4efaaa8c88232b4aab5a5b5522aeb8ec91501956e780cb2b44574fe4a4a337e9b43187829267d0b66a6bfedbafae893f + languageName: node + linkType: hard + "fill-range@npm:^4.0.0": version: 4.0.0 resolution: "fill-range@npm:4.0.0" @@ -15906,13 +15937,6 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^1.0.2": - version: 1.0.3 - resolution: "get-caller-file@npm:1.0.3" - checksum: 2b90a7f848896abcebcdc0acc627a435bcf05b9cd280599bc980ebfcdc222416c3df12c24c4845f69adc4346728e8966f70b758f9369f3534182791dfbc25c05 - languageName: node - linkType: hard - "get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -18238,6 +18262,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.9.0": + version: 2.10.0 + resolution: "is-core-module@npm:2.10.0" + dependencies: + has: ^1.0.3 + checksum: 0f3f77811f430af3256fa7bbc806f9639534b140f8ee69476f632c3e1eb4e28a38be0b9d1b8ecf596179c841b53576129279df95e7051d694dac4ceb6f967593 + languageName: node + linkType: hard + "is-cwebp-readable@npm:^2.0.1": version: 2.0.1 resolution: "is-cwebp-readable@npm:2.0.1" @@ -18560,7 +18593,7 @@ __metadata: languageName: node linkType: hard -"is-object@npm:^1.0.1": +"is-object@npm:^1.0.1, is-object@npm:~1.0.1": version: 1.0.2 resolution: "is-object@npm:1.0.2" checksum: 971219c4b1985b9751f65e4c8296d3104f0457b0e8a70849e848a4a2208bc47317d73b3b85d4a369619cb2df8284dc22584cb2695a7d99aca5e8d0aa64fc075a @@ -21413,7 +21446,7 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": +"merge-descriptors@npm:1.0.1, merge-descriptors@npm:~1.0.0": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 @@ -21976,16 +22009,6 @@ __metadata: languageName: node linkType: hard -"mock-require@npm:^3.0.3": - version: 3.0.3 - resolution: "mock-require@npm:3.0.3" - dependencies: - get-caller-file: ^1.0.2 - normalize-path: ^2.1.1 - checksum: 6355c0bd9d7acb5247155142928b0154ace2913264b42d9a611a85d469ed11048f405efe432ffc627a57efb87ec359589a7419bf680b4fd248612311deb031bd - languageName: node - linkType: hard - "module-details-from-path@npm:^1.0.3": version: 1.0.3 resolution: "module-details-from-path@npm:1.0.3" @@ -21993,6 +22016,13 @@ __metadata: languageName: node linkType: hard +"module-not-found-error@npm:^1.0.1": + version: 1.0.1 + resolution: "module-not-found-error@npm:1.0.1" + checksum: ebd65339d4d5980dd55cd32dbf112ec02b8e33f30866312b94caeee4783322259f18cf2270e9d2e600df3bd1876c35612b87f5c2525c21885fb1f83e85a9b9b0 + languageName: node + linkType: hard + "moleculer@npm:^0.14.21": version: 0.14.21 resolution: "moleculer@npm:0.14.21" @@ -25622,6 +25652,17 @@ __metadata: languageName: node linkType: hard +"proxyquire@npm:^2.1.3": + version: 2.1.3 + resolution: "proxyquire@npm:2.1.3" + dependencies: + fill-keys: ^1.0.2 + module-not-found-error: ^1.0.1 + resolve: ^1.11.1 + checksum: a320f1a04d65aeb41625bfd6bbf848492523b730b07926b6c1ed48f9342f2a30c4a4c0b399e07391e76691b65f604773327767c33a8578e5e4ab19299ba46a02 + languageName: node + linkType: hard + "prr@npm:~1.0.1": version: 1.0.1 resolution: "prr@npm:1.0.1" @@ -26163,6 +26204,17 @@ __metadata: languageName: node linkType: hard +"react-error-boundary@npm:^3.1.0": + version: 3.1.4 + resolution: "react-error-boundary@npm:3.1.4" + dependencies: + "@babel/runtime": ^7.12.5 + peerDependencies: + react: ">=16.13.1" + checksum: f36270a5d775a25c8920f854c0d91649ceea417b15b5bc51e270a959b0476647bb79abb4da3be7dd9a4597b029214e8fe43ea914a7f16fa7543c91f784977f1b + languageName: node + linkType: hard + "react-hook-form@npm:^7.30.0": version: 7.30.0 resolution: "react-hook-form@npm:7.30.0" @@ -27090,6 +27142,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.11.1": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.3": version: 2.0.0-next.3 resolution: "resolve@npm:2.0.0-next.3" @@ -27113,6 +27178,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@^1.11.1#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + languageName: node + linkType: hard + "resolve@patch:resolve@^2.0.0-next.3#~builtin": version: 2.0.0-next.3 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin::version=2.0.0-next.3&hash=07638b"