From f550420c490b22b50b543204447efa7802b37b60 Mon Sep 17 00:00:00 2001 From: Makoto Morimoto Date: Mon, 17 Aug 2020 12:52:12 -0700 Subject: [PATCH 1/3] Fixing lint error that's breaking master build due to mismatched package versions. (#14565) * Fixing lint error that's breaking master build due to mismatched package versions. * Change files * Adding @uifabric/icons to package.json. * Adding @fluentui/storybook dependency. --- ...atar-2020-08-17-10-51-03-mismatchedVersions.json | 8 ++++++++ packages/react-avatar/package.json | 13 +++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 change/@fluentui-react-avatar-2020-08-17-10-51-03-mismatchedVersions.json diff --git a/change/@fluentui-react-avatar-2020-08-17-10-51-03-mismatchedVersions.json b/change/@fluentui-react-avatar-2020-08-17-10-51-03-mismatchedVersions.json new file mode 100644 index 00000000000000..2d111246d89d1c --- /dev/null +++ b/change/@fluentui-react-avatar-2020-08-17-10-51-03-mismatchedVersions.json @@ -0,0 +1,8 @@ +{ + "type": "patch", + "comment": "Fixing lint error that's breaking master build due to mismatched package versions.", + "packageName": "@fluentui/react-avatar", + "email": "humbertomakotomorimoto@gmail.com", + "dependentChangeType": "patch", + "date": "2020-08-17T17:51:03.355Z" +} diff --git a/packages/react-avatar/package.json b/packages/react-avatar/package.json index 64e1f7a3cccce0..b2a69e48366dd5 100644 --- a/packages/react-avatar/package.json +++ b/packages/react-avatar/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@fluentui/react-conformance": "^0.1.0", + "@fluentui/storybook": "^0.2.8", "@types/enzyme": "3.10.3", "@types/enzyme-adapter-react-16": "1.0.3", "@types/jest": "~24.9.0", @@ -36,7 +37,7 @@ "@types/react-test-renderer": "^16.0.0", "@types/webpack-env": "1.15.1", "@uifabric/build": "^7.0.0", - "@uifabric/jest-serializer-merge-styles": "^7.0.33", + "@uifabric/jest-serializer-merge-styles": "^7.0.35", "enzyme": "~3.10.0", "enzyme-adapter-react-16": "^1.15.0", "es6-weak-map": "^2.0.2", @@ -46,13 +47,13 @@ "react-test-renderer": "^16.3.0" }, "dependencies": { - "@fluentui/react-compose": "^0.14.4", "@fluentui/accessibility": "^0.51.0", - "@fluentui/react-theme-provider": "^0.7.1", + "@fluentui/react-compose": "^0.14.5", "@fluentui/react-stylesheets": "^0.1.16", - "@uifabric/set-version": "^7.0.19", - "@uifabric/react-hooks": "^7.8.1", - "@uifabric/utilities": "^7.27.1", + "@fluentui/react-theme-provider": "^0.7.2", + "@uifabric/react-hooks": "^7.8.2", + "@uifabric/set-version": "^7.0.21", + "@uifabric/utilities": "^7.28.0", "tslib": "^1.10.0" }, "peerDependencies": { From 160f6141e0bf41a118d71cac0744fd6282333f86 Mon Sep 17 00:00:00 2001 From: Jon Schectman Date: Mon, 17 Aug 2020 13:38:24 -0700 Subject: [PATCH 2/3] Codemods: Implement Result and prepare for logging update. (#14548) * result implemented * add logger interface * tweak no op result * Change files --- ...mods-2020-08-15-12-38-06-implement-result.json | 8 ++++++++ .../componentToCompat/componentToCompat.mod.ts | 3 ++- .../src/codeMods/mods/configMod/configMod.ts | 5 +++-- .../officeToFluentImport.mod.ts | 3 ++- .../mods/oldToNewButton/oldToNewButton.mod.ts | 5 +++-- .../mods/personaToAvatar/personaToAvatar.mod.ts | 5 +++-- packages/codemods/src/codeMods/types.ts | 11 ++++++++--- packages/codemods/src/modRunner/logger.ts | 10 ++++++++++ .../codemods/src/modRunner/runnerUtilities.ts | 7 ++++--- .../codemods/src/modRunner/tests/command.test.ts | 5 +++-- .../codemods/src/modRunner/tests/filters.test.ts | 13 +++++++------ .../tests/mocks/MockMods/CodeMod.mock.ts | 3 ++- .../src/modRunner/tests/modRunner.test.ts | 6 ++++-- packages/codemods/src/upgrade.ts | 15 ++++++++------- 14 files changed, 67 insertions(+), 32 deletions(-) create mode 100644 change/@fluentui-codemods-2020-08-15-12-38-06-implement-result.json create mode 100644 packages/codemods/src/modRunner/logger.ts diff --git a/change/@fluentui-codemods-2020-08-15-12-38-06-implement-result.json b/change/@fluentui-codemods-2020-08-15-12-38-06-implement-result.json new file mode 100644 index 00000000000000..d48b7880ec526f --- /dev/null +++ b/change/@fluentui-codemods-2020-08-15-12-38-06-implement-result.json @@ -0,0 +1,8 @@ +{ + "type": "patch", + "comment": "Codemods: Implement result and prepare for logging changes", + "packageName": "@fluentui/codemods", + "email": "joschect@microsoft.com", + "dependentChangeType": "patch", + "date": "2020-08-15T19:38:06.133Z" +} diff --git a/packages/codemods/src/codeMods/mods/componentToCompat/componentToCompat.mod.ts b/packages/codemods/src/codeMods/mods/componentToCompat/componentToCompat.mod.ts index 1b2f8f5b37a5f9..46a130b90cf826 100644 --- a/packages/codemods/src/codeMods/mods/componentToCompat/componentToCompat.mod.ts +++ b/packages/codemods/src/codeMods/mods/componentToCompat/componentToCompat.mod.ts @@ -1,6 +1,7 @@ import { runComponentToCompat, buildCompatHash, RawCompat, ComponentToCompat, getNamedExports } from './compatHelpers'; import { CodeMod } from '../../types'; import { SourceFile } from 'ts-morph'; +import { Ok } from '../../../helpers/result'; // Not sure if this the best way to get all the things exported from button. It's dependent on version // And other things. Ideally we'd be able to get it from within ts-morph. @@ -40,7 +41,7 @@ export function createComponentToCompat(comp: RawCompat): ComponentToCompat { const ComponentToCompat: CodeMod = { run: (file: SourceFile) => { runComponentToCompat(file, buildCompatHash(exportMapping, createComponentToCompat), fabricindex); - return { success: true }; + return Ok({ logs: ['Moved imports to compat'] }); }, name: 'ComponentToCompat', version: '1.0.0', diff --git a/packages/codemods/src/codeMods/mods/configMod/configMod.ts b/packages/codemods/src/codeMods/mods/configMod/configMod.ts index d70a0121a64368..f376526010ef7c 100644 --- a/packages/codemods/src/codeMods/mods/configMod/configMod.ts +++ b/packages/codemods/src/codeMods/mods/configMod/configMod.ts @@ -8,6 +8,7 @@ import { CodeModMapType, } from '../../types'; import { findJsxTag, renameProp, getImportsByPath, repathImport } from '../../utilities/index'; +import { Ok, Err } from '../../../helpers/result'; const jsonObj: UpgradeJSONType = require('../upgrades.json'); @@ -23,9 +24,9 @@ export function createCodeModFromJson(): CodeMod | undefined { func(); }); } catch (e) { - return { success: false }; + Err({ reason: 'Error' }); } - return { success: true }; + return Ok({ logs: ['Updated Successfully'] }); }, version: '100000', name: jsonObj.name, diff --git a/packages/codemods/src/codeMods/mods/officeToFluentImport/officeToFluentImport.mod.ts b/packages/codemods/src/codeMods/mods/officeToFluentImport/officeToFluentImport.mod.ts index 73f96447e1dee7..89055001a48aa5 100644 --- a/packages/codemods/src/codeMods/mods/officeToFluentImport/officeToFluentImport.mod.ts +++ b/packages/codemods/src/codeMods/mods/officeToFluentImport/officeToFluentImport.mod.ts @@ -1,6 +1,7 @@ import { SourceFile } from 'ts-morph'; import { CodeMod } from '../../types'; import { getImportsByPath, repathImport } from '../../utilities/index'; +import { Ok } from '../../../helpers/result'; const searchString = /^office\-ui\-fabric\-react/; const newString = '@fluentui/react'; @@ -11,7 +12,7 @@ const RepathOfficeToFluentImports: CodeMod = { imports.forEach(val => { repathImport(val, newString, searchString); }); - return { success: true }; + return Ok({ logs: ['Replaced office-ui-fabric-react imports with @fluentui'] }); }, name: 'RepathOfficeImportsToFluent', version: '1.0.0', diff --git a/packages/codemods/src/codeMods/mods/oldToNewButton/oldToNewButton.mod.ts b/packages/codemods/src/codeMods/mods/oldToNewButton/oldToNewButton.mod.ts index d40b7eafd49694..820e3748c6182d 100644 --- a/packages/codemods/src/codeMods/mods/oldToNewButton/oldToNewButton.mod.ts +++ b/packages/codemods/src/codeMods/mods/oldToNewButton/oldToNewButton.mod.ts @@ -1,6 +1,7 @@ import { SourceFile } from 'ts-morph'; import { CodeMod } from '../../types'; import { renameProp, findJsxTag } from '../../utilities/index'; +import { Ok, Err } from '../../../helpers/result'; const oldToNewButton: CodeMod = { run: (file: SourceFile) => { @@ -8,9 +9,9 @@ const oldToNewButton: CodeMod = { const tags = findJsxTag(file, 'DefaultButton'); renameProp(tags, 'toggled', 'checked'); } catch (e) { - return { success: false }; + return Err({ reason: 'Error' }); } - return { success: true }; + return Ok({ logs: ['Upgrade completed'] }); }, version: '100000', name: 'oldToNewButton', diff --git a/packages/codemods/src/codeMods/mods/personaToAvatar/personaToAvatar.mod.ts b/packages/codemods/src/codeMods/mods/personaToAvatar/personaToAvatar.mod.ts index e533610574b507..b7a29d51b15c4b 100644 --- a/packages/codemods/src/codeMods/mods/personaToAvatar/personaToAvatar.mod.ts +++ b/packages/codemods/src/codeMods/mods/personaToAvatar/personaToAvatar.mod.ts @@ -10,6 +10,7 @@ import { } from 'ts-morph'; import { findJsxTag, appendOrCreateNamedImport } from '../../utilities/index'; import { CodeMod } from '../../types'; +import { Ok, Err } from '../../../helpers/result'; const personaPath = 'office-ui-fabric-react/lib/Persona'; @@ -169,9 +170,9 @@ const PersonaToAvatarMod: CodeMod = { renamePrimaryTextProp(file); renameRenderCoin(file); } catch (e) { - return { success: false }; + return Err({ reason: 'Error', log: JSON.stringify(e) }); } - return { success: true }; + return Ok({ logs: ['Replaced Persona with Avatar'] }); }, version: '100000', name: 'PersonaToAvatar', diff --git a/packages/codemods/src/codeMods/types.ts b/packages/codemods/src/codeMods/types.ts index 3d59cb2c34b676..65400e029a9795 100644 --- a/packages/codemods/src/codeMods/types.ts +++ b/packages/codemods/src/codeMods/types.ts @@ -1,9 +1,14 @@ import { SourceFile, JsxExpression, JsxOpeningElement, JsxSelfClosingElement } from 'ts-morph'; +import { Result } from '../helpers/result'; -export interface CodeModResult { - success?: boolean; +export interface ModResult { + logs: string[]; } - +export type NoOp = { + reason: string; + log?: string; +}; +export type CodeModResult = Result; export interface CodeMod { /** * Each type of codemod can have multiple versions which work on different versions of its targeted package. diff --git a/packages/codemods/src/modRunner/logger.ts b/packages/codemods/src/modRunner/logger.ts new file mode 100644 index 00000000000000..0f2e2ad48c004b --- /dev/null +++ b/packages/codemods/src/modRunner/logger.ts @@ -0,0 +1,10 @@ +export interface LogFunction { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (...args: any[]): void; +} + +export interface Logger { + log: LogFunction; + warn: LogFunction; + error: LogFunction; +} diff --git a/packages/codemods/src/modRunner/runnerUtilities.ts b/packages/codemods/src/modRunner/runnerUtilities.ts index b0763ccf579c84..7dcce00069751d 100644 --- a/packages/codemods/src/modRunner/runnerUtilities.ts +++ b/packages/codemods/src/modRunner/runnerUtilities.ts @@ -1,6 +1,7 @@ import { CodeMod } from '../codeMods/types'; import { Glob } from 'glob'; import { Maybe, Nothing, Something } from '../helpers/maybe'; +import { Logger } from './logger'; // TODO ensure that async for all these utilities works export function runMods( @@ -71,12 +72,12 @@ export function loadMod(path: string, errorCallback: (e: Error) => void): Maybe< return Nothing(); } -export function getEnabledMods(getPaths = getModsPaths, loadM = loadMod) { +export function getEnabledMods(logger: Logger, getPaths = getModsPaths, loadM = loadMod) { return getPaths() .map(pth => { - console.log('fetching codeMod at ', pth); + logger.log('fetching codeMod at ', pth); return loadM(pth, e => { - console.error(e); + logger.error(e); }); }) .filter(modEnabled) diff --git a/packages/codemods/src/modRunner/tests/command.test.ts b/packages/codemods/src/modRunner/tests/command.test.ts index a481e2a88c2259..1f73510f5dbe1e 100644 --- a/packages/codemods/src/modRunner/tests/command.test.ts +++ b/packages/codemods/src/modRunner/tests/command.test.ts @@ -1,4 +1,5 @@ import { CommandParser, CommandParserResult, yargsParse } from '../../command'; +import { Ok } from '../../helpers/result'; describe('command parser', () => { describe('when called with a single argument', () => { @@ -39,7 +40,7 @@ describe('command parser', () => { result.modsFilter({ name: 'one', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -50,7 +51,7 @@ describe('command parser', () => { result.modsFilter({ name: 'one', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(false); diff --git a/packages/codemods/src/modRunner/tests/filters.test.ts b/packages/codemods/src/modRunner/tests/filters.test.ts index 5824acaed23e85..69270da1ea9c1e 100644 --- a/packages/codemods/src/modRunner/tests/filters.test.ts +++ b/packages/codemods/src/modRunner/tests/filters.test.ts @@ -1,5 +1,6 @@ import { getModFilter, getRegexFilter, getStringFilter } from '../modFilter'; import { Maybe } from '../../helpers/maybe'; +import { Ok } from '../../helpers/result'; describe('modRunner tests', () => { it('gets a basic exact name match filter from string', () => { @@ -21,7 +22,7 @@ describe('modRunner tests', () => { modFilter({ name: 'ohi', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -29,7 +30,7 @@ describe('modRunner tests', () => { modFilter({ name: 'bar', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -37,7 +38,7 @@ describe('modRunner tests', () => { modFilter({ name: 'foo', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -49,7 +50,7 @@ describe('modRunner tests', () => { modFilter({ name: 'hi', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -57,7 +58,7 @@ describe('modRunner tests', () => { modFilter({ name: 'o zz o', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(true); @@ -65,7 +66,7 @@ describe('modRunner tests', () => { modFilter({ name: 'I wont be filtered!', run: () => { - return {}; + return Ok({ logs: [] }); }, }), ).toBe(false); diff --git a/packages/codemods/src/modRunner/tests/mocks/MockMods/CodeMod.mock.ts b/packages/codemods/src/modRunner/tests/mocks/MockMods/CodeMod.mock.ts index 66a6e0ed33ff82..3e1ad8663677d8 100644 --- a/packages/codemods/src/modRunner/tests/mocks/MockMods/CodeMod.mock.ts +++ b/packages/codemods/src/modRunner/tests/mocks/MockMods/CodeMod.mock.ts @@ -1,7 +1,8 @@ import { CodeMod } from '../../../../codeMods/types'; +import { Err } from '../../../../helpers/result'; const CodeMod: CodeMod = { run: () => { - return {}; + return Err({ reason: 'No operation taken' }); }, version: '1.0.0', name: 'CodeMod', diff --git a/packages/codemods/src/modRunner/tests/modRunner.test.ts b/packages/codemods/src/modRunner/tests/modRunner.test.ts index 85512ad77e0d51..89b60b13164c35 100644 --- a/packages/codemods/src/modRunner/tests/modRunner.test.ts +++ b/packages/codemods/src/modRunner/tests/modRunner.test.ts @@ -8,6 +8,7 @@ import { } from '../runnerUtilities'; import { CodeMod, CodeModResult } from '../../codeMods/types'; import { Maybe, Nothing } from '../../helpers/maybe'; +import { Ok } from '../../helpers/result'; describe('modRunner tests', () => { it('gets the appropriate path to mods based on current dir', () => { @@ -40,7 +41,7 @@ describe('modRunner tests', () => { let runCount = 0; const runCallBack = (foo: string): CodeModResult => { runCount = runCount + 1; - return {}; + return Ok({ logs: [] }); }; const mods: CodeMod[] = [ { @@ -65,7 +66,7 @@ describe('modRunner tests', () => { it('filters enabled and nothing Mods', () => { const runcallBack = (foo: string): CodeModResult => { - return {}; + return Ok({ logs: [] }); }; // use a generator to simulate getting each mod back @@ -89,6 +90,7 @@ describe('modRunner tests', () => { const gen = modGen(); const filtered = getEnabledMods( + console, () => ['1', '2', '3', '4'], () => gen.next().value, ); diff --git a/packages/codemods/src/upgrade.ts b/packages/codemods/src/upgrade.ts index 53b07057ef68b9..0bb61d25ecd10c 100644 --- a/packages/codemods/src/upgrade.ts +++ b/packages/codemods/src/upgrade.ts @@ -1,12 +1,13 @@ import { runMods, getTsConfigs, getEnabledMods } from './modRunner/runnerUtilities'; import { CommandParserResult } from './command'; +import { Logger } from './modRunner/logger'; import { Project } from 'ts-morph'; - -// TODO actually do console logging, implement some nice callbacks. +// Injection point for logger so that it can easily be replaced. +const logger: Logger = console; export function upgrade(options: CommandParserResult) { - const mods = getEnabledMods().filter(options.modsFilter); + const mods = getEnabledMods(logger).filter(options.modsFilter); - console.log('getting configs'); + logger.log('getting configs'); const configs = getTsConfigs(); configs.forEach(configString => { @@ -17,14 +18,14 @@ export function upgrade(options: CommandParserResult) { const files = project.getSourceFiles(); runMods(mods, files, result => { if (result.error) { - console.error(`Error running mod ${result.mod.name} on file ${result.file.getBaseName()}`, result.error); + logger.error(`Error running mod ${result.mod.name} on file ${result.file.getBaseName()}`, result.error); error = true; } else { - console.log(`Upgraded file ${result.file.getBaseName()} with mod ${result.mod.name}`); + logger.log(`Upgraded file ${result.file.getBaseName()} with mod ${result.mod.name}`); } }); } catch (e) { - console.error(e); + logger.error(e); error = true; } if (!error) { From 0620a0da25ed3da40e6b092dbd3de69ff2edacd9 Mon Sep 17 00:00:00 2001 From: Makoto Morimoto Date: Mon, 17 Aug 2020 15:05:54 -0700 Subject: [PATCH 3/3] @uifabric/example-app-base: Updating dependencies to resolve security issues (#14543) --- ...2020-08-14-15-05-32-exampleAppBaseDeps.json | 8 ++++++++ packages/example-app-base/package.json | 4 ++-- yarn.lock | 18 +++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 change/@uifabric-example-app-base-2020-08-14-15-05-32-exampleAppBaseDeps.json diff --git a/change/@uifabric-example-app-base-2020-08-14-15-05-32-exampleAppBaseDeps.json b/change/@uifabric-example-app-base-2020-08-14-15-05-32-exampleAppBaseDeps.json new file mode 100644 index 00000000000000..749e657a2d50df --- /dev/null +++ b/change/@uifabric-example-app-base-2020-08-14-15-05-32-exampleAppBaseDeps.json @@ -0,0 +1,8 @@ +{ + "type": "patch", + "comment": "@uifabric/example-app-base: Updating dependencies to resolve security issues.", + "packageName": "@uifabric/example-app-base", + "email": "humbertomakotomorimoto@gmail.com", + "dependentChangeType": "patch", + "date": "2020-08-14T22:05:32.209Z" +} diff --git a/packages/example-app-base/package.json b/packages/example-app-base/package.json index 31a68bf1d11fba..64b70944502666 100644 --- a/packages/example-app-base/package.json +++ b/packages/example-app-base/package.json @@ -24,7 +24,7 @@ "@fluentui/eslint-plugin": "^0.53.4", "@types/color-check": "0.0.0", "@types/jest": "~24.9.0", - "@types/markdown-to-jsx": "6.9.0", + "@types/markdown-to-jsx": "6.11.0", "@types/react": "16.8.25", "@types/react-custom-scrollbars": "^4.0.5", "@types/react-dom": "16.8.4", @@ -48,7 +48,7 @@ "@uifabric/set-version": "^7.0.21", "@uifabric/tsx-editor": "^0.11.129", "color-check": "0.0.2", - "markdown-to-jsx": "6.6.1", + "markdown-to-jsx": "6.11.4", "office-ui-fabric-core": "^11.0.0", "office-ui-fabric-react": "^7.128.1", "react-custom-scrollbars": "^4.2.1", diff --git a/yarn.lock b/yarn.lock index 592a73cc138547..4c73bc69b1e044 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4177,10 +4177,10 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== -"@types/markdown-to-jsx@6.9.0": - version "6.9.0" - resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.9.0.tgz#799fb134f91ffe585dba826f3029101910750de4" - integrity sha512-LO/oxz+ZfwBDciiVGqLhhdyeWt196kgICe0QS88K1a2u/FgUF1QkeMAm4zdnAo1kNgo2KgFP1Uqy2IiPJLWppA== +"@types/markdown-to-jsx@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz#a19e458a9415763859f2c92c4c5b07a80bea8c14" + integrity sha512-OFFHQ3LK+g8lSfwdqjXBbrGFdgH/MYXhzIYSOJ5xapT++eEhRx7wOfY3xxtktVtQyQtsB7Wljs7IDGgKfurm2A== dependencies: "@types/react" "*" @@ -16234,12 +16234,12 @@ markdown-table@^2.0.0: dependencies: repeat-string "^1.0.0" -markdown-to-jsx@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.6.1.tgz#858b37f8a92526b1f3407593ff77c95927720bef" - integrity sha1-hYs3+KklJrHzQHWT/3fJWSdyC+8= +markdown-to-jsx@6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" + integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw== dependencies: - prop-types "^15.5.10" + prop-types "^15.6.2" unquote "^1.1.0" markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3: