...
 
Commits (6)
# build environment
FROM node:12-alpine as build
FROM node:current as build
WORKDIR /app
# RUN npm i -g yarn
COPY package.json ./
COPY yarn.lock ./
......@@ -11,6 +12,7 @@ ARG API_URL
ENV REACT_APP_API_URL=${API_URL}
ARG BUILD_VERSION
ENV REACT_APP_BUILD_VERSION=${BUILD_VERSION}
ENV GENERATE_SOURCEMAP=false
RUN npm run build
# production environment
......
......@@ -4,6 +4,7 @@
"private": true,
"dependencies": {
"@apollo/react-hooks": "^3.1.0",
"@ckeditor/ckeditor5-react": "^2.1.0",
"@types/google-libphonenumber": "^7.4.17",
"@types/jest": "24.0.18",
"@types/node": "12.7.5",
......@@ -19,18 +20,20 @@
"react": "^16.9.0",
"react-big-calendar": "^0.22.1",
"react-dom": "^16.9.0",
"react-emoji-render": "^1.2.1",
"react-markdown": "^4.2.2",
"react-router": "^5.1.2",
"react-router-dom": "^5.1.2",
"react-scripts": "^3.2.0",
"react-textarea-autosize": "^7.1.2",
"semantic-ui-react": "^0.88.1",
"sigma-ckeditor5-build": "https://gitlab.binets.fr/br/sigma-ckeditor5-build.git",
"typescript": "^3.6.3",
"use-debounce": "^3.3.0"
},
"scripts": {
"start": "craco start",
"build": "craco build",
"build": "GENERATE_SOURCEMAP=false craco build",
"test": "craco test",
"eject": "craco eject"
},
......
import React, {ChangeEvent, useState} from "react";
import React, {useState} from "react";
import {Form} from "semantic-ui-react";
import {useMutation} from "@apollo/react-hooks";
import {gql} from "apollo-boost";
import {MessageBase, messageBase} from "../../services/apollo/fragments/message";
import GraphQLError from "../Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import SendAsDropdown from "./SendAsDropdown";
import TextEditor from "../TextEditor";
export interface CommentFormProps {
parent: string
......@@ -71,12 +71,10 @@ function CommentForm(props: CommentFormProps) {
value={title}
onChange={(_, {value}) => setTitle(value)}
/>
<Form.Field
label='Comment'
placeholder='You can use Markdown !'
value={content}
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}/>
<Form.Field>
<label>Comment</label>
<TextEditor text={content} setText={setContent} placeholder="Leave a comment!"/>
</Form.Field>
<SendAsDropdown asGroup={asGroup} setAsGroup={setAsGroup}/>
<Form.Button
type="submit"
......
import React from "react";
import ReactMarkdown from "react-markdown";
import {parseEmojis} from "../services/emojis";
export interface MarkdownDisplayerProps {
text: string
}
function MarkdownDisplayer(props: MarkdownDisplayerProps) {
const {text} = props;
return <ReactMarkdown source={parseEmojis(text)}/>;
}
export default MarkdownDisplayer;
......@@ -7,7 +7,7 @@ import {RoutesBuilders} from "../../constants/routes";
import MessageAuthors from "./MessageAuthors";
import MessageRecipients from "./MessageRecipients";
import {MessageBase} from "../../services/apollo/fragments/message";
import ReactMarkdown from "react-markdown";
import MarkdownDisplayer from "../MarkdownDisplayer";
export function MessageFeedItem(props: { m: MessageExtended | MessageBase }) {
const {m} = props;
......@@ -32,7 +32,7 @@ export function MessageFeedItem(props: { m: MessageExtended | MessageBase }) {
{m.title}
</Feed.Summary>
<Feed.Extra text>
<ReactMarkdown source={m.content}/>
<MarkdownDisplayer text={m.content}/>
</Feed.Extra>
<Feed.Meta>
{m.children && m.children.length > 0 && <>{m.children.length} answers</>}
......
import React, {ChangeEvent} from "react";
// @ts-ignore
import CKEditor from '@ckeditor/ckeditor5-react';
// @ts-ignore
import ClassicEditor from 'sigma-ckeditor5-build';
export interface TextEditorProps {
text: string
setText: (t: string) => void
placeholder?: string
}
function TextEditor(props: TextEditorProps) {
const {text, setText, placeholder} = props;
return (
<CKEditor
editor={ClassicEditor}
data={text}
onChange={(event: ChangeEvent, editor: any) => setText(editor.getData())}
placeholder={placeholder}
/>
);
}
export default TextEditor;
......@@ -7,8 +7,8 @@ import {Group} from "../../constants/types";
import {LoadingMessage} from "../../components/Messages/LoadingMessage";
import {RoutesBuilders} from "../../constants/routes";
import {useHistory} from "react-router-dom";
import ReactMarkdown from "react-markdown";
import GraphQLError from "../../components/Messages/Errors";
import MarkdownDisplayer from "../../components/MarkdownDisplayer";
const SEARCH_GROUP = gql`
query SearchGroup($search: String) {
......@@ -65,7 +65,7 @@ function GroupCard(props: GroupCardProps) {
meta={"@" + g.gid}
description={
<div style={{maxHeight: '20em', overflow: 'hidden'}}>
<ReactMarkdown source={g.description || ""}/>
<MarkdownDisplayer text={g.description || ""}/>
</div>
}
/>
......
import React, {ChangeEvent, useContext, useState} from "react";
import React, {useContext, useState} from "react";
import {
Container,
Divider,
......@@ -21,7 +21,7 @@ import {EventBase, eventBase} from "../../services/apollo/fragments/event";
import UserContext from "../../components/UserContext/context";
import {makeMomentFromDateAndTime} from "../../services/date";
import GraphQLError from "../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../components/TextEditor";
const CREATE_EVENT = gql`
mutation createEvent(
......@@ -134,18 +134,15 @@ function CreateEventPage() {
</Segment>
<Segment>
<Form.Input
label="title"
label="Title"
placeholder="title"
value={title}
onChange={(e) => setTitle(e.target.value)}
/>
<Form.Field
control={TextareaAutosize}
label="content"
placeholder="content"
value={content}
onChange={(e: ChangeEvent<HTMLInputElement>) => setContent(e.target.value)}
/>
<Form.Field>
<label>Content</label>
<TextEditor text={content} setText={setContent} placeholder="Describe here your event!"/>
</Form.Field>
<Form.Input
label="location"
placeholder="location"
......
import React, {ChangeEvent, useContext, useEffect, useState} from "react";
import React, {useContext, useEffect, useState} from "react";
import {Button, Container, Dropdown, Form, Header, Message} from "semantic-ui-react";
import {gql} from "apollo-boost";
import {useMutation} from "@apollo/react-hooks";
......@@ -7,7 +7,7 @@ import {useHistory} from "react-router-dom";
import {RoutesBuilders} from "../../constants/routes";
import UserContext from "../../components/UserContext/context";
import GraphQLError from "../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../components/TextEditor";
const CREATE_GROUP = gql`
mutation createGroup($fromGroup: ID!, $name: String!, $description: String, $mail: String, $school: String, $website: String) {
......@@ -69,13 +69,14 @@ function CreateGroup() {
value={name}
onChange={(_, {value}) => setName(value)}
/>
<Form.Field
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setDescription(e.target.value)}
label="Description"
placeholder="Le Binet Tchoupix permet à ses adérents d'accéder à une collection impressionante d'albums, et à des conférences sur le sujet"
value={description}
/>
<Form.Field>
<label>Description</label>
<TextEditor
text={description}
setText={setDescription}
placeholder="Le Binet Tchoupix permet à ses adérents d'accéder à une collection impressionante d'albums, et à des conférences sur le sujet"
/>
</Form.Field>
<Form.Input
label="Mail"
placeholder="tchoupix@eleves.polytechnique.fr"
......
import React, {ChangeEvent, useState} from "react";
import React, {useState} from "react";
import {Container, Form, Header, Label} from "semantic-ui-react";
import {gql} from "apollo-boost";
import {useMutation} from "@apollo/react-hooks";
......@@ -8,8 +8,8 @@ import {RoutesBuilders} from "../../constants/routes";
import GroupSearch from "../../components/GroupSearch/GroupSearch";
import {GroupBase} from "../../services/apollo/fragments/groupBase";
import GraphQLError from "../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import SendAsDropdown from "../../components/CommentForm/SendAsDropdown";
import TextEditor from "../../components/TextEditor";
const CREATE = gql`
mutation createMessage ($title: String!, $content: String!, $toGroups: [ID!]) {
......@@ -75,13 +75,10 @@ function CreateMessagePage() {
value={title}
onChange={(_, {value}) => setTitle(value)}
/>
<Form.Field
label='Comment'
placeholder='You can use Markdown !'
value={content}
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}
/>
<Form.Field>
<label>Comment</label>
<TextEditor text={content} setText={setContent} placeholder='You can use Markdown !'/>
</Form.Field>
<Form.Group inline>
<SendAsDropdown setAsGroup={setAsGroup} asGroup={asGroup}/>
<span style={{minWidth: 10}}/>
......
......@@ -7,7 +7,6 @@ import GraphQLError from "../../components/Messages/Errors";
import {Button, Container, Feed, Header, List, Segment} from "semantic-ui-react";
import {Link, useParams} from "react-router-dom";
import {RoutesBuilders} from "../../constants/routes";
import ReactMarkdown from "react-markdown";
import ParticipateButton from "./components/ParticipateButton";
import UserContext from "../../components/UserContext/context";
import EditEvent from "./components/EditEvent";
......@@ -16,6 +15,7 @@ import {ParticipatingGroups, ParticipatingUsers} from "../events/components/Part
import MessageFeedItem from "../../components/Message/MessageFeedItem";
import CreatePost from "./components/CreatePost";
import {PERMISSION_STATUS} from "../../constants/types";
import MarkdownDisplayer from "../../components/MarkdownDisplayer";
const GET_EVENT = gql`
query event($eid: ID!) {
......@@ -34,10 +34,10 @@ function EventPage() {
const [edit, setEdit] = useState<boolean>(false);
if (loading)
return <LoadingMessage/>;
return <Container><LoadingMessage/></Container>;
if (!data || !data.event || error)
return <GraphQLError error={error}/>;
return <Container><GraphQLError error={error}/></Container>;
const e: EventWithParticipation = data.event;
const isAdmin = user && e.authors && user.speakerOf.map(g => g.gid).indexOf(e.authors[0].gid) !== -1;
......@@ -75,7 +75,7 @@ function EventPage() {
</Segment>
: <>
<Segment vertical>
<ReactMarkdown source={e.content}/>
<MarkdownDisplayer text={e.content}/>
</Segment>
<Segment vertical>
<List relaxed>
......
import React, {ChangeEvent, useState} from "react";
import React, {useState} from "react";
import {Form} from "semantic-ui-react";
import {useMutation} from "@apollo/react-hooks";
import {gql} from "apollo-boost";
import {MessageBase, messageBase} from "../../../services/apollo/fragments/message";
import GraphQLError from "../../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../../components/TextEditor";
const COMMENT = gql`
mutation createUserPrivateEventPost($forEvent: ID!, $content: String!, $title: String!) {
......@@ -46,13 +46,10 @@ function CreatePost (props: CreatePostProps) {
value={title}
onChange={(_, {value}) => setTitle(value)}
/>
<Form.Field
control={TextareaAutosize}
label='Comment'
placeholder='You can use Markdown !'
value={content}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}
/>
<Form.Field>
<label>Comment</label>
<TextEditor text={content} setText={setContent} placeholder="The content of your message..."/>
</Form.Field>
<Form.Button type="submit" loading={loading}>Submit</Form.Button>
{error && <GraphQLError error={error}/>}
</Form>
......
import React, {ChangeEvent, useState} from "react";
import React, {useState} from "react";
import {eventExtended, EventExtended} from "../../../services/apollo/fragments/event";
import {Form, Message} from "semantic-ui-react";
import {gql} from "apollo-boost";
......@@ -8,7 +8,7 @@ import {makeMomentFromDateAndTime} from "../../../services/date";
import moment from "moment";
import {Date} from "../../../components/date";
import GraphQLError from "../../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../../components/TextEditor";
const EDIT_EVENT = gql`
mutation editEvent (
......@@ -80,14 +80,10 @@ function EditEvent(props: EditEventProps) {
/>
<Form.Field>
<label>Content</label>
<Form.Field
label='Comment'
placeholder='You can use Markdown !'
value={content}
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}
/>
<Form.Field>
<label>Comment</label>
<TextEditor text={content} setText={setContent} placeholder='You can use Markdown !'/>
</Form.Field>
</Form.Field>
<Form.Input
label="Location"
......@@ -108,7 +104,7 @@ function EditEvent(props: EditEventProps) {
/>
soit <Date m={makeMomentFromDateAndTime(startDate, startTime)}/>
</Form.Group>
<Form.Group inline error={error}>
<Form.Group inline error={error || undefined}>
<label>Fin : </label>
<Form.Input
type="date"
......
import React, {useState} from 'react';
import {Button, Form, Header, Segment} from 'semantic-ui-react';
import ReactMarkdown from "react-markdown";
import gql from "graphql-tag";
import {groupBase} from "../../../services/apollo/fragments/groupBase";
import {useMutation} from "@apollo/react-hooks";
......@@ -10,6 +9,7 @@ import MemberRequests from "./MemberRequests";
import GraphQLError from "../../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import {ChangeLogo} from "../../../components/ChangeImage/ChangeImage";
import MarkdownDisplayer from "../../../components/MarkdownDisplayer";
const EDIT_GROUP_DESCRIPTION = gql`
mutation editGroupDescription($gid: ID!, $description: String!) {
......@@ -147,7 +147,7 @@ export function GroupAdministrer({group, refetch}: GroupAdministrerProps) {
name="Description"
placeholder="La description du groupe. Tu peux utiliser du Markdown !"
inputComponent={TextareaAutosize}
displayComponent={ReactMarkdown}
displayComponent={MarkdownDisplayer}
/>
<EditVariable
......
import React, {ChangeEvent, useState} from "react";
import ReactMarkdown from "react-markdown";
import React, {useState} from "react";
import {Button, Divider, Form, Header, Label, Message, Segment} from "semantic-ui-react";
import {gql} from "apollo-boost";
import {groupBase} from "../../../services/apollo/fragments/groupBase";
import {useMutation} from "@apollo/react-hooks";
import GraphQLError from "../../../components/Messages/Errors";
import {useParams} from "react-router-dom";
import TextareaAutosize from "react-textarea-autosize";
import MarkdownDisplayer from "../../../components/MarkdownDisplayer";
import TextEditor from "../../../components/TextEditor";
export interface FrontPageProps {
frontPage: string
......@@ -53,12 +53,11 @@ function FrontPage(props: FrontPageProps) {
{error && <GraphQLError error={error}/>}
{edition && <>
<Form>
<Form.Field
placeholder='Write here what the user will see on your frontPage. You can use Markdown !'
value={value}
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setValue(e.target.value)}
/>
<Form.Field>
<label>Frontpage text</label>
<TextEditor text={value} setText={setValue}
placeholder='Write here what the user will see on your frontPage'/>
</Form.Field>
<Form.Group>
<Form.Button
color="green"
......@@ -84,7 +83,7 @@ function FrontPage(props: FrontPageProps) {
</Header>
<Divider hidden/>
</>}
<ReactMarkdown source={value}/>
<MarkdownDisplayer text={value}/>
</Segment>
</>
);
......
......@@ -6,7 +6,7 @@ import {requestBase} from "../../../services/apollo/fragments/request";
import {useMutation} from "@apollo/react-hooks";
import {GroupBase} from "../../../services/apollo/fragments/groupBase";
import GraphQLError from "../../../components/Messages/Errors";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../../components/TextEditor";
const MAKE_REQUEST = gql`
mutation makeRequest($gid: ID!, $comment: String) {
......@@ -82,11 +82,8 @@ function MakeRequestButton(props: RequestButtonProps) {
<Form onSubmit={() => makeRequest({variables: {gid: g.gid, comment}})}>
<Form.Field>
<label>Commentaire</label>
<TextareaAutosize
placeholder="Leave a comment to the group admin !"
value={comment}
onChange={(e) => 'value' in e.target && setComment(e.target.value)}
/>
<TextEditor text={comment} setText={setComment}
placeholder="Leave a comment to the group admin !"/>
</Form.Field>
<Button.Group fluid>
<Button
......
......@@ -8,7 +8,7 @@ import {GroupBase, groupBase} from "../../../services/apollo/fragments/groupBase
import {LoadingMessage} from "../../../components/Messages/LoadingMessage";
import GraphQLError from "../../../components/Messages/Errors";
import {useParams} from "react-router-dom";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../../components/TextEditor";
export interface MessagesPageProps {
privateMessages?: boolean
......@@ -90,11 +90,7 @@ function PostForm(props: { gid: string, refetch: () => void, publicMode: boolean
/>
<Form.Field>
<label>Comment</label>
<TextareaAutosize
placeholder='You can use Markdown !'
value={content}
onChange={(e) => setContent(e.target.value)}
/>
<TextEditor text={content} setText={setContent} placeholder='You can use Markdown !'/>
</Form.Field>
<Form.Button type="submit" loading={loading}>Submit</Form.Button>
{error && <GraphQLError error={error}/>}
......
import {MessageExtended} from "../../../services/apollo/fragments/messageExtended";
import {Divider, Feed, Header, List, Segment} from "semantic-ui-react";
import ReactMarkdown from "react-markdown";
import React from "react";
import {Link} from "react-router-dom";
import {RoutesBuilders} from "../../../constants/routes";
......@@ -9,6 +8,7 @@ import MessageRecipients from "../../../components/Message/MessageRecipients";
import {Date} from "../../../components/date";
import MessageFeedItem from "../../../components/Message/MessageFeedItem";
import CommentForm from "../../../components/CommentForm/CommentForm";
import MarkdownDisplayer from "../../../components/MarkdownDisplayer";
export interface DisplayMessageProps {
m: MessageExtended,
......@@ -38,14 +38,14 @@ export function DisplayMessage(props: DisplayMessageProps) {
</List.Item>
</List>
<Divider/>
<ReactMarkdown source={m.content}/>
<MarkdownDisplayer text={m.content}/>
<Divider hidden/>
{m.forEvent && <>
<Segment>
<Header icon="calendar" content="Related event" as="h3"/>
<Header size="small" as={Link} to={RoutesBuilders.Event(m.forEvent.eid)}
content={m.forEvent.title}/>
<ReactMarkdown source={m.forEvent.content}/>
<MarkdownDisplayer text={m.forEvent.content}/>
</Segment>
<Divider hidden/>
</>}
......@@ -53,7 +53,7 @@ export function DisplayMessage(props: DisplayMessageProps) {
<Segment>
<Header icon="mail" content="Parent " as="h3"/>
<Header size="small" as={Link} to={RoutesBuilders.Message(m.parent.mid)} content={m.parent.title}/>
<ReactMarkdown source={m.parent.content}/>
<MarkdownDisplayer text={m.parent.content}/>
</Segment>
<Divider hidden/>
</>}
......
import React, {ChangeEvent, useState} from "react";
import React, {useState} from "react";
import {MessageBase, messageBase} from "../../../services/apollo/fragments/message";
import {gql} from "apollo-boost";
import {Button, Form, Header, Segment} from "semantic-ui-react";
import {useMutation} from "@apollo/react-hooks";
import GraphQLError from "../../../components/Messages/Errors";
import {MessageExtended} from "../../../services/apollo/fragments/messageExtended";
import TextareaAutosize from "react-textarea-autosize";
import TextEditor from "../../../components/TextEditor";
const EDIT_MESSAGE = gql`
mutation editMessage($title: String, $mid: ID!, $content: String) {
......@@ -62,13 +62,7 @@ function EditMessage(props: EditMessageProps) {
/>
<Form.Field>
<label>Content</label>
<Form.Field
placeholder='Write here what the user will see on your frontPage. You can use Markdown !'
value={content}
control={TextareaAutosize}
onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setContent(e.target.value)}
/>
<TextEditor text={content} setText={setContent} placeholder='You can use Markdown !'/>
</Form.Field>
<Button
color="yellow"
......
......@@ -36,7 +36,7 @@ function minID(messages: MessageExtended[]) {
function MessagesPage() {
const {data, loading, error, fetchMore} = useQuery<{ allPrivatePosts: MessageExtended[] }, QueryParams>(PRIVATE_POSTS, {
errorPolicy: "ignore",
fetchPolicy: 'cache-and-network',
fetchPolicy: 'cache-first',
notifyOnNetworkStatusChange: true,
variables: {limit: NB_MESSAGES_IN_A_QUERY},
});
......
......@@ -3,7 +3,7 @@ import {Accordion, Icon, Image, List} from "semantic-ui-react";
import {Link} from "react-router-dom";
import {Group} from "../../../constants/types";
import {RoutesBuilders} from "../../../constants/routes";
import ReactMarkdown from "react-markdown";
import MarkdownDisplayer from "../../../components/MarkdownDisplayer";
interface GroupItemProps {
group: Group,
......@@ -72,7 +72,7 @@ export function UserMemberships(props: UserMembershipsProps) {
{gr.name}
</List.Header>
<List.Description>
<ReactMarkdown source={gr.description}/>
<MarkdownDisplayer text={gr.description || ""}/>
</List.Description>
{expanded && gr.parents && (
<GroupItemAccordion group={gr}/>
......
// @ts-ignore
import {toArray} from "react-emoji-render";
export const parseEmojis = (value: string) => {
const emojisArray = toArray(value);
// toArray outputs React elements for emojis and strings for other
return emojisArray.reduce((previous: any, current: any) => {
if (typeof current === "string") {
return previous + current;
}
return previous + current.props.children;
}, "");
};
......@@ -1054,6 +1054,35 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
"@ckeditor/ckeditor5-engine@^16.0.0":
version "16.0.0"
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-16.0.0.tgz#68d8fabb4fa31541c9870cc94b021c5cb0f72d4f"
integrity sha512-2p0DT/1B+UyVAwNkkaNaG4wGkrR0TNQuPJ1c5TEMWb9NVk3mhIOJ+6lPVl0ApP3tmMALol+pLmXLX5aht6Ewnw==
dependencies:
"@ckeditor/ckeditor5-utils" "^16.0.0"
lodash-es "^4.17.10"
"@ckeditor/ckeditor5-markdown-gfm@^16.0.0":
version "16.0.0"
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-16.0.0.tgz#e8385498013c913b4cde3333fb9f00f4cd167f52"
integrity sha512-fHzkfS8KkIw8CjKhmgnVg6OWdkUcEn5dTjqVFRaPMLLqJ1299DlfIuTrNSkF2ttSWwSDMwk/q195SzyacnvDhA==
dependencies:
"@ckeditor/ckeditor5-engine" "^16.0.0"
"@ckeditor/ckeditor5-react@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-react/-/ckeditor5-react-2.1.0.tgz#f612546a5a328899a436d71b72ffd632600049e8"
integrity sha512-rlHjRKhwP9tNK0Yj2UJShL14mRfxLPgJ+Pv6zTv/Mvmd4wrwGnJf+5ybOAGK92S02hP1cXH+9km+PRO1b4V+ng==
dependencies:
prop-types "^15.6.1"
"@ckeditor/ckeditor5-utils@^16.0.0":
version "16.0.0"
resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-16.0.0.tgz#9f7851d0271deebe3db3a5f8f1ca1c1ad6cfdcbc"
integrity sha512-EMrKmVmxfyuttGlbZI0eK7stYigbo2kFCasN0m2apg/Pn4Dwil0pennWuJ964zvZ8te1Pyt33cweQZlYzSqvYQ==
dependencies:
lodash-es "^4.17.10"
"@cnakazawa/watch@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
......@@ -2950,7 +2979,7 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.6:
classnames@^2.2.5, classnames@^2.2.6:
version "2.2.6"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
......@@ -3995,6 +4024,11 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
emoji-regex@^6.4.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==
emoji-regex@^7.0.1, emoji-regex@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
......@@ -5515,7 +5549,7 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0"
ipaddr.js "^1.9.0"
invariant@^2.2.2, invariant@^2.2.4:
invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
......@@ -6701,7 +6735,7 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.17.11:
lodash-es@^4.17.10, lodash-es@^4.17.11:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
......@@ -6716,6 +6750,16 @@ lodash.camelcase@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.flatten@^4.2.0, lodash.flatten@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
lodash.isstring@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
......@@ -8675,7 +8719,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.3"
prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.5.8, 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.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
......@@ -8904,6 +8948,17 @@ react-dom@^16.9.0:
prop-types "^15.6.2"
scheduler "^0.18.0"
react-emoji-render@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-emoji-render/-/react-emoji-render-1.2.1.tgz#646302217ffe9af53033b8582e930c7933ce58e5"
integrity sha512-h6gBzD63LEUt06WiwIlipbX9deYzfdWBmWpN0exGnMk2BoyVmtZ33B9ep0C6jmt4Un3wJN2CPJV4E1+uXS4inQ==
dependencies:
classnames "^2.2.5"
emoji-regex "^6.4.1"
lodash.flatten "^4.4.0"
prop-types "^15.5.8"
string-replace-to-array "^1.0.1"
react-error-overlay@^6.0.4:
version "6.0.4"
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.4.tgz#0d165d6d27488e660bc08e57bdabaad741366f7a"
......@@ -9788,6 +9843,12 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
"sigma-ckeditor5-build@https://gitlab.binets.fr/br/sigma-ckeditor5-build.git":
version "16.0.0"
resolved "https://gitlab.binets.fr/br/sigma-ckeditor5-build.git#283bd8f34615f1492e66f4c1eda7c112f56436d0"
dependencies:
"@ckeditor/ckeditor5-markdown-gfm" "^16.0.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
......@@ -10102,6 +10163,15 @@ string-length@^3.1.0:
astral-regex "^1.0.0"
strip-ansi "^5.2.0"
string-replace-to-array@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/string-replace-to-array/-/string-replace-to-array-1.0.3.tgz#c93eba999a5ee24d731aebbaf5aba36b5f18f7bf"
integrity sha1-yT66mZpe4k1zGuu69auja18Y978=
dependencies:
invariant "^2.2.1"
lodash.flatten "^4.2.0"
lodash.isstring "^4.0.1"
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
......