@@ -149,7 +142,7 @@ function TextDisplay({
@@ -159,7 +152,7 @@ function TextDisplay({
@@ -172,7 +165,7 @@ function TextDisplay({
diff --git a/assets/src/edit-story/elements/text/edit.js b/assets/src/edit-story/elements/text/edit.js
index 1a9e2129849c..06fdfc07127f 100644
--- a/assets/src/edit-story/elements/text/edit.js
+++ b/assets/src/edit-story/elements/text/edit.js
@@ -18,46 +18,26 @@
* External dependencies
*/
import styled from 'styled-components';
-import { Editor, EditorState } from 'draft-js';
-import { stateFromHTML } from 'draft-js-import-html';
-import { stateToHTML } from 'draft-js-export-html';
-import {
- useMemo,
- useState,
- useEffect,
- useLayoutEffect,
- useRef,
- useCallback,
-} from 'react';
+import { useEffect, useLayoutEffect, useRef, useCallback } from 'react';
/**
* Internal dependencies
*/
import { useStory, useFont } from '../../app';
-import { useCanvas } from '../../components/canvas';
+import RichTextEditor from '../../components/richText/editor';
import { useUnits } from '../../units';
import {
elementFillContent,
elementWithFont,
elementWithBackgroundColor,
- elementWithFontColor,
elementWithTextParagraphStyle,
} from '../shared';
import StoryPropTypes from '../../types';
import { BACKGROUND_TEXT_MODE } from '../../constants';
-import useFocusOut from '../../utils/useFocusOut';
import useUnmount from '../../utils/useUnmount';
import createSolid from '../../utils/createSolid';
import calcRotatedResizeOffset from '../../utils/calcRotatedResizeOffset';
-import {
- draftMarkupToContent,
- getFilteredState,
- getHandleKeyCommand,
- getSelectionForAll,
- getSelectionForOffset,
- generateParagraphTextStyle,
- getHighlightLineheight,
-} from './util';
+import { generateParagraphTextStyle, getHighlightLineheight } from './util';
// Wrapper bounds the text editor within the element bounds. The resize
// logic updates the height of this element to show the new height based
@@ -85,7 +65,6 @@ const TextBox = styled.div`
${elementWithFont}
${elementWithTextParagraphStyle}
${elementWithBackgroundColor}
- ${elementWithFontColor}
opacity: ${({ opacity }) => (opacity ? opacity / 100 : null)};
position: absolute;
@@ -97,9 +76,7 @@ const TextBox = styled.div`
function TextEdit({
element: {
id,
- bold,
content,
- color,
backgroundColor,
backgroundTextMode,
opacity,
@@ -115,7 +92,6 @@ function TextEdit({
} = useUnits();
const textProps = {
...generateParagraphTextStyle(rest, dataToEditorX, dataToEditorY),
- color,
font,
backgroundColor,
opacity,
@@ -124,102 +100,53 @@ function TextEdit({
rest.lineHeight,
dataToEditorX(rest.padding?.vertical || 0)
),
- color: createSolid(0, 0, 0),
backgroundColor: createSolid(255, 255, 255),
}),
...(backgroundTextMode === BACKGROUND_TEXT_MODE.NONE && {
backgroundColor: null,
}),
};
- const wrapperRef = useRef(null);
- const textBoxRef = useRef(null);
- const editorRef = useRef(null);
const {
actions: { maybeEnqueueFontStyle },
} = useFont();
const {
actions: { updateElementById },
} = useStory();
- const {
- state: { editingElementState },
- } = useCanvas();
+
const setProperties = useCallback(
(properties) => updateElementById({ elementId: id, properties }),
[id, updateElementById]
);
- const { offset, clearContent, selectAll } = editingElementState || {};
- const initialState = useMemo(() => {
- const contentWithBreaks = (content || '')
- // Re-insert manual line-breaks for empty lines
- .replace(/\n(?=\n)/g, '\n
')
- .split('\n')
- .map((s) => {
- return `${draftMarkupToContent(s, bold)}
`;
- })
- .join('');
- let state = EditorState.createWithContent(stateFromHTML(contentWithBreaks));
- if (clearContent) {
- // If `clearContent` is specified, push the update to clear content so that
- // it can be undone.
- state = EditorState.push(state, stateFromHTML(''), 'remove-range');
- }
- let selection;
- if (selectAll) {
- selection = getSelectionForAll(state.getCurrentContent());
- } else if (offset) {
- selection = getSelectionForOffset(state.getCurrentContent(), offset);
- }
- if (selection) {
- state = EditorState.forceSelection(state, selection);
- }
- return state;
- }, [content, clearContent, selectAll, offset, bold]);
- const [editorState, setEditorState] = useState(initialState);
+ const wrapperRef = useRef(null);
+ const textBoxRef = useRef(null);
+ const editorRef = useRef(null);
+ const contentRef = useRef();
const editorHeightRef = useRef(0);
- // This is to allow the finalizing useEffect to *not* depend on editorState,
- // as would otherwise be a lint error.
- const lastKnownState = useRef(null);
-
- // This filters out illegal content (see `getFilteredState`)
- // on paste and updates state accordingly.
- // Furthermore it also sets initial selection if relevant.
- const updateEditorState = useCallback(
- (newEditorState) => {
- const filteredState = getFilteredState(newEditorState, editorState);
- lastKnownState.current = filteredState.getCurrentContent();
- setEditorState(filteredState);
- },
- [editorState]
- );
-
- // Handle basic key commands such as bold, italic and underscore.
- const handleKeyCommand = getHandleKeyCommand(updateEditorState);
-
// Make sure to allow the user to click in the text box while working on the text.
const onClick = (evt) => {
const editor = editorRef.current;
// Refocus the editor if the container outside it is clicked.
- if (!editor.editorContainer.contains(evt.target)) {
+ if (!editor.getNode().contains(evt.target)) {
editor.focus();
}
evt.stopPropagation();
};
+ // Set focus when initially rendered.
+ useLayoutEffect(() => {
+ if (editorRef.current) {
+ editorRef.current.focus();
+ }
+ }, []);
+
const updateContent = useCallback(() => {
- const newState = lastKnownState.current;
const newHeight = editorHeightRef.current;
wrapperRef.current.style.height = '';
- if (newState) {
+ if (contentRef.current) {
// Remove manual line breaks and remember to trim any trailing non-breaking space.
- const properties = {
- content: stateToHTML(lastKnownState.current, {
- defaultBlockTag: null,
- })
- .replace(/
/g, '')
- .replace(/ $/, ''),
- };
+ const properties = { content: contentRef.current };
// Recalculate the new height and offset.
if (newHeight) {
const [dx, dy] = calcRotatedResizeOffset(
@@ -245,24 +172,26 @@ function TextEdit({
y,
]);
- // Update content for element on focus out.
- useFocusOut(textBoxRef, updateContent, [updateContent]);
-
// Update content for element on unmount.
useUnmount(updateContent);
- // Set focus when initially rendered.
- useLayoutEffect(() => {
- editorRef.current.focus();
- }, []);
-
- // Remeasure the height on each content update.
- useEffect(() => {
+ // A function to remeasure height
+ const handleResize = useCallback(() => {
const wrapper = wrapperRef.current;
const textBox = textBoxRef.current;
editorHeightRef.current = textBox.offsetHeight;
wrapper.style.height = `${editorHeightRef.current}px`;
- }, [editorState, elementHeight]);
+ }, []);
+ // Invoke on each content update.
+ const handleUpdate = useCallback(
+ (newContent) => {
+ contentRef.current = newContent;
+ handleResize();
+ },
+ [handleResize]
+ );
+ // Also invoke if the raw element height ever changes
+ useEffect(handleResize, [elementHeight]);
useEffect(() => {
maybeEnqueueFontStyle(font);
@@ -271,11 +200,10 @@ function TextEdit({
return (
-
diff --git a/assets/src/edit-story/elements/text/index.js b/assets/src/edit-story/elements/text/index.js
index 2cdc0839f100..80612d0423b1 100644
--- a/assets/src/edit-story/elements/text/index.js
+++ b/assets/src/edit-story/elements/text/index.js
@@ -34,17 +34,11 @@ export { default as updateForResizeEvent } from './updateForResizeEvent';
export const defaultAttributes = {
...SHARED_DEFAULT_ATTRIBUTES,
backgroundTextMode: BACKGROUND_TEXT_MODE.NONE,
- bold: false,
font: TEXT_ELEMENT_DEFAULT_FONT,
- fontWeight: 400,
fontSize: 36,
- fontStyle: 'normal',
backgroundColor: createSolid(196, 196, 196),
- color: createSolid(0, 0, 0),
- letterSpacing: 0,
lineHeight: 1.3,
textAlign: 'initial',
- textDecoration: 'none',
padding: {
vertical: 0,
horizontal: 0,
diff --git a/assets/src/edit-story/elements/text/output.js b/assets/src/edit-story/elements/text/output.js
index fbe8c29eb7af..94504f360e26 100644
--- a/assets/src/edit-story/elements/text/output.js
+++ b/assets/src/edit-story/elements/text/output.js
@@ -18,33 +18,24 @@
* External dependencies
*/
import PropTypes from 'prop-types';
+import { useMemo } from 'react';
/**
* Internal dependencies
*/
import StoryPropTypes from '../../types';
import generatePatternStyles from '../../utils/generatePatternStyles';
+import { getHTMLFormatters } from '../../components/richText/htmlManipulation';
+import createSolid from '../../utils/createSolid';
import { dataToEditorX, dataToEditorY } from '../../units';
import { BACKGROUND_TEXT_MODE } from '../../constants';
-import {
- draftMarkupToContent,
- generateParagraphTextStyle,
- getHighlightLineheight,
-} from './util';
+import { generateParagraphTextStyle, getHighlightLineheight } from './util';
/**
* Renders DOM for the text output based on the provided unit converters.
*/
export function TextOutputWithUnits({
- element: {
- bold,
- content,
- color,
- backgroundColor,
- backgroundTextMode,
- padding,
- ...rest
- },
+ element: { content, backgroundColor, backgroundTextMode, padding, ...rest },
dataToStyleX,
dataToStyleY,
dataToFontSizeY,
@@ -78,8 +69,8 @@ export function TextOutputWithUnits({
dataToStyleY,
dataToFontSizeY
),
- ...generatePatternStyles(color, 'color'),
...bgColor,
+ color: '#000000',
padding: `${paddingStyles.vertical} ${paddingStyles.horizontal}`,
};
@@ -138,6 +129,13 @@ export function TextOutputWithUnits({
background: 'none',
};
+ // Setting the text color of the entire block to black essentially removes all inline
+ // color styling allowing us to apply transparent to all of them.
+ const contentWithoutColor = useMemo(
+ () => getHTMLFormatters().setColor(content, createSolid(0, 0, 0)),
+ [content]
+ );
+
if (backgroundTextMode === BACKGROUND_TEXT_MODE.HIGHLIGHT) {
return (
<>
@@ -146,7 +144,7 @@ export function TextOutputWithUnits({
@@ -156,7 +154,7 @@ export function TextOutputWithUnits({
@@ -169,7 +167,7 @@ export function TextOutputWithUnits({
);
}
diff --git a/assets/src/edit-story/elements/text/test/output.js b/assets/src/edit-story/elements/text/test/output.js
index 394543a23e9a..3cf1f71b06db 100644
--- a/assets/src/edit-story/elements/text/test/output.js
+++ b/assets/src/edit-story/elements/text/test/output.js
@@ -38,14 +38,6 @@ describe('TextOutput', () => {
const element = {
id: '123',
content: 'Content',
- color: {
- color: {
- r: 255,
- g: 255,
- b: 255,
- a: 0.5,
- },
- },
backgroundColor: {
color: {
r: 255,
@@ -58,9 +50,7 @@ describe('TextOutput', () => {
family: 'Roboto',
},
fontSize: 16,
- letterSpacing: 1.3,
textAlign: 'left',
- textDecoration: 'none',
type: 'text',
x: 10,
y: 10,
@@ -87,33 +77,21 @@ describe('TextOutput', () => {
whiteSpace: 'pre-wrap',
padding: '0% 0%',
margin: '0px',
- color: 'rgba(255, 255, 255, 0.5)',
backgroundColor: 'rgba(255, 0, 0, 0.3)',
fontSize: '0.242424em',
- letterSpacing: '1.3em',
textAlign: 'left',
- textDecoration: 'none',
});
});
it('should convert padding to percent of width', () => {
const element = {
id: '123',
- color: {
- color: {
- r: 255,
- g: 255,
- b: 255,
- },
- },
content: 'Content',
font: {
family: 'Roboto',
},
fontSize: 16,
- letterSpacing: 1.3,
textAlign: 'left',
- textDecoration: 'none',
type: 'text',
x: 10,
y: 10,
@@ -140,55 +118,6 @@ describe('TextOutput', () => {
});
});
- it('should apply tags if bold', () => {
- const element = {
- id: '123',
- content: 'Content',
- color: {
- color: {
- r: 255,
- g: 255,
- b: 255,
- a: 0.5,
- },
- },
- backgroundColor: {
- color: {
- r: 255,
- g: 0,
- b: 0,
- a: 0.3,
- },
- },
- font: {
- family: 'Roboto',
- },
- fontSize: 16,
- letterSpacing: 1.3,
- textAlign: 'left',
- textDecoration: 'none',
- type: 'text',
- x: 10,
- y: 10,
- width: 50,
- height: 50,
- rotationAngle: 0,
- padding: {
- vertical: 0,
- horizontal: 0,
- },
- bold: true,
- };
-
- const output = renderViaString(
-
- );
- expect(output.innerHTML).toBe('Content');
- });
-
it('should wrap font-family into quotes', () => {
const element = {
id: '123',
@@ -207,7 +136,6 @@ describe('TextOutput', () => {
vertical: 0,
horizontal: 0,
},
- color: { type: 'solid', color: { r: 255, g: 255, b: 255 } },
};
const output = renderViaString(
@@ -238,7 +166,6 @@ describe('TextOutput', () => {
vertical: 0,
horizontal: 0,
},
- color: { type: 'solid', color: { r: 255, g: 255, b: 255 } },
};
const output = renderViaString(
diff --git a/assets/src/edit-story/elements/text/test/util.js b/assets/src/edit-story/elements/text/test/util.js
index 8d4ffb298b7b..1b286f6a6ee8 100644
--- a/assets/src/edit-story/elements/text/test/util.js
+++ b/assets/src/edit-story/elements/text/test/util.js
@@ -17,7 +17,7 @@
/**
* Internal dependencies
*/
-import { draftMarkupToContent, generateFontFamily } from '../util';
+import { generateFontFamily } from '../util';
describe('Text/util', () => {
describe('Text/util/generateFontFamily', () => {
@@ -46,30 +46,4 @@ describe('Text/util', () => {
).toStrictEqual(expected);
});
});
-
- describe('Text/util/draftMarkupToContent', () => {
- it('should return valid HTML for content', () => {
- const input = 'Hello World!';
- expect(draftMarkupToContent(input, false)).toStrictEqual(
- 'Hello World!'
- );
-
- const nestedInput = 'Hello World, again!';
- expect(draftMarkupToContent(nestedInput, false)).toStrictEqual(
- 'Hello World, again!'
- );
-
- const invalidInput = 'Hello world {
+ describe('should parse all text elements', () => {
+ it('should ignore non-text elements', () => {
+ expect(
+ inlineTextProperties({
+ pages: [
+ {
+ elements: [
+ {
+ type: 'square',
+ bold: true,
+ },
+ {
+ type: 'image',
+ content: 'Horse',
+ color: 'red',
+ },
+ ],
+ },
+ ],
+ })
+ ).toStrictEqual({
+ pages: [
+ {
+ elements: [
+ {
+ type: 'square',
+ bold: true,
+ },
+ {
+ type: 'image',
+ content: 'Horse',
+ color: 'red',
+ },
+ ],
+ },
+ ],
+ });
+ });
+
+ it('should parse multiple text elements on multiple pages', () => {
+ expect(
+ inlineTextProperties({
+ pages: [
+ {
+ elements: [
+ {
+ type: 'text',
+ bold: true,
+ content: 'Hello',
+ },
+ {
+ type: 'text',
+ textDecoration: 'underline',
+ content: 'Hello',
+ },
+ ],
+ },
+ {
+ elements: [
+ {
+ type: 'text',
+ fontStyle: 'italic',
+ content: 'Hello',
+ },
+ {
+ type: 'text',
+ fontWeight: 300,
+ content: 'Hello',
+ },
+ ],
+ },
+ ],
+ })
+ ).toStrictEqual({
+ pages: [
+ {
+ elements: [
+ {
+ type: 'text',
+ content: 'Hello',
+ },
+ {
+ type: 'text',
+ content:
+ 'Hello',
+ },
+ ],
+ },
+ {
+ elements: [
+ {
+ type: 'text',
+ content: 'Hello',
+ },
+ {
+ type: 'text',
+ content: 'Hello',
+ },
+ ],
+ },
+ ],
+ });
+ });
+
+ it('should remove all deprecated properties', () => {
+ const res = inlineTextProperties({
+ pages: [
+ {
+ elements: [
+ {
+ type: 'text',
+ bold: true,
+ fontWeight: 300,
+ fontStyle: 'italic',
+ textDecoration: 'underline',
+ letterSpacing: 5,
+ color: { color: { r: 255, g: 0, b: 0 } },
+ content: 'Hello',
+ },
+ ],
+ },
+ ],
+ });
+
+ const convertedElementKeys = res.pages[0].elements[0];
+ expect(convertedElementKeys).toContainKey('content');
+ expect(convertedElementKeys).not.toContainKeys([
+ 'bold',
+ 'fontWeight',
+ 'fontStyle',
+ 'textDecoration',
+ 'letterSpacing',
+ 'color',
+ ]);
+ });
+ });
+
+ it('should convert inline elements', () => {
+ const original = `
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+
+ consectetur
+ adipiscing
+ elit
+ .
+ `;
+ const converted = convert(original);
+ const expected = `
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+
+ consectetur
+ adipiscing
+ elit
+ .
+ `;
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should convert nested elements', () => {
+ const original = `
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+
+ consectetur
+ adipiscing
+ elit
+ .
+ `;
+ const converted = convert(original);
+ const expected = `
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+
+ consectetur
+ adipiscing
+ elit
+ .
+ `;
+ expect(converted).toStrictEqual(expected);
+ });
+ describe('should correctly interpret bold properties', () => {
+ it('should correctly interpret bold property and ignore inline elements', () => {
+ const original = 'Lorem ipsum';
+ const properties = { bold: true };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should correctly interpret font weight property and ignore inline elements', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontWeight: 300 };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should ignore font weight set to 400', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontWeight: 400 };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should use font weight over bold when both set if not 400', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontWeight: 300, bold: true };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should do nothing globally if font weight is 400 and bold is false', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontWeight: 400, bold: false };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+ });
+
+ describe('should correctly interpret italic property', () => {
+ it('should correctly interpret font style property and ignore inline elements', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontStyle: 'italic' };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should ignore font style set to anything but "italic"', () => {
+ const original = 'Lorem ipsum';
+ const properties = { fontStyle: 'oblique' };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+ });
+
+ describe('should correctly interpret underline property', () => {
+ it('should correctly interpret text decoration property and ignore inline elements', () => {
+ const original = 'Lorem ipsum';
+ const properties = { textDecoration: 'underline' };
+ const converted = convert(original, properties);
+ const expected =
+ 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should ignore text decoration set to anything but "underline"', () => {
+ const original = 'Lorem ipsum';
+ const properties = { textDecoration: 'line-through' };
+ const converted = convert(original, properties);
+ const expected =
+ 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+ });
+
+ it('should correctly inline color property', () => {
+ const original = 'Lorem ipsum';
+ const properties = { color: { color: { r: 255, g: 0, b: 0, a: 0.5 } } };
+ const converted = convert(original, properties);
+ const expected =
+ 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should correctly inline letter spacing property', () => {
+ const original = 'Lorem ipsum';
+ const properties = { letterSpacing: 20 };
+ const converted = convert(original, properties);
+ const expected = 'Lorem ipsum';
+ expect(converted).toStrictEqual(expected);
+ });
+
+ it('should all work correctly together', () => {
+ const original = `
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+ consectetur
+ adipiscing
+ elit.
+ `;
+ // Here we have global italic, color and letter spacing, but no global font weight or underline.
+ const properties = {
+ letterSpacing: 20,
+ bold: false,
+ fontWeight: 400,
+ fontStyle: 'italic',
+ color: { color: { r: 255, g: 0, b: 0 } },
+ textDecoration: 'line-through',
+ };
+ const converted = convert(original, properties);
+ const expected = `
+
+
+
+ Lorem
+ ipsum
+ dolor
+ sit
+ amet,
+ consectetur
+ adipiscing
+ elit.
+
+
+
+ `;
+ expect(uniformWhitespace(converted)).toStrictEqual(
+ uniformWhitespace(expected)
+ );
+
+ function uniformWhitespace(str) {
+ return str
+ .replace(/^|$/g, ' ') // insert single space front and back
+ .replace(/> <') // and insert space between tags
+ .replace(/\s+/g, ' '); // and then collapse all multi-whitespace to single space
+ }
+ });
+});
diff --git a/assets/src/edit-story/migration/migrations/v0017_inlineTextProperties.js b/assets/src/edit-story/migration/migrations/v0017_inlineTextProperties.js
new file mode 100644
index 000000000000..5389e284a953
--- /dev/null
+++ b/assets/src/edit-story/migration/migrations/v0017_inlineTextProperties.js
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function inlineTextProperties({ pages, ...rest }) {
+ return {
+ pages: pages.map(reducePage),
+ ...rest,
+ };
+}
+
+function reducePage({ elements, ...rest }) {
+ return {
+ elements: elements.map(updateElement),
+ ...rest,
+ };
+}
+
+function updateElement(element) {
+ if (element.type === 'text') {
+ return updateTextContent(element);
+ }
+
+ return element;
+}
+
+function updateTextContent({
+ bold,
+ fontWeight,
+ fontStyle,
+ textDecoration,
+ letterSpacing,
+ color,
+ content,
+ ...rest
+}) {
+ // We use an array to chain all the converters more nicely
+ const convertedContent = [content]
+ .map((c) => convertInlineBold(c, bold, fontWeight))
+ .map((c) => convertInlineItalic(c, fontStyle))
+ .map((c) => convertInlineUnderline(c, textDecoration))
+ .map((c) => addInlineColor(c, color))
+ .map((c) => addInlineLetterSpacing(c, letterSpacing))
+ .pop();
+
+ return { ...rest, content: convertedContent };
+}
+
+function convertInlineBold(content, isBold, fontWeight) {
+ // Do we have a specific global weight to apply for entire text field?
+ const globalWeight =
+ typeof fontWeight === 'number' && fontWeight != 400
+ ? fontWeight
+ : isBold === true
+ ? 700
+ : null;
+
+ if (globalWeight) {
+ // In that case, strip any inline bold from the text and wrap everything in a span with correct style
+ const stripped = stripTag(content, 'strong');
+ const fancyBold = `font-weight: ${globalWeight}`;
+ const wrapped = wrapWithSpan(stripped, fancyBold);
+ return wrapped;
+ }
+
+ const justBold = 'font-weight: 700';
+ return replaceTagWithSpan(content, 'strong', justBold);
+}
+
+function convertInlineItalic(content, fontStyle) {
+ // Do we have a specific font style to apply for entire text field?
+ const globalFontStyle = fontStyle === 'italic' ? fontStyle : null;
+ const italicStyle = 'font-style: italic';
+
+ if (globalFontStyle) {
+ // In that case, strip any inline em from the text and wrap everything in a span with correct style
+ const stripped = stripTag(content, 'em');
+ const wrapped = wrapWithSpan(stripped, italicStyle);
+ return wrapped;
+ }
+
+ return replaceTagWithSpan(content, 'em', italicStyle);
+}
+
+function convertInlineUnderline(content, textDecoration) {
+ // Do we have a specific text decoration to apply for entire text field?
+ const globalDecoration =
+ textDecoration === 'underline' ? textDecoration : null;
+ const underlineStyle = 'text-decoration: underline';
+
+ if (globalDecoration) {
+ // In that case, strip any inline underline from the text and wrap everything in a span with correct style
+ const stripped = stripTag(content, 'u');
+ const wrapped = wrapWithSpan(stripped, underlineStyle);
+ return wrapped;
+ }
+
+ return replaceTagWithSpan(content, 'u', underlineStyle);
+}
+
+function addInlineColor(content, color) {
+ // If we don't have a color (should never happen, but if), just return
+ if (!color) {
+ return content;
+ }
+
+ const {
+ color: { r, g, b, a = 1 },
+ } = color;
+ return wrapWithSpan(content, `color: rgba(${r}, ${g}, ${b}, ${a})`);
+}
+
+function addInlineLetterSpacing(content, letterSpacing) {
+ // If we don't have letterSpacing, just return
+ if (!letterSpacing) {
+ return content;
+ }
+
+ return wrapWithSpan(content, `letter-spacing: ${letterSpacing / 100}em`);
+}
+
+function stripTag(html, tag) {
+ // This is a very naive strip. Can only remove non-self-closing tags with attributes, which is sufficent here
+ return html.replace(new RegExp(`?${tag}>`, 'gi'), '');
+}
+
+function replaceTagWithSpan(html, tag, style) {
+ // Again, very naive
+ return html
+ .replace(new RegExp(`<${tag}>`, 'gi'), ``)
+ .replace(new RegExp(`${tag}>`, 'gi'), '');
+}
+
+function wrapWithSpan(html, style) {
+ return `${html}`;
+}
+
+export default inlineTextProperties;
diff --git a/assets/src/edit-story/types.js b/assets/src/edit-story/types.js
index 50a91c49ae97..52b0c013eecd 100644
--- a/assets/src/edit-story/types.js
+++ b/assets/src/edit-story/types.js
@@ -204,14 +204,10 @@ export const FontPropType = PropTypes.shape({
StoryPropTypes.elements.text = PropTypes.shape({
...StoryElementPropTypes,
content: PropTypes.string,
- color: PatternPropType.isRequired,
backgroundTextMode: PropTypes.oneOf(Object.values(BACKGROUND_TEXT_MODE)),
backgroundColor: PatternPropType,
font: FontPropType.isRequired,
fontSize: PropTypes.number,
- fontWeight: PropTypes.number,
- fontStyle: PropTypes.string,
- letterSpacing: PropTypes.number,
lineHeight: PropTypes.number,
padding: PropTypes.shape({
horizontal: PropTypes.number,
@@ -219,7 +215,6 @@ StoryPropTypes.elements.text = PropTypes.shape({
locked: PropTypes.bool,
}),
textAlign: PropTypes.string,
- textDecoration: PropTypes.string,
});
StoryPropTypes.elements.shape = PropTypes.shape({
diff --git a/assets/src/edit-story/utils/getValidHTML.js b/assets/src/edit-story/utils/getValidHTML.js
new file mode 100644
index 000000000000..92f7d975ab9c
--- /dev/null
+++ b/assets/src/edit-story/utils/getValidHTML.js
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const contentBuffer = document.createElement('template');
+
+export default function getValidHTML(string) {
+ contentBuffer.innerHTML = string;
+ return contentBuffer.innerHTML;
+}
diff --git a/assets/src/edit-story/utils/isPatternEqual.js b/assets/src/edit-story/utils/isPatternEqual.js
new file mode 100644
index 000000000000..831a6868e00a
--- /dev/null
+++ b/assets/src/edit-story/utils/isPatternEqual.js
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Internal dependencies
+ */
+import convertToCSS from './convertToCSS';
+import generatePatternStyles from './generatePatternStyles';
+
+export default function isPatternEqual(p1, p2, patternType = undefined) {
+ const p1CSS = convertToCSS(generatePatternStyles(p1, patternType));
+ const p2CSS = convertToCSS(generatePatternStyles(p2, patternType));
+ return p1CSS === p2CSS;
+}
diff --git a/assets/src/edit-story/utils/patternUtils.js b/assets/src/edit-story/utils/patternUtils.js
new file mode 100644
index 000000000000..503b32071c25
--- /dev/null
+++ b/assets/src/edit-story/utils/patternUtils.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Internal dependencies
+ */
+import createSolidFromString from './createSolidFromString';
+import createSolid from './createSolid';
+
+export function getSolidFromHex(hex) {
+ // We already have a nice parser for most of this, but we need to
+ // parse opacity as the last two hex digits as percent, not 1/256th
+
+ const {
+ color: { r, g, b },
+ } = createSolidFromString(`#${hex.slice(0, 6)}`);
+
+ const opacity = parseInt(hex.slice(6), 16);
+
+ return createSolid(r, g, b, opacity / 100);
+}
+
+export function getHexFromSolid(solid) {
+ const {
+ color: { r, g, b, a = 1 },
+ } = solid;
+ const dims = [r, g, b, Math.round(a * 100)];
+ return dims
+ .map((n) => n.toString(16))
+ .map((s) => s.padStart(2, '0'))
+ .join('');
+}
diff --git a/assets/src/edit-story/utils/test/useLiveRegion.js b/assets/src/edit-story/utils/test/useLiveRegion.js
index 58bdeb925b77..993bd40427d9 100644
--- a/assets/src/edit-story/utils/test/useLiveRegion.js
+++ b/assets/src/edit-story/utils/test/useLiveRegion.js
@@ -31,7 +31,9 @@ describe('useLiveRegion', () => {
expect(
queryById(document.documentElement, 'web-stories-aria-live-region-polite')
- ).toBeEmpty();
+ ).toHaveTextContent('');
+ // .toBeEmpty() cannot be used, because of
+ // https://github.com/testing-library/jest-dom/issues/216
act(() => {
result.current('Hello World');
@@ -53,7 +55,9 @@ describe('useLiveRegion', () => {
document.documentElement,
'web-stories-aria-live-region-assertive'
)
- ).toBeEmpty();
+ ).toHaveTextContent('');
+ // .toBeEmpty() cannot be used, because of
+ // https://github.com/testing-library/jest-dom/issues/216
act(() => result.current('Hello World'));
@@ -73,7 +77,9 @@ describe('useLiveRegion', () => {
expect(
queryById(document.documentElement, 'web-stories-aria-live-region-polite')
- ).toBeEmpty();
+ ).toHaveTextContent('');
+ // .toBeEmpty() cannot be used, because of
+ // https://github.com/testing-library/jest-dom/issues/216
unmount();
@@ -87,7 +93,9 @@ describe('useLiveRegion', () => {
expect(
queryById(document.documentElement, 'web-stories-aria-live-region-polite')
- ).toBeEmpty();
+ ).toHaveTextContent('');
+ // .toBeEmpty() cannot be used, because of
+ // https://github.com/testing-library/jest-dom/issues/216
act(() => {
result.current('Foo');
@@ -110,6 +118,8 @@ describe('useLiveRegion', () => {
expect(
queryById(document.documentElement, 'web-stories-aria-live-region-polite')
- ).toBeEmpty();
+ ).toHaveTextContent('');
+ // .toBeEmpty() cannot be used, because of
+ // https://github.com/testing-library/jest-dom/issues/216
});
});
diff --git a/assets/src/edit-story/utils/useFocusOut.js b/assets/src/edit-story/utils/useFocusOut.js
index a22fac872ef6..cd853a4ff208 100644
--- a/assets/src/edit-story/utils/useFocusOut.js
+++ b/assets/src/edit-story/utils/useFocusOut.js
@@ -35,19 +35,23 @@ function useFocusOut(ref, callback, deps) {
const onDocumentClick = (evt) => {
// If something outside the target node is clicked, callback time!
- const isInDocument = node.ownerDocument.contains(evt.target);
const isInNode = node.contains(evt.target);
- if (!isInNode && isInDocument) {
+ if (!isInNode) {
callback();
}
};
node.addEventListener('focusout', onFocusOut);
- node.ownerDocument.addEventListener('pointerdown', onDocumentClick);
+ // Often elements are removed in pointerdown handlers elsewhere, causing them
+ // to fail the node.contains check regardless of being inside target ref or not.
+ // By checking the click target in the capture phase, we circumvent that completely.
+ const opts = { capture: true };
+ const doc = node.ownerDocument;
+ doc.addEventListener('pointerdown', onDocumentClick, opts);
return () => {
node.removeEventListener('focusout', onFocusOut);
- node.ownerDocument.removeEventListener('pointerdown', onDocumentClick);
+ doc.removeEventListener('pointerdown', onDocumentClick, opts);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, deps || []);
diff --git a/package-lock.json b/package-lock.json
index e310f2e69710..3cf34e8a5c25 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7827,6 +7827,11 @@
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
+ "@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+ },
"abab": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
@@ -8215,20 +8220,17 @@
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
},
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
},
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
},
"array-equal": {
"version": "1.0.0",
@@ -8271,8 +8273,7 @@
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
},
"array.prototype.find": {
"version": "2.1.1",
@@ -8380,8 +8381,7 @@
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
},
"ast-types": {
"version": "0.12.4",
@@ -8430,8 +8430,7 @@
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
"autoprefixer": {
"version": "9.7.4",
@@ -9417,14 +9416,12 @@
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"base": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
"requires": {
"cache-base": "^1.0.1",
"class-utils": "^0.3.5",
@@ -9439,7 +9436,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -9448,7 +9444,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -9457,7 +9452,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -9466,7 +9460,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
@@ -9737,7 +9730,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -9747,7 +9739,6 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
"requires": {
"arr-flatten": "^1.1.0",
"array-unique": "^0.3.2",
@@ -9765,7 +9756,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -9997,7 +9987,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
"requires": {
"collection-visit": "^1.0.0",
"component-emitter": "^1.2.1",
@@ -10256,8 +10245,7 @@
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
},
"cipher-base": {
"version": "1.0.4",
@@ -10273,7 +10261,6 @@
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
"requires": {
"arr-union": "^3.1.0",
"define-property": "^0.2.5",
@@ -10285,7 +10272,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -10587,7 +10573,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
"requires": {
"map-visit": "^1.0.0",
"object-visit": "^1.0.0"
@@ -10682,14 +10667,12 @@
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"concat-stream": {
"version": "1.6.2",
@@ -10819,8 +10802,7 @@
"copy-descriptor": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
"copy-to-clipboard": {
"version": "3.3.1",
@@ -10966,7 +10948,6 @@
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
@@ -11505,7 +11486,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
"requires": {
"is-descriptor": "^1.0.2",
"isobject": "^3.0.1"
@@ -11515,7 +11495,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -11524,7 +11503,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -11533,7 +11511,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
@@ -13015,7 +12992,6 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
"requires": {
"debug": "^2.3.3",
"define-property": "^0.2.5",
@@ -13030,7 +13006,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -13039,7 +13014,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -13048,7 +13022,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -13056,8 +13029,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
@@ -13358,7 +13330,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
"requires": {
"assign-symbols": "^1.0.0",
"is-extendable": "^1.0.1"
@@ -13368,7 +13339,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
"requires": {
"is-plain-object": "^2.0.4"
}
@@ -13390,7 +13360,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
"requires": {
"array-unique": "^0.3.2",
"define-property": "^1.0.0",
@@ -13406,7 +13375,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -13415,7 +13383,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -13424,7 +13391,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -13433,7 +13399,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -13442,7 +13407,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
@@ -13654,7 +13618,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-number": "^3.0.0",
@@ -13666,7 +13629,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -13793,6 +13755,35 @@
"semver-regex": "^2.0.0"
}
},
+ "find-yarn-workspace-root": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz",
+ "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==",
+ "requires": {
+ "fs-extra": "^4.0.3",
+ "micromatch": "^3.1.4"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ }
+ }
+ },
"findup": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz",
@@ -13916,8 +13907,7 @@
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
},
"for-own": {
"version": "0.1.5",
@@ -13975,7 +13965,6 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
"requires": {
"map-cache": "^0.2.2"
}
@@ -14065,8 +14054,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fsevents": {
"version": "1.2.11",
@@ -14795,8 +14783,7 @@
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
},
"getpass": {
"version": "0.1.7",
@@ -14828,7 +14815,6 @@
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -15011,8 +14997,7 @@
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
- "dev": true
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
},
"graceful-readlink": {
"version": "1.0.1",
@@ -15100,7 +15085,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
"requires": {
"get-value": "^2.0.6",
"has-values": "^1.0.0",
@@ -15111,7 +15095,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
"requires": {
"is-number": "^3.0.0",
"kind-of": "^4.0.0"
@@ -15121,7 +15104,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -15728,7 +15710,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -15737,8 +15718,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.5",
@@ -15928,7 +15908,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
"requires": {
"kind-of": "^3.0.2"
},
@@ -15937,7 +15916,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -16001,7 +15979,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
"requires": {
"ci-info": "^2.0.0"
}
@@ -16024,7 +16001,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
"requires": {
"kind-of": "^3.0.2"
},
@@ -16033,7 +16009,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -16055,7 +16030,6 @@
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "^0.1.6",
"is-data-descriptor": "^0.1.4",
@@ -16065,8 +16039,7 @@
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
},
@@ -16113,8 +16086,7 @@
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
},
"is-extglob": {
"version": "2.1.1",
@@ -16168,7 +16140,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
"requires": {
"kind-of": "^3.0.2"
},
@@ -16177,7 +16148,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -16206,7 +16176,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
"requires": {
"isobject": "^3.0.1"
}
@@ -16302,8 +16271,7 @@
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
},
"is-word-character": {
"version": "1.0.4",
@@ -16320,20 +16288,17 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"isomorphic-fetch": {
"version": "2.2.1",
@@ -21082,8 +21047,7 @@
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
},
"klaw": {
"version": "1.3.1",
@@ -21094,6 +21058,14 @@
"graceful-fs": "^4.1.9"
}
},
+ "klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "requires": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
"kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -21797,8 +21769,7 @@
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
},
"map-obj": {
"version": "4.1.0",
@@ -21816,7 +21787,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
"requires": {
"object-visit": "^1.0.0"
}
@@ -22225,7 +22195,6 @@
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
"requires": {
"arr-diff": "^4.0.0",
"array-unique": "^0.3.2",
@@ -22320,7 +22289,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -22328,8 +22296,7 @@
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minimist-options": {
"version": "4.0.2",
@@ -22415,7 +22382,6 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dev": true,
"requires": {
"for-in": "^1.0.2",
"is-extendable": "^1.0.1"
@@ -22425,7 +22391,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
"requires": {
"is-plain-object": "^2.0.4"
}
@@ -22511,7 +22476,6 @@
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
"requires": {
"arr-diff": "^4.0.0",
"array-unique": "^0.3.2",
@@ -22565,8 +22529,7 @@
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"no-case": {
"version": "3.0.3",
@@ -22833,7 +22796,6 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
"requires": {
"copy-descriptor": "^0.1.0",
"define-property": "^0.2.5",
@@ -22844,7 +22806,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -22853,7 +22814,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -22879,7 +22839,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
"requires": {
"isobject": "^3.0.0"
}
@@ -22932,7 +22891,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
"requires": {
"isobject": "^3.0.1"
}
@@ -22966,7 +22924,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
"requires": {
"wrappy": "1"
}
@@ -23069,8 +23026,7 @@
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"p-defer": {
"version": "1.0.0",
@@ -23270,8 +23226,46 @@
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "patch-package": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz",
+ "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==",
+ "requires": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^1.2.1",
+ "fs-extra": "^7.0.1",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.0",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ }
+ }
},
"path-browserify": {
"version": "0.0.1",
@@ -23294,14 +23288,12 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
},
"path-parse": {
"version": "1.0.6",
@@ -23491,8 +23483,7 @@
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
},
"postcss": {
"version": "7.0.27",
@@ -25698,7 +25689,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
"requires": {
"extend-shallow": "^3.0.2",
"safe-regex": "^1.1.0"
@@ -26098,14 +26088,12 @@
"repeat-element": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
},
"repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
"replace-ext": {
"version": "1.0.0",
@@ -26281,8 +26269,7 @@
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
},
"restore-cursor": {
"version": "3.1.0",
@@ -26297,8 +26284,7 @@
"ret": {
"version": "0.1.15",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
},
"reusify": {
"version": "1.0.4",
@@ -26331,7 +26317,6 @@
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
"requires": {
"glob": "^7.1.3"
}
@@ -26472,7 +26457,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
"requires": {
"ret": "~0.1.10"
}
@@ -26545,8 +26529,7 @@
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
"semver-compare": {
"version": "1.0.0",
@@ -26661,7 +26644,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "dev": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-extendable": "^0.1.1",
@@ -26673,7 +26655,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -26745,7 +26726,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
"requires": {
"shebang-regex": "^1.0.0"
}
@@ -26753,8 +26733,7 @@
"shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
},
"shell-quote": {
"version": "1.7.2",
@@ -26854,8 +26833,7 @@
"slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
},
"slice-ansi": {
"version": "2.1.0",
@@ -26880,7 +26858,6 @@
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
"requires": {
"base": "^0.11.1",
"debug": "^2.2.0",
@@ -26896,7 +26873,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -26905,7 +26881,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -26914,7 +26889,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -26922,8 +26896,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
@@ -26931,7 +26904,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
"requires": {
"define-property": "^1.0.0",
"isobject": "^3.0.0",
@@ -26942,7 +26914,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
"requires": {
"is-descriptor": "^1.0.0"
}
@@ -26951,7 +26922,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -26960,7 +26930,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
"requires": {
"kind-of": "^6.0.0"
}
@@ -26969,7 +26938,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
"requires": {
"is-accessor-descriptor": "^1.0.0",
"is-data-descriptor": "^1.0.0",
@@ -26982,7 +26950,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
"requires": {
"kind-of": "^3.2.0"
},
@@ -26991,7 +26958,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -27065,7 +27031,6 @@
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "dev": true,
"requires": {
"atob": "^2.1.2",
"decode-uri-component": "^0.2.0",
@@ -27095,8 +27060,7 @@
"source-map-url": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
},
"space-separated-tokens": {
"version": "1.1.5",
@@ -27163,7 +27127,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
"requires": {
"extend-shallow": "^3.0.0"
}
@@ -27220,7 +27183,6 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
"requires": {
"define-property": "^0.2.5",
"object-copy": "^0.1.0"
@@ -27230,7 +27192,6 @@
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
"requires": {
"is-descriptor": "^0.1.0"
}
@@ -28640,7 +28601,6 @@
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dev": true,
"requires": {
"os-tmpdir": "~1.0.2"
}
@@ -28666,7 +28626,6 @@
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
"requires": {
"kind-of": "^3.0.2"
},
@@ -28675,7 +28634,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -28686,7 +28644,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": true,
"requires": {
"define-property": "^2.0.2",
"extend-shallow": "^3.0.2",
@@ -28698,7 +28655,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
"requires": {
"is-number": "^3.0.0",
"repeat-string": "^1.6.1"
@@ -28998,7 +28954,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
"requires": {
"arr-union": "^3.1.0",
"get-value": "^2.0.6",
@@ -29155,8 +29110,7 @@
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
"unpipe": {
"version": "1.0.0",
@@ -29174,7 +29128,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
"requires": {
"has-value": "^0.3.1",
"isobject": "^3.0.0"
@@ -29184,7 +29137,6 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
"requires": {
"get-value": "^2.0.3",
"has-values": "^0.1.4",
@@ -29195,7 +29147,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
"requires": {
"isarray": "1.0.0"
}
@@ -29205,8 +29156,7 @@
"has-values": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
}
}
},
@@ -29227,8 +29177,7 @@
"urix": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
},
"url": {
"version": "0.11.0",
@@ -29290,8 +29239,7 @@
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
},
"use-callback-ref": {
"version": "1.2.1",
@@ -30104,7 +30052,6 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
"requires": {
"isexe": "^2.0.0"
}
@@ -30287,8 +30234,7 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"write": {
"version": "1.0.3",
diff --git a/package.json b/package.json
index 8c2f9ef79f13..e1dcbfd10ace 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"history": "^4.10.1",
"moment": "^2.25.3",
"mousetrap": "^1.6.5",
+ "patch-package": "^6.2.2",
"polished": "^3.6.2",
"prop-types": "^15.7.2",
"query-string": "^6.12.1",
@@ -161,6 +162,7 @@
"lint:php": "vendor/bin/phpcs",
"lint:php:fix": "vendor/bin/phpcbf",
"lint:md": "markdownlint .",
+ "postinstall": "npx patch-package",
"storybook": "start-storybook --quiet",
"test": "npm-run-all --parallel test:*",
"test:js": "jest --config=tests/js/jest.config.js",
diff --git a/patches/draft-js-import-element+1.4.0.patch b/patches/draft-js-import-element+1.4.0.patch
new file mode 100644
index 000000000000..25f49e233fb5
--- /dev/null
+++ b/patches/draft-js-import-element+1.4.0.patch
@@ -0,0 +1,26 @@
+diff --git a/node_modules/draft-js-import-element/esm/stateFromElement.js b/node_modules/draft-js-import-element/esm/stateFromElement.js
+index eccabfd..9ec7496 100644
+--- a/node_modules/draft-js-import-element/esm/stateFromElement.js
++++ b/node_modules/draft-js-import-element/esm/stateFromElement.js
+@@ -373,7 +373,7 @@ function () {
+ switch (customInline.type) {
+ case 'STYLE':
+ {
+- style = style.add(customInline.style);
++ [].concat(customInline.style).forEach(customStyle => { style = style.add(customStyle); });
+ break;
+ }
+
+diff --git a/node_modules/draft-js-import-element/lib/stateFromElement.js b/node_modules/draft-js-import-element/lib/stateFromElement.js
+index e814c05..c469bda 100644
+--- a/node_modules/draft-js-import-element/lib/stateFromElement.js
++++ b/node_modules/draft-js-import-element/lib/stateFromElement.js
+@@ -389,7 +389,7 @@ function () {
+ switch (customInline.type) {
+ case 'STYLE':
+ {
+- style = style.add(customInline.style);
++ [].concat(customInline.style).forEach(customStyle => { style = style.add(customStyle); });
+ break;
+ }
+
diff --git a/tests/js/jest.setup.js b/tests/js/jest.setup.js
index 711f3eda18bf..3d3330af6691 100644
--- a/tests/js/jest.setup.js
+++ b/tests/js/jest.setup.js
@@ -21,6 +21,7 @@
// See https://github.com/testing-library/jest-dom.
import 'jest-extended';
import '@testing-library/jest-dom';
+import 'jest-extended';
/**
* Internal dependencies