diff --git a/jest.config.js b/jest.config.js index b6605f8ccb5..efb756e92da 100644 --- a/jest.config.js +++ b/jest.config.js @@ -10,7 +10,7 @@ module.exports = { }, clearMocks: true, collectCoverage: true, - setupFiles: [path.join(__dirname, '/resources/enzyme.config.js')], + setupFiles: [path.join(__dirname, '/resources/test.config.js')], testMatch: [ '/packages/*/src/**/*-test.{js,ts}', '/packages/*/src/**/*.spec.{js,ts}', diff --git a/packages/graphiql/__mocks__/codemirror.js b/packages/graphiql/__mocks__/codemirror.js new file mode 100644 index 00000000000..6cb083b275b --- /dev/null +++ b/packages/graphiql/__mocks__/codemirror.js @@ -0,0 +1,59 @@ +function CodeMirror(node, { value, ...options }) { + let _eventListeners = {}; + const mockTextArea = document.createElement('textarea'); + mockTextArea.className = 'mockCodeMirror'; + mockTextArea.addEventListener('change', e => { + _emit('change', e); + }); + mockTextArea.value = value; + node.appendChild(mockTextArea); + + function _emit(event, data) { + if (_eventListeners[event]) { + _eventListeners[event](data); + } + } + + return { + options: { + ...options, + }, + + on(event, handler) { + _eventListeners[event] = handler; + }, + + off(event) { + if (_eventListeners.hasOwnProperty(event)) { + const updatedEventListeners = {}; + for (const e in _eventListeners) { + if (e !== event) { + updatedEventListeners[e] = _eventListeners[e]; + } + } + _eventListeners = updatedEventListeners; + } + }, + + getValue() { + return mockTextArea.value; + }, + + setValue(newValue) { + mockTextArea.value = newValue; + }, + + setSize() {}, + + emit: _emit, + }; +} + +CodeMirror.defineExtension = () => {}; +CodeMirror.registerHelper = () => {}; +CodeMirror.defineOption = () => {}; +CodeMirror.signal = (mockCodeMirror, event, ...args) => { + mockCodeMirror.emit(event, ...args); +}; + +module.exports = CodeMirror; diff --git a/packages/graphiql/package.json b/packages/graphiql/package.json index 35d437b7f5d..836d3f74498 100644 --- a/packages/graphiql/package.json +++ b/packages/graphiql/package.json @@ -39,7 +39,7 @@ "cypress-open": "yarn e2e-server 'cypress open'", "e2e": "yarn e2e-server 'cypress run'", "e2e-server": "start-server-and-test 'cross-env PORT=8080 node test/e2e-server' 'http-get://localhost:8080/graphql?query={test { id }}'", - "test": "cross-env ENZYME=true node ../../resources/runTests", + "test": "node ../../resources/runTests", "storybook": "start-storybook" }, "dependencies": { @@ -61,11 +61,11 @@ }, "devDependencies": { "@storybook/react": "^5.2.8", + "@testing-library/jest-dom": "4.2.4", + "@testing-library/react": "9.4.0", "cross-env": "^6.0.3", "css-loader": "3.4.0", "cssnano": "^4.1.10", - "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.15.1", "express": "4.17.1", "express-graphql": "0.9.0", "graphql": "14.5.8", diff --git a/packages/graphiql/src/components/DocExplorer/__tests__/FieldDoc.spec.js b/packages/graphiql/src/components/DocExplorer/__tests__/FieldDoc.spec.js index 06d47809ff4..e4da4bf2f58 100644 --- a/packages/graphiql/src/components/DocExplorer/__tests__/FieldDoc.spec.js +++ b/packages/graphiql/src/components/DocExplorer/__tests__/FieldDoc.spec.js @@ -6,7 +6,8 @@ */ import React from 'react'; -import { mount } from 'enzyme'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; import FieldDoc from '../FieldDoc'; @@ -35,47 +36,58 @@ const exampleObject = new GraphQLObjectType({ describe('FieldDoc', () => { it('should render a simple string field', () => { - const W = mount( + const { container } = render( , ); - expect(W.find('MarkdownContent').text()).toEqual('No Description\n'); - expect(W.find('TypeLink').text()).toEqual('String'); - expect(W.find('Argument').length).toEqual(0); + expect(container.querySelector('.doc-type-description')).toHaveTextContent( + 'No Description', + ); + expect(container.querySelector('.type-name')).toHaveTextContent('String'); + expect(container.querySelector('.arg')).not.toBeInTheDocument(); }); it('should re-render on field change', () => { - const W = mount( + const { container, rerender } = render( , ); - expect(W.find('MarkdownContent').text()).toEqual('No Description\n'); - expect(W.find('TypeLink').text()).toEqual('String'); - expect(W.find('Argument').length).toEqual(0); + expect(container.querySelector('.doc-type-description')).toHaveTextContent( + 'No Description', + ); + expect(container.querySelector('.type-name')).toHaveTextContent('String'); + expect(container.querySelector('.arg')).not.toBeInTheDocument(); + + rerender( + , + ); + expect(container.querySelector('.type-name')).toHaveTextContent('String'); + expect(container.querySelector('.doc-type-description')).toHaveTextContent( + 'Example String field with arguments', + ); }); it('should render a string field with arguments', () => { - const W = mount( + const { container } = render( , ); - expect( - W.find('TypeLink') - .at(0) - .text(), - ).toEqual('String'); - expect( - W.find('.doc-type-description') - .at(0) - .text(), - ).toEqual('Example String field with arguments\n'); - expect(W.find('Argument').length).toEqual(1); - expect(W.find('Argument').text()).toEqual('stringArg: String'); + expect(container.querySelector('.type-name')).toHaveTextContent('String'); + expect(container.querySelector('.doc-type-description')).toHaveTextContent( + 'Example String field with arguments', + ); + expect(container.querySelectorAll('.arg')).toHaveLength(1); + expect(container.querySelector('.arg')).toHaveTextContent( + 'stringArg: String', + ); }); }); diff --git a/packages/graphiql/src/components/DocExplorer/__tests__/TypeDoc.spec.js b/packages/graphiql/src/components/DocExplorer/__tests__/TypeDoc.spec.js index 246546b88f0..da73c6fcab5 100644 --- a/packages/graphiql/src/components/DocExplorer/__tests__/TypeDoc.spec.js +++ b/packages/graphiql/src/components/DocExplorer/__tests__/TypeDoc.spec.js @@ -6,7 +6,8 @@ */ import React from 'react'; -import { mount } from 'enzyme'; +import { render, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; import { GraphQLString } from 'graphql'; @@ -21,17 +22,17 @@ import { describe('TypeDoc', () => { it('renders a top-level query object type', () => { - const W = mount( + const { container } = render( , ); - const cats = W.find('.doc-category-item'); - expect(cats.at(0).text()).toEqual('string: String'); - expect(cats.at(1).text()).toEqual('union: exampleUnion'); - expect(cats.at(2).text()).toEqual( + const cats = container.querySelectorAll('.doc-category-item'); + expect(cats[0]).toHaveTextContent('string: String'); + expect(cats[1]).toHaveTextContent('union: exampleUnion'); + expect(cats[2]).toHaveTextContent( 'fieldWithArgs(stringArg: String): String', ); }); @@ -39,7 +40,7 @@ describe('TypeDoc', () => { it('handles onClickField and onClickType', () => { const onClickType = jest.fn(); const onClickField = jest.fn(); - const W = mount( + const { container } = render( { onClickField={onClickField} />, ); - W.find('TypeLink') - .at(0) - .simulate('click'); + fireEvent.click(container.querySelector('.type-name')); expect(onClickType.mock.calls.length).toEqual(1); expect(onClickType.mock.calls[0][0]).toEqual(GraphQLString); - W.find('.field-name') - .at(0) - .simulate('click'); - + fireEvent.click(container.querySelector('.field-name')); expect(onClickField.mock.calls.length).toEqual(1); expect(onClickField.mock.calls[0][0].name).toEqual('string'); expect(onClickField.mock.calls[0][0].type).toEqual(GraphQLString); @@ -64,72 +60,69 @@ describe('TypeDoc', () => { }); it('renders deprecated fields when you click to see them', () => { - const W = mount( + const { container } = render( , ); - let cats = W.find('.doc-category-item'); - expect(cats.length).toEqual(3); + let cats = container.querySelectorAll('.doc-category-item'); + expect(cats).toHaveLength(3); - W.find('.show-btn').simulate('click'); + fireEvent.click(container.querySelector('.show-btn')); - cats = W.find('.doc-category-item'); - expect(cats.length).toEqual(4); - expect( - W.find('.field-name') - .at(3) - .text(), - ).toEqual('deprecatedField'); - expect( - W.find('.doc-deprecation') - .at(0) - .text(), - ).toEqual('example deprecation reason\n'); + cats = container.querySelectorAll('.doc-category-item'); + expect(cats).toHaveLength(4); + expect(container.querySelectorAll('.field-name')[3]).toHaveTextContent( + 'deprecatedField', + ); + expect(container.querySelector('.doc-deprecation')).toHaveTextContent( + 'example deprecation reason', + ); }); it('renders a Union type', () => { - const W = mount(); - expect( - W.find('.doc-category-title') - .at(0) - .text(), - ).toEqual('possible types'); + const { container } = render( + , + ); + expect(container.querySelector('.doc-category-title')).toHaveTextContent( + 'possible types', + ); }); it('renders an Enum type', () => { - const W = mount(); - expect( - W.find('.doc-category-title') - .at(0) - .text(), - ).toEqual('values'); - const enums = W.find('EnumValue'); - expect(enums.at(0).props().value.value).toEqual('Value 1'); - expect(enums.at(1).props().value.value).toEqual('Value 2'); + const { container } = render( + , + ); + expect(container.querySelector('.doc-category-title')).toHaveTextContent( + 'values', + ); + const enums = container.querySelectorAll('.enum-value'); + expect(enums[0]).toHaveTextContent('value1'); + expect(enums[1]).toHaveTextContent('value2'); }); it('shows deprecated enum values on click', () => { - const W = mount(); - expect(W.state().showDeprecated).toEqual(false); - const titles = W.find('.doc-category-title'); - expect(titles.at(0).text()).toEqual('values'); - expect(titles.at(1).text()).toEqual('deprecated values'); - let enums = W.find('EnumValue'); - expect(enums.length).toEqual(2); + const { getByText, container } = render( + , + ); + const showBtn = getByText('Show deprecated values...'); + expect(showBtn).toBeInTheDocument(); + const titles = container.querySelectorAll('.doc-category-title'); + expect(titles[0]).toHaveTextContent('values'); + expect(titles[1]).toHaveTextContent('deprecated values'); + let enums = container.querySelectorAll('.enum-value'); + expect(enums).toHaveLength(2); // click button to show deprecated enum values - W.find('.show-btn').simulate('click'); - expect(W.state().showDeprecated).toEqual(true); - enums = W.find('EnumValue'); - expect(enums.length).toEqual(3); - expect(enums.at(2).props().value.value).toEqual('Value 3'); - expect( - W.find('.doc-deprecation') - .at(1) - .text(), - ).toEqual('Only two are needed\n'); + fireEvent.click(showBtn); + expect(showBtn).not.toBeInTheDocument(); + enums = container.querySelectorAll('.enum-value'); + expect(enums).toHaveLength(3); + expect(enums[2]).toHaveTextContent('value3'); + expect(container.querySelector('.doc-deprecation')).toHaveTextContent( + 'Only two are needed', + ); }); }); diff --git a/packages/graphiql/src/components/DocExplorer/__tests__/TypeLink.spec.js b/packages/graphiql/src/components/DocExplorer/__tests__/TypeLink.spec.js index cc7ed64e522..36d4613d97e 100644 --- a/packages/graphiql/src/components/DocExplorer/__tests__/TypeLink.spec.js +++ b/packages/graphiql/src/components/DocExplorer/__tests__/TypeLink.spec.js @@ -6,7 +6,8 @@ */ import React from 'react'; -import { mount } from 'enzyme'; +import { render, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; import TypeLink from '../TypeLink'; @@ -17,32 +18,32 @@ const listType = new GraphQLList(GraphQLString); describe('TypeLink', () => { it('should render a string', () => { - const instance = mount(); - expect(instance.text()).toEqual('String'); - expect(instance.find('a').length).toEqual(1); - expect(instance.find('a').hasClass('type-name')).toEqual(true); + const { container } = render(); + expect(container).toHaveTextContent('String'); + expect(container.querySelectorAll('a')).toHaveLength(1); + expect(container.querySelector('a')).toHaveClass('type-name'); }); it('should render a nonnull type', () => { - const instance = mount(); - expect(instance.text()).toEqual('String!'); - expect(instance.find('span').length).toEqual(1); + const { container } = render(); + expect(container).toHaveTextContent('String!'); + expect(container.querySelectorAll('span')).toHaveLength(1); }); it('should render a list type', () => { - const instance = mount(); - expect(instance.text()).toEqual('[String]'); - expect(instance.find('span').length).toEqual(1); + const { container } = render(); + expect(container).toHaveTextContent('[String]'); + expect(container.querySelectorAll('span')).toHaveLength(1); }); it('should handle a click event', () => { const op = jest.fn(); - const instance = mount(); - instance.find('a').simulate('click'); + const { container } = render(); + fireEvent.click(container.querySelector('a')); expect(op.mock.calls.length).toEqual(1); expect(op.mock.calls[0][0]).toEqual(GraphQLString); }); it('should re-render on type change', () => { - const instance = mount(); - expect(instance.text()).toEqual('[String]'); - instance.setProps({ type: GraphQLString }); - expect(instance.text()).toEqual('String'); + const { container, rerender } = render(); + expect(container).toHaveTextContent('[String]'); + rerender(); + expect(container).toHaveTextContent('String'); }); }); diff --git a/packages/graphiql/src/components/__tests__/DocExplorer.spec.js b/packages/graphiql/src/components/__tests__/DocExplorer.spec.js index 79dc107a4af..7bf76c93562 100644 --- a/packages/graphiql/src/components/__tests__/DocExplorer.spec.js +++ b/packages/graphiql/src/components/__tests__/DocExplorer.spec.js @@ -5,19 +5,20 @@ * LICENSE file in the root directory of this source tree. */ import React from 'react'; -import { mount } from 'enzyme'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; import { DocExplorer } from '../DocExplorer'; describe('DocExplorer', () => { it('renders spinner when no schema prop is present', () => { - const W = mount(); - const spinner = W.find('.spinner-container'); - expect(spinner.length).toEqual(1); + const { container } = render(); + const spinner = container.querySelectorAll('.spinner-container'); + expect(spinner).toHaveLength(1); }); it('renders with null schema', () => { - const W = mount(); - const error = W.find('.error-container'); - expect(error.length).toEqual(1); - expect(error.text()).toEqual('No Schema Available'); + const { container } = render(); + const error = container.querySelectorAll('.error-container'); + expect(error).toHaveLength(1); + expect(error[0]).toHaveTextContent('No Schema Available'); }); }); diff --git a/packages/graphiql/src/components/__tests__/GraphiQL.spec.js b/packages/graphiql/src/components/__tests__/GraphiQL.spec.js index 64bff28ce8e..f45554daa8c 100644 --- a/packages/graphiql/src/components/__tests__/GraphiQL.spec.js +++ b/packages/graphiql/src/components/__tests__/GraphiQL.spec.js @@ -5,12 +5,22 @@ * LICENSE file in the root directory of this source tree. */ import React from 'react'; -import { mount } from 'enzyme'; +import { render, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; import { GraphiQL } from '../GraphiQL'; import { getMockStorage } from './helpers/storage'; -import HistoryQuery from '../HistoryQuery'; -import { mockQuery1, mockVariables1, mockOperationName1 } from './fixtures'; +import { codeMirrorModules } from './helpers/codeMirror'; +import { + mockQuery1, + mockVariables1, + mockOperationName1, + mockBadQuery, + mockQuery2, + mockVariables2, +} from './fixtures'; + +codeMirrorModules.forEach(m => jest.mock(m, () => {})); // The smallest possible introspection result that builds a schema. const simpleIntrospection = { @@ -36,23 +46,30 @@ const wait = () => .then(() => Promise.resolve()) .then(() => Promise.resolve()); +const waitTime = timeout => + new Promise(resolve => setTimeout(resolve, timeout)); + Object.defineProperty(window, 'localStorage', { value: getMockStorage(), }); +beforeEach(() => { + window.localStorage.clear(); +}); + describe('GraphiQL', () => { const noOpFetcher = () => {}; it('should throw error without fetcher', () => { - expect(() => - mount().simulateError( - Error('GraphiQL requires a fetcher function'), - ), + const spy = jest.spyOn(console, 'error').mockImplementation(() => {}); + expect(() => render()).toThrowError( + 'GraphiQL requires a fetcher function', ); + spy.mockRestore(); }); it('should construct correctly with fetcher', () => { - expect(() => mount()).not.toThrow(); + expect(() => render()).not.toThrow(); }); it('should refetch schema with new fetcher', async () => { @@ -69,88 +86,199 @@ describe('GraphiQL', () => { } // Initial render calls fetcher - const instance = mount(); + const { rerender } = render(); expect(firstCalled).toEqual(true); await wait(); // Re-render does not call fetcher again firstCalled = false; - instance.setProps({ fetcher: firstFetcher }); + rerender(); expect(firstCalled).toEqual(false); await wait(); // Re-render with new fetcher is called. - instance.setProps({ fetcher: secondFetcher }); + rerender(); expect(secondCalled).toEqual(true); }); it('should not throw error if schema missing and query provided', () => { expect(() => - mount(), + render(), ).not.toThrow(); }); it('defaults to the built-in default query', () => { - const graphiQL = mount(); - expect(graphiQL.state().query).toContain('# Welcome to GraphiQL'); + const { container } = render(); + expect( + container.querySelector('.query-editor .mockCodeMirror').value, + ).toContain('# Welcome to GraphiQL'); }); it('accepts a custom default query', () => { - const graphiQL = mount( + const { container } = render( , ); - expect(graphiQL.state().query).toEqual('GraphQL Party!!'); + expect( + container.querySelector('.query-editor .mockCodeMirror'), + ).toHaveValue('GraphQL Party!!'); }); it('accepts a docExplorerOpen prop', () => { - const graphiQL = mount(); - expect(graphiQL.state().docExplorerOpen).toEqual(true); + const { container } = render( + , + ); + expect(container.querySelector('.docExplorerWrap')).toBeInTheDocument(); }); it('defaults to closed docExplorer', () => { - const graphiQL = mount(); - expect(graphiQL.state().docExplorerOpen).toEqual(false); + const { container } = render(); + expect(container.querySelector('.docExplorerWrap')).not.toBeInTheDocument(); }); it('accepts a defaultVariableEditorOpen param', () => { - let graphiQL = mount(); - expect(graphiQL.state().variableEditorOpen).toEqual(false); - expect(graphiQL.state().defaultVariableEditorOpen).toEqual(undefined); + const { container: container1 } = render( + , + ); + const queryVariables = container1.querySelector( + '[aria-label="Query Variables"]', + ); - graphiQL = mount( + expect(queryVariables.style.height).toEqual(''); + + const variableEditorTitle = container1.querySelector( + '#variable-editor-title', + ); + fireEvent.mouseDown(variableEditorTitle); + fireEvent.mouseMove(variableEditorTitle); + expect(queryVariables.style.height).toEqual('200px'); + + const { container: container2 } = render( , ); - expect(graphiQL.state().variableEditorOpen).toEqual(true); + expect( + container2.querySelector('[aria-label="Query Variables"]').style.height, + ).toEqual('200px'); - graphiQL = mount( + const { container: container3 } = render( , ); - expect(graphiQL.state().variableEditorOpen).toEqual(false); + const queryVariables3 = container3.querySelector( + '[aria-label="Query Variables"]', + ); + expect(queryVariables3.style.height).toEqual(''); }); it('adds a history item when the execute query function button is clicked', () => { - const W = mount(); - W.setState({ - query: mockQuery1, - variables: mockVariables1, - operationName: mockOperationName1, - }); - W.find('button.execute-button') - .first() - .simulate('click'); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); + const { getByTitle, container } = render( + , + ); + fireEvent.click(getByTitle('Execute Query (Ctrl-Enter)')); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(1); + }); + + it('will not save invalid queries', () => { + const { getByTitle, container } = render( + , + ); + fireEvent.click(getByTitle('Execute Query (Ctrl-Enter)')); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(0); + }); + + it('will save if there was not a previously saved query', () => { + const { getByTitle, container } = render( + , + ); + fireEvent.click(getByTitle('Execute Query (Ctrl-Enter)')); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(1); + }); + + it('will not save a query if the query is the same as previous query', () => { + const { getByTitle, container } = render( + , + ); + fireEvent.click(getByTitle('Execute Query (Ctrl-Enter)')); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(1); + fireEvent.click(getByTitle('Execute Query (Ctrl-Enter)')); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(1); + }); + + it('will save if new query is different than previous query', async () => { + const { getByTitle, container } = render( + , + ); + const executeQueryButton = getByTitle('Execute Query (Ctrl-Enter)'); + fireEvent.click(executeQueryButton); + expect(container.querySelectorAll('.history-contents li')).toHaveLength(1); + + fireEvent.change( + container.querySelector('[aria-label="Query Editor"] .mockCodeMirror'), + { + target: { value: mockQuery2 }, + }, + ); + + // wait for onChange debounce + await waitTime(150); + + fireEvent.click(executeQueryButton); + expect(container.querySelectorAll('.history-label')).toHaveLength(2); + }); + + it('will save query if variables are different ', () => { + const { getByTitle, container } = render( + , + ); + const executeQueryButton = getByTitle('Execute Query (Ctrl-Enter)'); + fireEvent.click(executeQueryButton); + expect(container.querySelectorAll('.history-label')).toHaveLength(1); + + fireEvent.change( + container.querySelector('[aria-label="Query Variables"] .mockCodeMirror'), + { + target: { value: mockVariables2 }, + }, + ); + + fireEvent.click(executeQueryButton); + expect(container.querySelectorAll('.history-label')).toHaveLength(2); }); describe('children overrides', () => { const MyFunctionalComponent = () => { return null; }; - const wrap = component => () =>
{component}
; + const wrap = component => () => ( +
{component}
+ ); it('properly ignores fragments', () => { const myFragment = ( @@ -160,25 +288,29 @@ describe('GraphiQL', () => { ); - const graphiQL = mount( + const { container, getByRole } = render( {myFragment}, ); - expect(graphiQL.exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Logo).exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Toolbar).exists()).toEqual(true); + expect( + container.querySelector('.graphiql-container'), + ).toBeInTheDocument(); + expect(container.querySelector('.title')).toBeInTheDocument(); + expect(getByRole('toolbar')).toBeInTheDocument(); }); it('properly ignores non-override children components', () => { - const graphiQL = mount( + const { container, getByRole } = render( , ); - expect(graphiQL.exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Logo).exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Toolbar).exists()).toEqual(true); + expect( + container.querySelector('.graphiql-container'), + ).toBeInTheDocument(); + expect(container.querySelector('.title')).toBeInTheDocument(); + expect(getByRole('toolbar')).toBeInTheDocument(); }); it('properly ignores non-override class components', () => { @@ -188,100 +320,95 @@ describe('GraphiQL', () => { } } - const graphiQL = mount( + const { container, getByRole } = render( , ); - expect(graphiQL.exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Logo).exists()).toEqual(true); - expect(graphiQL.find(GraphiQL.Toolbar).exists()).toEqual(true); + expect( + container.querySelector('.graphiql-container'), + ).toBeInTheDocument(); + expect(container.querySelector('.title')).toBeInTheDocument(); + expect(getByRole('toolbar')).toBeInTheDocument(); }); describe('GraphiQL.Logo', () => { it('can be overridden using the exported type', () => { - const graphiQL = mount( - + const { container } = render( + {'My Great Logo'} , ); expect( - graphiQL.find({ 'data-test-selector': 'override-logo' }).exists(), - ).toEqual(true); + container.querySelector('.graphiql-container'), + ).toBeInTheDocument(); }); it('can be overridden using a named component', () => { const WrappedLogo = wrap( - - {'My Great Logo'} - , + {'My Great Logo'}, ); WrappedLogo.displayName = 'GraphiQLLogo'; - const graphiQL = mount( + const { getByText } = render( , ); - expect(graphiQL.find(WrappedLogo).exists()).toEqual(true); - expect( - graphiQL.find({ 'data-test-selector': 'override-logo' }).exists(), - ).toEqual(true); + expect(getByText('My Great Logo')).toBeInTheDocument(); }); }); describe('GraphiQL.Toolbar', () => { it('can be overridden using the exported type', () => { - const graphiQL = mount( + const { container } = render( - + , ); expect( - graphiQL.find({ 'data-test-selector': 'override-toolbar' }).exists(), - ).toEqual(true); + container.querySelectorAll('[role="toolbar"] .toolbar-button'), + ).toHaveLength(1); }); it('can be overridden using a named component', () => { const WrappedToolbar = wrap( - + , ); WrappedToolbar.displayName = 'GraphiQLToolbar'; - const graphiQL = mount( + const { container } = render( , ); - expect(graphiQL.find(WrappedToolbar).exists()).toEqual(true); + expect(container.querySelector('.test-wrapper')).toBeInTheDocument(); expect( - graphiQL.find({ 'data-test-selector': 'override-toolbar' }).exists(), - ).toEqual(true); + container.querySelectorAll('[role="toolbar"] button'), + ).toHaveLength(1); }); }); describe('GraphiQL.Footer', () => { it('can be overridden using the exported type', () => { - const graphiQL = mount( + const { container } = render( - + , ); - expect( - graphiQL.find({ 'data-test-selector': 'override-footer' }).exists(), - ).toEqual(true); + expect(container.querySelectorAll('.footer button')).toHaveLength(1); }); it('can be overridden using a named component', () => { @@ -292,16 +419,14 @@ describe('GraphiQL', () => { ); WrappedFooter.displayName = 'GraphiQLFooter'; - const graphiQL = mount( + const { container } = render( , ); - expect(graphiQL.find(WrappedFooter).exists()).toEqual(true); - expect( - graphiQL.find({ 'data-test-selector': 'override-footer' }).exists(), - ).toEqual(true); + expect(container.querySelector('.test-wrapper')).toBeInTheDocument(); + expect(container.querySelectorAll('.footer button')).toHaveLength(1); }); }); }); diff --git a/packages/graphiql/src/components/__tests__/HistoryQuery.spec.js b/packages/graphiql/src/components/__tests__/HistoryQuery.spec.js index 09d6a2b6049..e710eaf9fa8 100644 --- a/packages/graphiql/src/components/__tests__/HistoryQuery.spec.js +++ b/packages/graphiql/src/components/__tests__/HistoryQuery.spec.js @@ -5,7 +5,8 @@ * LICENSE file in the root directory of this source tree. */ import React from 'react'; -import { mount } from 'enzyme'; +import { render, fireEvent } from '@testing-library/react'; + import HistoryQuery from '../HistoryQuery'; import { mockOperationName1, mockQuery1, mockVariables1 } from './fixtures'; @@ -31,21 +32,15 @@ describe('HistoryQuery', () => { it('renders operationName if label is not provided', () => { const otherMockProps = { operationName: mockOperationName1 }; const props = getMockProps(otherMockProps); - const W = mount(); - expect( - W.find('button.history-label') - .first() - .text(), - ).toBe(mockOperationName1); + const { container } = render(); + expect(container.querySelector('button.history-label').textContent).toBe( + mockOperationName1, + ); }); it('renders a string version of the query if label or operation name are not provided', () => { - const W = mount(); - expect( - W.find('button.history-label') - .first() - .text(), - ).toBe( + const { container } = render(); + expect(container.querySelector('button.history-label').textContent).toBe( mockQuery1 .split('\n') .filter(line => line.indexOf('#') !== 0) @@ -58,9 +53,10 @@ describe('HistoryQuery', () => { const otherMockProps = { operationName: mockOperationName1, }; - const W = mount(); - W.find('button.history-label').simulate('click'); - W.update(); + const { container } = render( + , + ); + fireEvent.click(container.querySelector('button.history-label')); expect(onSelectSpy).toHaveBeenCalledWith( mockQuery1, mockVariables1, @@ -70,13 +66,10 @@ describe('HistoryQuery', () => { }); it('renders label input if the edit label button is clicked', () => { - const W = mount(); - W.find({ 'aria-label': 'Edit label' }) - .first() - .simulate('click'); - W.update(); - expect(W.find('li.editable').length).toBe(1); - expect(W.find('input').length).toBe(1); - expect(W.find('button.history-label').length).toBe(0); + const { container } = render(); + fireEvent.click(container.querySelector('[aria-label="Edit label"]')); + expect(container.querySelectorAll('li.editable').length).toBe(1); + expect(container.querySelectorAll('input').length).toBe(1); + expect(container.querySelectorAll('button.history-label').length).toBe(0); }); }); diff --git a/packages/graphiql/src/components/__tests__/QueryHistory.spec.js b/packages/graphiql/src/components/__tests__/QueryHistory.spec.js deleted file mode 100644 index 49091520e59..00000000000 --- a/packages/graphiql/src/components/__tests__/QueryHistory.spec.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2019 GraphQL Contributors. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -import React from 'react'; -import { mount } from 'enzyme'; - -import { QueryHistory } from '../QueryHistory'; -import HistoryQuery from '../HistoryQuery'; -import { getMockStorage } from './helpers/storage'; -import { - mockBadQuery, - mockQuery1, - mockQuery2, - mockVariables1, - mockVariables2, - mockOperationName1, - mockOperationName2, -} from './fixtures'; - -function getMockProps(customProps) { - return { - query: mockQuery1, - variables: mockVariables1, - operationName: mockOperationName1, - queryID: 1, - onSelectQuery: () => {}, - storage: getMockStorage(), - ...customProps, - }; -} - -describe('QueryHistory', () => { - it('will not save invalid queries', () => { - const W = mount(); - const instance = W.instance(); - instance.updateHistory(mockBadQuery); - W.update(); - expect(W.find(HistoryQuery).length).toBe(0); - }); - - it('will save if there was not a previously saved query', () => { - const W = mount(); - const instance = W.instance(); - instance.updateHistory(mockQuery1, mockVariables1, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); - }); - - it('will not save a query if the query is the same as previous query', () => { - const W = mount(); - const instance = W.instance(); - instance.updateHistory(mockQuery1, mockVariables1, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); - instance.updateHistory(mockQuery1, mockVariables1, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); - }); - - it('will save if new query is different than previous query', () => { - const W = mount(); - const instance = W.instance(); - instance.updateHistory(mockQuery1, mockVariables1, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); - instance.updateHistory(mockQuery2, undefined, mockOperationName2); - W.update(); - expect(W.find(HistoryQuery).length).toBe(2); - }); - - it('will save query if variables are different ', () => { - const W = mount(); - const instance = W.instance(); - instance.updateHistory(mockQuery1, mockVariables1, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(1); - instance.updateHistory(mockQuery1, mockVariables2, mockOperationName1); - W.update(); - expect(W.find(HistoryQuery).length).toBe(2); - }); -}); diff --git a/packages/graphiql/src/components/__tests__/helpers/codeMirror.js b/packages/graphiql/src/components/__tests__/helpers/codeMirror.js new file mode 100644 index 00000000000..68a406f8e51 --- /dev/null +++ b/packages/graphiql/src/components/__tests__/helpers/codeMirror.js @@ -0,0 +1,23 @@ +export const codeMirrorModules = [ + 'codemirror/addon/hint/show-hint', + 'codemirror/addon/comment/comment', + 'codemirror/addon/edit/matchbrackets', + 'codemirror/addon/edit/closebrackets', + 'codemirror/addon/fold/foldgutter', + 'codemirror/addon/fold/brace-fold', + 'codemirror/addon/search/search', + 'codemirror/addon/search/searchcursor', + 'codemirror/addon/search/jump-to-line', + 'codemirror/addon/dialog/dialog', + 'codemirror/addon/lint/lint', + 'codemirror/keymap/sublime', + 'codemirror-graphql/hint', + 'codemirror-graphql/lint', + 'codemirror-graphql/info', + 'codemirror-graphql/jump', + 'codemirror-graphql/mode', + 'codemirror-graphql/results/mode', + 'codemirror-graphql/variables/hint', + 'codemirror-graphql/variables/lint', + 'codemirror-graphql/variables/mode', +]; diff --git a/packages/graphiql/src/components/__tests__/helpers/storage.js b/packages/graphiql/src/components/__tests__/helpers/storage.js index 00fee65e2bb..3a67d08c384 100644 --- a/packages/graphiql/src/components/__tests__/helpers/storage.js +++ b/packages/graphiql/src/components/__tests__/helpers/storage.js @@ -1,22 +1,25 @@ export function getMockStorage() { - return (function() { - let store = {}; - return { - getItem(key) { - return store.hasOwnProperty(key) ? store[key] : null; - }, - setItem(key, value) { - store[key] = value.toString(); - }, - clear() { - store = {}; - }, - get(key) { - return store.hasOwnProperty(key) ? store[key] : null; - }, - set(key, value) { - store[key] = value.toString(); - }, - }; - })(); + let store = {}; + return { + getItem(key) { + return store.hasOwnProperty(key) ? store[key] : null; + }, + setItem(key, value) { + store[key] = value.toString(); + }, + clear() { + store = {}; + }, + removeItem(key) { + if (store.hasOwnProperty(key)) { + const updatedStore = {}; + for (const k in store) { + if (k !== key) { + updatedStore[k] = store[k]; + } + } + store = updatedStore; + } + }, + }; } diff --git a/resources/enzyme.config.js b/resources/test.config.js similarity index 87% rename from resources/enzyme.config.js rename to resources/test.config.js index 9fd795c78fa..74e6066a924 100644 --- a/resources/enzyme.config.js +++ b/resources/test.config.js @@ -10,12 +10,6 @@ require('@babel/polyfill', { rootMode: 'upward', }); -// if (process.env.ENZYME) { -const { configure } = require('enzyme'); -const Adapter = require('enzyme-adapter-react-16'); -configure({ adapter: new Adapter() }); -// } - global.window = jsdom.window; global.document = jsdom.window.document; diff --git a/yarn.lock b/yarn.lock index b3eacef4248..0afa596f425 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1030,7 +1030,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6": version "7.7.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf" integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA== @@ -2391,6 +2391,11 @@ dependencies: any-observable "^0.3.0" +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" + integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== + "@storybook/addons@5.2.8": version "5.2.8" resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.2.8.tgz#f8bf8bd555b7a69fb1e9a52ab8cdb96384d931ff" @@ -2797,6 +2802,42 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" +"@testing-library/dom@^6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.11.0.tgz#962a38f1a721fdb7c9e35e7579e33ff13a00eda4" + integrity sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew== + dependencies: + "@babel/runtime" "^7.6.2" + "@sheerun/mutationobserver-shim" "^0.3.2" + "@types/testing-library__dom" "^6.0.0" + aria-query "3.0.0" + pretty-format "^24.9.0" + wait-for-expect "^3.0.0" + +"@testing-library/jest-dom@4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" + integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== + dependencies: + "@babel/runtime" "^7.5.1" + chalk "^2.4.1" + css "^2.2.3" + css.escape "^1.5.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + lodash "^4.17.11" + pretty-format "^24.0.0" + redent "^3.0.0" + +"@testing-library/react@9.4.0": + version "9.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.4.0.tgz#b021ac8cb987c8dc54c6841875f745bf9b2e88e5" + integrity sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg== + dependencies: + "@babel/runtime" "^7.7.6" + "@testing-library/dom" "^6.11.0" + "@types/testing-library__react" "^9.1.2" + "@types/babel__core@^7.1.0": version "7.1.3" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" @@ -2934,6 +2975,13 @@ "@types/history" "*" "@types/react" "*" +"@types/react-dom@*": + version "16.9.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df" + integrity sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw== + dependencies: + "@types/react" "*" + "@types/react-syntax-highlighter@10.1.0": version "10.1.0" resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-10.1.0.tgz#9c534e29bbe05dba9beae1234f3ae944836685d4" @@ -2949,9 +2997,9 @@ "@types/react" "*" "@types/react@*": - version "16.9.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.17.tgz#58f0cc0e9ec2425d1441dd7b623421a867aa253e" - integrity sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg== + version "16.9.16" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.16.tgz#4f12515707148b1f53a8eaa4341dae5dfefb066d" + integrity sha512-dQ3wlehuBbYlfvRXfF5G+5TbZF3xqgkikK7DWAsQXe2KnzV+kjD4W2ea+ThCrKASZn9h98bjjPzoTYzfRqyBkw== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -2971,6 +3019,21 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.11.0.tgz#777e3ef44cb48f2430e3fad6a2053ec39004a5d3" + integrity sha512-qUmnGl6H0wajUaO3VCJJoAeN/bQwpUzCqE/hk96NiGjIh5H4b8LfmQTOj4cHfS/9hCwO0DJytC6osHYDYiouyA== + dependencies: + pretty-format "^24.3.0" + +"@types/testing-library__react@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351" + integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q== + dependencies: + "@types/react-dom" "*" + "@types/testing-library__dom" "*" + "@types/webpack-env@^1.13.7": version "1.14.1" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.14.1.tgz#0d8a53f308f017c53a5ddc3d07f4d6fa76b790d7" @@ -3298,22 +3361,6 @@ agentkeepalive@^3.4.1: string.prototype.padstart "^3.0.0" symbol.prototype.description "^1.0.0" -airbnb-prop-types@^2.15.0: - version "2.15.0" - resolved "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" - integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== - dependencies: - array.prototype.find "^2.1.0" - function.prototype.name "^1.1.1" - has "^1.0.3" - is-regex "^1.0.4" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.1.0" - prop-types "^15.7.2" - prop-types-exact "^1.2.0" - react-is "^16.9.0" - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -3525,6 +3572,14 @@ argv@^0.0.2: resolved "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= +aria-query@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -3557,11 +3612,6 @@ array-equal@^1.0.0: resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -3612,14 +3662,6 @@ array-unique@^0.3.2: resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.find@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" - integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.13.0" - array.prototype.flat@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" @@ -3697,6 +3739,11 @@ assign-symbols@^1.0.0: resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + ast-types@0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" @@ -4820,18 +4867,6 @@ check-types@^8.0.3: resolved "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.3" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -5707,7 +5742,7 @@ css-select-base-adapter@^0.1.1: resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== -css-select@^1.1.0, css-select@~1.2.0: +css-select@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -5750,6 +5785,21 @@ css-what@^3.2.1: resolved "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -6236,11 +6286,6 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -discontinuous-range@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" - integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= - dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -6298,14 +6343,6 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -6316,7 +6353,7 @@ domain-browser@^1.1.1: resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: +domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -6523,7 +6560,7 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" -entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: +entities@^1.1.1, entities@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -6538,68 +6575,6 @@ env-paths@^1.0.0: resolved "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= -enzyme-adapter-react-16@^1.15.1: - version "1.15.1" - resolved "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz#8ad55332be7091dc53a25d7d38b3485fc2ba50d5" - integrity sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA== - dependencies: - enzyme-adapter-utils "^1.12.1" - enzyme-shallow-equal "^1.0.0" - has "^1.0.3" - object.assign "^4.1.0" - object.values "^1.1.0" - prop-types "^15.7.2" - react-is "^16.10.2" - react-test-renderer "^16.0.0-0" - semver "^5.7.0" - -enzyme-adapter-utils@^1.12.1: - version "1.12.1" - resolved "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz#e828e0d038e2b1efa4b9619ce896226f85c9dd88" - integrity sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g== - dependencies: - airbnb-prop-types "^2.15.0" - function.prototype.name "^1.1.1" - object.assign "^4.1.0" - object.fromentries "^2.0.1" - prop-types "^15.7.2" - semver "^5.7.0" - -enzyme-shallow-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz#d8e4603495e6ea279038eef05a4bf4887b55dc69" - integrity sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ== - dependencies: - has "^1.0.3" - object-is "^1.0.1" - -enzyme@^3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" - integrity sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg== - dependencies: - array.prototype.flat "^1.2.1" - cheerio "^1.0.0-rc.2" - function.prototype.name "^1.1.0" - has "^1.0.3" - html-element-map "^1.0.0" - is-boolean-object "^1.0.0" - is-callable "^1.1.4" - is-number-object "^1.0.3" - is-regex "^1.0.4" - is-string "^1.0.4" - is-subset "^0.1.1" - lodash.escape "^4.0.1" - lodash.isequal "^4.5.0" - object-inspect "^1.6.0" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.0.4" - object.values "^1.0.4" - raf "^3.4.0" - rst-selector-parser "^2.2.3" - string.prototype.trim "^1.1.2" - err-code@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -6619,7 +6594,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.16.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161" integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw== @@ -6635,6 +6610,23 @@ es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15 string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" +es-abstract@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1: version "1.17.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172" @@ -7777,25 +7769,24 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" - integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== +function.prototype.name@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" + integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" - functions-have-names "^1.1.1" - is-callable "^1.1.4" + es-abstract "^1.17.0-next.1" + functions-have-names "^1.2.0" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -functions-have-names@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz#79d35927f07b8e7103d819fed475b64ccf7225ea" - integrity sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw== +functions-have-names@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" + integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== fuse.js@^3.4.4: version "3.4.6" @@ -8478,13 +8469,6 @@ html-comment-regex@^1.1.0: resolved "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -html-element-map@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/html-element-map/-/html-element-map-1.1.0.tgz#e5aab9a834caf883b421f8bd9eaedcaac887d63c" - integrity sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA== - dependencies: - array-filter "^1.0.0" - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -8548,7 +8532,7 @@ html-webpack-plugin@^4.0.0-beta.2: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -8800,6 +8784,11 @@ indent-string@^3.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -8917,6 +8906,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + interpret@1.2.0, interpret@^1.0.0, interpret@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" @@ -9026,11 +9024,6 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= - is-buffer@^1.0.2, is-buffer@^1.1.0, is-buffer@^1.1.3, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -9046,6 +9039,11 @@ is-callable@^1.1.4: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + is-ci@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" @@ -9226,11 +9224,6 @@ is-map@^2.0.0: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= - is-number@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -9334,6 +9327,13 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -9379,14 +9379,9 @@ is-stream@^2.0.0: integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== is-svg@^3.0.0: version "3.0.0" @@ -9613,7 +9608,7 @@ jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.3.0, jest-diff@^24.9.0: +jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -9723,7 +9718,7 @@ jest-leak-detector@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" -jest-matcher-utils@^24.9.0: +jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== @@ -10511,16 +10506,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.escape@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -10536,11 +10521,6 @@ lodash.isarray@^3.0.0: resolved "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -10610,7 +10590,7 @@ lodash@4.17.14: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@4.17.15, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1: +lodash@4.17.15, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1: version "4.17.15" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -11094,6 +11074,11 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +min-indent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" + integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + mini-css-extract-plugin@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0" @@ -11271,11 +11256,6 @@ moment@2.24.0: resolved "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== -moo@^0.4.3: - version "0.4.3" - resolved "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" - integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== - move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -11372,17 +11352,6 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nearley@^2.7.10: - version "2.19.0" - resolved "https://registry.npmjs.org/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" - integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== - dependencies: - commander "^2.19.0" - moo "^0.4.3" - railroad-diagrams "^1.0.0" - randexp "0.4.6" - semver "^5.4.1" - needle@^2.2.1: version "2.4.0" resolved "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -11746,7 +11715,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.6.0, object-inspect@^1.7.0: +object-inspect@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== @@ -11778,7 +11747,7 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.0.4, object.entries@^1.1.0: +object.entries@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== @@ -11831,7 +11800,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4, object.values@^1.1.0: +object.values@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== @@ -12242,14 +12211,7 @@ parse5@5.1.0: resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" - -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.1, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -13165,7 +13127,7 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^24.9.0: +pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -13262,15 +13224,6 @@ promzard@^0.3.0: dependencies: read "1" -prop-types-exact@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" - integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== - dependencies: - has "^1.0.3" - object.assign "^4.1.0" - reflect.ownkeys "^0.2.0" - prop-types@15.7.2, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -13434,18 +13387,6 @@ quick-lru@^1.0.0: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= -raf@^3.4.0: - version "3.4.1" - resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -railroad-diagrams@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" - integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= - ramda@0.24.1: version "0.24.1" resolved "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" @@ -13456,14 +13397,6 @@ ramda@^0.21.0: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= -randexp@0.4.6: - version "0.4.6" - resolved "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" - integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== - dependencies: - discontinuous-range "1.0.0" - ret "~0.1.10" - randomatic@^3.0.0: version "3.1.1" resolved "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -13657,7 +13590,7 @@ react-hotkeys@2.0.0-pre4: dependencies: prop-types "^15.6.1" -react-is@^16.10.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.12.0" resolved "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -13709,7 +13642,7 @@ react-syntax-highlighter@^8.0.1: prismjs "^1.8.4" refractor "^2.4.1" -react-test-renderer@^16.0.0-0, react-test-renderer@^16.12.0: +react-test-renderer@^16.12.0: version "16.12.0" resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w== @@ -13945,10 +13878,13 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" -reflect.ownkeys@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" - integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" refractor@^2.4.1: version "2.10.0" @@ -14020,6 +13956,14 @@ regexp.prototype.flags@^1.2.0: dependencies: define-properties "^1.1.2" +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -14335,6 +14279,19 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +router@~1.3.0: + version "1.3.3" + resolved "https://registry.npmjs.org/router/-/router-1.3.3.tgz#c142f6b5ea4d6b3359022ca95b6580bd217f89cf" + integrity sha1-wUL2tepNazNZAiypW2WAvSF/ic8= + dependencies: + array-flatten "2.1.1" + debug "2.6.9" + methods "~1.1.2" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + setprototypeof "1.1.0" + utils-merge "1.0.1" + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -14722,6 +14679,14 @@ shellwords@^0.1.1: resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -14883,7 +14848,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-resolve@^0.5.0: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== @@ -15170,14 +15135,16 @@ string-width@^4.1.0: strip-ansi "^6.0.0" "string.prototype.matchall@^4.0.0 || ^3.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.1.tgz#f10fdfa8d1fee12e149fddda14f211b6bb3527da" - integrity sha512-vIObm+BWuKKJovfh2/PPCAmePTDdubrgCkhQnbP0oAwD7Jj8IyIM57Hu7Ma7oDdg4oVdh5S1Rd8RviBIPZ8Pfg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.17.0" has-symbols "^1.0.1" - regexp.prototype.flags "^1.2.0" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" string.prototype.padend@^3.0.0: version "3.1.0" @@ -15195,15 +15162,6 @@ string.prototype.padstart@^3.0.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -string.prototype.trim@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" - integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.13.0" - function-bind "^1.1.1" - string.prototype.trimleft@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" @@ -15212,6 +15170,14 @@ string.prototype.trimleft@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string.prototype.trimright@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" @@ -15220,6 +15186,14 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -15318,6 +15292,13 @@ strip-indent@^2.0.0: resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -16269,6 +16250,11 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" +wait-for-expect@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.1.tgz#ec204a76b0038f17711e575720aaf28505ac7185" + integrity sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw== + wait-on@3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz#9940981d047a72a9544a97b8b5fca45b2170a082"