diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 30ce26ee6..ad50ecfdb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -111,9 +111,9 @@ pages: docker: stage: deploy - image: docker:24.0.7 + image: docker:24.0.9 services: - - docker:24.0.7-dind + - docker:24.0.9-dind tags: - dind # https://medium.com/devops-with-valentine/how-to-build-a-docker-image-and-push-it-to-the-gitlab-container-registry-from-a-gitlab-ci-pipeline-acac0d1f26df diff --git a/package.json b/package.json index ef7024d71..f86f62c0a 100644 --- a/package.json +++ b/package.json @@ -55,12 +55,12 @@ "@fontsource/roboto-mono": "^5.0.0", "@fontsource/tajawal": "^5.0.8", "@gamestdio/websocket": "^0.3.2", - "@lexical/clipboard": "^0.12.4", - "@lexical/hashtag": "^0.12.4", - "@lexical/link": "^0.12.4", - "@lexical/react": "^0.12.4", - "@lexical/selection": "^0.12.4", - "@lexical/utils": "^0.12.4", + "@lexical/clipboard": "^0.13.1", + "@lexical/hashtag": "^0.13.1", + "@lexical/link": "^0.13.1", + "@lexical/react": "^0.13.1", + "@lexical/selection": "^0.13.1", + "@lexical/utils": "^0.13.1", "@noble/hashes": "^1.3.3", "@popperjs/core": "^2.11.5", "@reach/combobox": "^0.18.0", @@ -127,7 +127,7 @@ "intl-pluralrules": "^2.0.0", "isomorphic-dompurify": "^2.3.0", "leaflet": "^1.8.0", - "lexical": "^0.12.4", + "lexical": "^0.13.1", "line-awesome": "^1.3.0", "localforage": "^1.10.0", "lodash": "^4.7.11", @@ -210,7 +210,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-tailwindcss": "^3.13.0", "fake-indexeddb": "^5.0.0", - "husky": "^8.0.0", + "husky": "^9.0.0", "jsdom": "^23.0.0", "lint-staged": ">=10", "react-intl-translations-manager": "^5.0.3", diff --git a/src/features/compose/editor/plugins/autosuggest-plugin.tsx b/src/features/compose/editor/plugins/autosuggest-plugin.tsx index ee5729059..5afc6c748 100644 --- a/src/features/compose/editor/plugins/autosuggest-plugin.tsx +++ b/src/features/compose/editor/plugins/autosuggest-plugin.tsx @@ -324,7 +324,7 @@ const AutosuggestPlugin = ({ dispatch(chooseEmoji(suggestion)); replaceMatch($createEmojiNode(suggestion)); } else if (suggestion[0] === '#') { - node.setTextContent(`${suggestion} `); + (node as TextNode).setTextContent(`${suggestion} `); node.select(); } else { const account = selectAccount(getState(), suggestion)!; diff --git a/src/features/compose/editor/plugins/link-plugin.tsx b/src/features/compose/editor/plugins/link-plugin.tsx index 175f3184f..fac30f66c 100644 --- a/src/features/compose/editor/plugins/link-plugin.tsx +++ b/src/features/compose/editor/plugins/link-plugin.tsx @@ -7,7 +7,16 @@ import { LinkPlugin as LexicalLinkPlugin } from '@lexical/react/LexicalLinkPlugin'; import * as React from 'react'; -import { validateUrl } from '../utils/url'; +// Source: https://stackoverflow.com/a/8234912/2013580 +const urlRegExp = new RegExp( + /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/, +); + +export const validateUrl = (url: string): boolean => { + // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://. + // Maybe show a dialog where they user can type the URL before inserting it. + return url === 'https://' || urlRegExp.test(url); +}; const LinkPlugin = (): JSX.Element => { return ; diff --git a/src/features/compose/editor/utils/get-dom-range-rect.ts b/src/features/compose/editor/utils/get-dom-range-rect.ts deleted file mode 100644 index fe6d10ad0..000000000 --- a/src/features/compose/editor/utils/get-dom-range-rect.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -/* eslint-disable eqeqeq */ - -export const getDOMRangeRect = ( - nativeSelection: Selection, - rootElement: HTMLElement, -): DOMRect => { - const domRange = nativeSelection.getRangeAt(0); - - let rect; - - if (nativeSelection.anchorNode === rootElement) { - let inner = rootElement; - while (inner.firstElementChild != null) { - inner = inner.firstElementChild as HTMLElement; - } - rect = inner.getBoundingClientRect(); - } else { - rect = domRange.getBoundingClientRect(); - } - - return rect; -}; diff --git a/src/features/compose/editor/utils/get-selected-node.ts b/src/features/compose/editor/utils/get-selected-node.ts deleted file mode 100644 index 2f093b983..000000000 --- a/src/features/compose/editor/utils/get-selected-node.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -import { $isAtNodeEnd } from '@lexical/selection'; -import { ElementNode, RangeSelection, TextNode } from 'lexical'; - -export const getSelectedNode = ( - selection: RangeSelection, -): TextNode | ElementNode => { - const anchor = selection.anchor; - const focus = selection.focus; - const anchorNode = selection.anchor.getNode(); - const focusNode = selection.focus.getNode(); - if (anchorNode === focusNode) { - return anchorNode; - } - const isBackward = selection.isBackward(); - if (isBackward) { - return $isAtNodeEnd(focus) ? anchorNode : focusNode; - } else { - return $isAtNodeEnd(anchor) ? focusNode : anchorNode; - } -}; diff --git a/src/features/compose/editor/utils/is-html-element.ts b/src/features/compose/editor/utils/is-html-element.ts deleted file mode 100644 index f7ff6f639..000000000 --- a/src/features/compose/editor/utils/is-html-element.ts +++ /dev/null @@ -1,4 +0,0 @@ -const isHTMLElement = (x: unknown): x is HTMLElement => x instanceof HTMLElement; - -export default isHTMLElement; -export { isHTMLElement }; diff --git a/src/features/compose/editor/utils/point.ts b/src/features/compose/editor/utils/point.ts deleted file mode 100644 index 38e825b18..000000000 --- a/src/features/compose/editor/utils/point.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -class Point { - - private readonly _x: number; - private readonly _y: number; - - constructor(x: number, y: number) { - this._x = x; - this._y = y; - } - - get x(): number { - return this._x; - } - - get y(): number { - return this._y; - } - - public equals({ x, y }: Point): boolean { - return this.x === x && this.y === y; - } - - public calcDeltaXTo({ x }: Point): number { - return this.x - x; - } - - public calcDeltaYTo({ y }: Point): number { - return this.y - y; - } - - public calcHorizontalDistanceTo(point: Point): number { - return Math.abs(this.calcDeltaXTo(point)); - } - - public calcVerticalDistance(point: Point): number { - return Math.abs(this.calcDeltaYTo(point)); - } - - public calcDistanceTo(point: Point): number { - return Math.sqrt( - Math.pow(this.calcDeltaXTo(point), 2) + - Math.pow(this.calcDeltaYTo(point), 2), - ); - } - -} - -const isPoint = (x: unknown): x is Point => x instanceof Point; - -export default Point; -export { Point, isPoint }; diff --git a/src/features/compose/editor/utils/rect.ts b/src/features/compose/editor/utils/rect.ts deleted file mode 100644 index 2cccc9a60..000000000 --- a/src/features/compose/editor/utils/rect.ts +++ /dev/null @@ -1,163 +0,0 @@ -/* eslint-disable no-dupe-class-members */ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -import { isPoint, Point } from './point'; - -type ContainsPointReturn = { - result: boolean; - reason: { - isOnTopSide: boolean; - isOnBottomSide: boolean; - isOnLeftSide: boolean; - isOnRightSide: boolean; - }; -}; - -class Rect { - - private readonly _left: number; - private readonly _top: number; - private readonly _right: number; - private readonly _bottom: number; - - constructor(left: number, top: number, right: number, bottom: number) { - const [physicTop, physicBottom] = - top <= bottom ? [top, bottom] : [bottom, top]; - - const [physicLeft, physicRight] = - left <= right ? [left, right] : [right, left]; - - this._top = physicTop; - this._right = physicRight; - this._left = physicLeft; - this._bottom = physicBottom; - } - - get top(): number { - return this._top; - } - - get right(): number { - return this._right; - } - - get bottom(): number { - return this._bottom; - } - - get left(): number { - return this._left; - } - - get width(): number { - return Math.abs(this._left - this._right); - } - - get height(): number { - return Math.abs(this._bottom - this._top); - } - - public equals({ top, left, bottom, right }: Rect): boolean { - return ( - top === this._top && - bottom === this._bottom && - left === this._left && - right === this._right - ); - } - - public contains({ x, y }: Point): ContainsPointReturn; - public contains({ top, left, bottom, right }: Rect): boolean; - public contains(target: Point | Rect): boolean | ContainsPointReturn { - if (isPoint(target)) { - const { x, y } = target; - - const isOnTopSide = y < this._top; - const isOnBottomSide = y > this._bottom; - const isOnLeftSide = x < this._left; - const isOnRightSide = x > this._right; - - const result = - !isOnTopSide && !isOnBottomSide && !isOnLeftSide && !isOnRightSide; - - return { - reason: { - isOnBottomSide, - isOnLeftSide, - isOnRightSide, - isOnTopSide, - }, - result, - }; - } else { - const { top, left, bottom, right } = target; - - return ( - top >= this._top && - top <= this._bottom && - bottom >= this._top && - bottom <= this._bottom && - left >= this._left && - left <= this._right && - right >= this._left && - right <= this._right - ); - } - } - - public intersectsWith(rect: Rect): boolean { - const { left: x1, top: y1, width: w1, height: h1 } = rect; - const { left: x2, top: y2, width: w2, height: h2 } = this; - const maxX = x1 + w1 >= x2 + w2 ? x1 + w1 : x2 + w2; - const maxY = y1 + h1 >= y2 + h2 ? y1 + h1 : y2 + h2; - const minX = x1 <= x2 ? x1 : x2; - const minY = y1 <= y2 ? y1 : y2; - return maxX - minX <= w1 + w2 && maxY - minY <= h1 + h2; - } - - public generateNewRect({ - left = this.left, - top = this.top, - right = this.right, - bottom = this.bottom, - }): Rect { - return new Rect(left, top, right, bottom); - } - - static fromLTRB( - left: number, - top: number, - right: number, - bottom: number, - ): Rect { - return new Rect(left, top, right, bottom); - } - - static fromLWTH( - left: number, - width: number, - top: number, - height: number, - ): Rect { - return new Rect(left, top, left + width, top + height); - } - - static fromPoints(startPoint: Point, endPoint: Point): Rect { - const { y: top, x: left } = startPoint; - const { y: bottom, x: right } = endPoint; - return Rect.fromLTRB(left, top, right, bottom); - } - - static fromDOM(dom: HTMLElement): Rect { - const { top, width, left, height } = dom.getBoundingClientRect(); - return Rect.fromLWTH(left, width, top, height); - } - -} - -export default Rect; -export { Rect }; diff --git a/src/features/compose/editor/utils/set-floating-elem-position.ts b/src/features/compose/editor/utils/set-floating-elem-position.ts deleted file mode 100644 index 371b383cc..000000000 --- a/src/features/compose/editor/utils/set-floating-elem-position.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -const VERTICAL_GAP = 10; -const HORIZONTAL_OFFSET = 5; - -export const setFloatingElemPosition = ( - targetRect: ClientRect | null, - floatingElem: HTMLElement, - anchorElem: HTMLElement, - verticalGap: number = VERTICAL_GAP, - horizontalOffset: number = HORIZONTAL_OFFSET, -): void => { - const scrollerElem = anchorElem.parentElement; - - if (targetRect === null || !scrollerElem) { - floatingElem.style.opacity = '0'; - floatingElem.style.transform = 'translate(-10000px, -10000px)'; - return; - } - - const floatingElemRect = floatingElem.getBoundingClientRect(); - const anchorElementRect = anchorElem.getBoundingClientRect(); - const editorScrollerRect = scrollerElem.getBoundingClientRect(); - - let top = targetRect.top - floatingElemRect.height - verticalGap; - let left = targetRect.left - horizontalOffset; - - if (top < editorScrollerRect.top) { - top += floatingElemRect.height + targetRect.height + verticalGap * 2; - } - - if (left + floatingElemRect.width > editorScrollerRect.right) { - left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset; - } - - top -= anchorElementRect.top; - left -= anchorElementRect.left; - - floatingElem.style.opacity = '1'; - floatingElem.style.transform = `translate(${left}px, ${top}px)`; -}; diff --git a/src/features/compose/editor/utils/url.ts b/src/features/compose/editor/utils/url.ts deleted file mode 100644 index 412a77a2d..000000000 --- a/src/features/compose/editor/utils/url.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This source code is derived from code from Meta Platforms, Inc. - * and affiliates, licensed under the MIT license located in the - * LICENSE file in the /src/features/compose/editor directory. - */ - -export const sanitizeUrl = (url: string): string => { - /** A pattern that matches safe URLs. */ - const SAFE_URL_PATTERN = - /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi; - - /** A pattern that matches safe data URLs. */ - const DATA_URL_PATTERN = - /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i; - - url = String(url).trim(); - - if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) return url; - - return 'https://'; -}; - -// Source: https://stackoverflow.com/a/8234912/2013580 -const urlRegExp = new RegExp( - /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/, -); - -export const validateUrl = (url: string): boolean => { - // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://. - // Maybe show a dialog where they user can type the URL before inserting it. - return url === 'https://' || urlRegExp.test(url); -}; diff --git a/yarn.lock b/yarn.lock index 337362e61..6a49d2e0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1672,160 +1672,160 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lexical/clipboard@0.12.4", "@lexical/clipboard@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.12.4.tgz#b9c3a38ab98a67c678ee80238036a166d3161491" - integrity sha512-kFR+UdhtLCMTQgZCyDmYzp2yjPFMNpUZ4TaRjuRBpCRFYwKMlgie4p1J4VJm6sT23kkAFZtVjOfp+gDEYnPHRQ== +"@lexical/clipboard@0.13.1", "@lexical/clipboard@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.13.1.tgz#ca132306129974ea2c9e51d6a8637f8fcffcdb3d" + integrity sha512-gMSbVeqb7S+XAi/EMMlwl+FCurLPugN2jAXcp5k5ZaUd7be8B+iupbYdoKkjt4qBhxmvmfe9k46GoC0QOPl/nw== dependencies: - "@lexical/html" "0.12.4" - "@lexical/list" "0.12.4" - "@lexical/selection" "0.12.4" - "@lexical/utils" "0.12.4" + "@lexical/html" "0.13.1" + "@lexical/list" "0.13.1" + "@lexical/selection" "0.13.1" + "@lexical/utils" "0.13.1" -"@lexical/code@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/code/-/code-0.12.4.tgz#aa91cf1b070e012b359e9ba023ef880ed8c7fec0" - integrity sha512-pX7rJCjbjCl6VdOPl2hl/UkjP3iPPyCQgH2VQ+WlXapDd+0uZ54nPL1MKCCaFUZocHPmOmSRKKGUp6K2CNiqzg== +"@lexical/code@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/code/-/code-0.13.1.tgz#e13688390582a4b63a639daff1f16bcb82aa854d" + integrity sha512-QK77r3QgEtJy96ahYXNgpve8EY64BQgBSnPDOuqVrLdl92nPzjqzlsko2OZldlrt7gjXcfl9nqfhZ/CAhStfOg== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" prismjs "^1.27.0" -"@lexical/dragon@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/dragon/-/dragon-0.12.4.tgz#dc9961abf31a7e5a40db1b81e07a290ccdca93a5" - integrity sha512-7DaXdQ/5GJ8HRpPYr2+SjaUi912tG9L6ukg9IglG1t51lWGxqLx2chW17tp50XDTtY05w9VnoMaxtgsuCN5Pmg== +"@lexical/dragon@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/dragon/-/dragon-0.13.1.tgz#32ba02bff4d8f02a6317d874671ee0b0a2dcdc53" + integrity sha512-aNlqfif4//jW7gOxbBgdrbDovU6m3EwQrUw+Y/vqRkY+sWmloyAUeNwCPH1QP3Q5cvfolzOeN5igfBljsFr+1g== -"@lexical/hashtag@0.12.4", "@lexical/hashtag@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/hashtag/-/hashtag-0.12.4.tgz#95e2dced69dd0378c567c855e834492f367d7a86" - integrity sha512-iCxQRBZmgwAV6kypmxtWg7HVhBC7PKclmqLNaLDLoKBm+keEXpKnGB5iEtgK/tCMiwkzrg+wGcrw5qi+YjvM9Q== +"@lexical/hashtag@0.13.1", "@lexical/hashtag@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/hashtag/-/hashtag-0.13.1.tgz#eb273c199a0115ec0f0191c2449e97f512360f2e" + integrity sha512-Dl0dUG4ZXNjYYuAUR0GMGpLGsA+cps2/ln3xEmy28bZR0sKkjXugsu2QOIxZjYIPBewDrXzPcvK8md45cMYoSg== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/history@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/history/-/history-0.12.4.tgz#bb97c6a079d57ea446f40d7de647e9ee5c7f63cd" - integrity sha512-XLbSSr9FueAxuKHo4LBi+lZNVAEReNNDCt4MM2Ol8UZhWPlpNskSB/sECYEEQ6/ItlzgtnKyKWjfDFBHRWvC2g== +"@lexical/history@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/history/-/history-0.13.1.tgz#3bb54716dc69779d3b35894bd72637a7fc2ed284" + integrity sha512-cZXt30MalEEiRaflE9tHeGYnwT1xSDjXLsf9M409DSU9POJyZ1fsULJrG1tWv2uFQOhwal33rve9+MatUlITrg== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/html@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/html/-/html-0.12.4.tgz#25dd678d3d2bb735fc23340867bfe87e66248495" - integrity sha512-RD/n9n1eCuTZtLaTEI3wuUDlJjCn6j+/0c9GvzqLKhNz9f+E5zMVExhzTT4cZQh5WXbzGFNlwC/cuOtaM3wODg== +"@lexical/html@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/html/-/html-0.13.1.tgz#e56035d0c6528ffb932390e0d3d357c82f69253a" + integrity sha512-XkZrnCSHIUavtpMol6aG8YsJ5KqC9hMxEhAENf3HTGi3ocysCByyXOyt1EhEYpjJvgDG4wRqt25xGDbLjj1/sA== dependencies: - "@lexical/selection" "0.12.4" - "@lexical/utils" "0.12.4" + "@lexical/selection" "0.13.1" + "@lexical/utils" "0.13.1" -"@lexical/link@0.12.4", "@lexical/link@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/link/-/link-0.12.4.tgz#364628ae06396cd0182c978efaa9e66d77b34758" - integrity sha512-gmEs0GJGDhgwV1x0IrO7Br2GCALijZLIayGWoLAgYiXZee4WZpvjbngZuC6yghYBhrme6muPRMG2sLMwV2cWiQ== +"@lexical/link@0.13.1", "@lexical/link@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/link/-/link-0.13.1.tgz#f1c4c12c828c0251e5d7fb4fb336f2d62380fc57" + integrity sha512-7E3B2juL2UoMj2n+CiyFZ7tlpsdViAoIE7MpegXwfe/VQ66wFwk/VxGTa/69ng2EoF7E0kh+SldvGQDrWAWb1g== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/list@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/list/-/list-0.12.4.tgz#f57fe71ff599e298569722e0364c26a5cf417082" - integrity sha512-qxwRIz+4Aj2u2fzyGPo86vX+1ebwCnamppr/c5ZWuqpRTWtYDWjq5LQKIwAvZBxCzPdtP5jzwyZ6VYWQXYW4Kg== +"@lexical/list@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/list/-/list-0.13.1.tgz#461cb989157bdf4a43eaa8596fdb09df60d114ee" + integrity sha512-6U1pmNZcKLuOWiWRML8Raf9zSEuUCMlsOye82niyF6I0rpPgYo5UFghAAbGISDsyqzM1B2L4BgJ6XrCk/dJptg== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/mark@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/mark/-/mark-0.12.4.tgz#dfe221143d9d2c006b680d88ab2cba281bfb7a45" - integrity sha512-NFFk/3AFFJARjsth8wd5HdeW8XhcaECoQ8wwnJ4fRZzgN0lu3ZSiq+CuVm0NRN5xA5KoUT6sfIQqGOzIPfvdsw== +"@lexical/mark@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/mark/-/mark-0.13.1.tgz#084bb49a8bc1c5c5a4ed5c5d4a20c98ea85ec8b1" + integrity sha512-dW27PW8wWDOKFqXTBUuUfV+umU0KfwvXGkPUAxRJrvwUWk5RKaS48LhgbNlQ5BfT84Q8dSiQzvbaa6T40t9a3A== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/markdown@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/markdown/-/markdown-0.12.4.tgz#ca492a9c76ce7d24e49a51603f770fdfe23d0b51" - integrity sha512-cOk0dkafyvQI4DMwwMfkP329bRVfyhXcVF3dcRiydl6ZIgqOrj/EMi+C0qxQkcqg0MO26Rky6LLJ4vQi6AgJDg== +"@lexical/markdown@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/markdown/-/markdown-0.13.1.tgz#1fd2efcacff4ce733682a8161a3f3d78dba37503" + integrity sha512-6tbdme2h5Zy/M88loVQVH5G0Nt7VMR9UUkyiSaicyBRDOU2OHacaXEp+KSS/XuF+d7TA+v/SzyDq8HS77cO1wA== dependencies: - "@lexical/code" "0.12.4" - "@lexical/link" "0.12.4" - "@lexical/list" "0.12.4" - "@lexical/rich-text" "0.12.4" - "@lexical/text" "0.12.4" - "@lexical/utils" "0.12.4" + "@lexical/code" "0.13.1" + "@lexical/link" "0.13.1" + "@lexical/list" "0.13.1" + "@lexical/rich-text" "0.13.1" + "@lexical/text" "0.13.1" + "@lexical/utils" "0.13.1" -"@lexical/offset@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/offset/-/offset-0.12.4.tgz#00c0020a98e32216bd6f119949d3a3bd64b4b139" - integrity sha512-6fjXCx+YD1TMl6GFL4wowhBgbIg+UX3j2OOXh3F7WEp3SDvzoJsJ6F7xRctrHQbluCITM3oDwOyHa1J0m5lrFg== +"@lexical/offset@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/offset/-/offset-0.13.1.tgz#f37417822aef3dc81580d4abb96e43ba9d547225" + integrity sha512-j/RZcztJ7dyTrfA2+C3yXDzWDXV+XmMpD5BYeQCEApaHvlo20PHt1BISk7RcrnQW8PdzGvpKblRWf//c08LS9w== -"@lexical/overflow@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/overflow/-/overflow-0.12.4.tgz#3e7725e356044a5c9a7a80e53edc23cddf026da9" - integrity sha512-mEWgVukoOgcyDruHvzk1amy9jgGDVXFYiPn20ykxgrVQz6XEpq+lfyic/BUnN4toNR8p6jc/Yxi2lF1ELCU0Kg== +"@lexical/overflow@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/overflow/-/overflow-0.13.1.tgz#42c036dc3ad3eb929fda5aa0a00a725b74f72669" + integrity sha512-Uw34j+qG2UJRCIR+bykfFMduFk7Pc4r/kNt8N1rjxGuGXAsreTVch1iOhu7Ev6tJgkURsduKuaJCAi7iHnKl7g== -"@lexical/plain-text@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/plain-text/-/plain-text-0.12.4.tgz#10ef4d56e1569e0d8ad1bc12569cffd736414957" - integrity sha512-osbqOyt19oFG0kTbV71jxxCdgnUqNYW6QXIIaS1SwcCN/N1CdFZ0sNpjPkHIFx9AdZ/Tmi4u9SNFUo16DjvThA== +"@lexical/plain-text@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/plain-text/-/plain-text-0.13.1.tgz#e7e713029443c30facce27b34836bf604cf92c0f" + integrity sha512-4j5KAsMKUvJ8LhVDSS4zczbYXzdfmgYSAVhmqpSnJtud425Nk0TAfpUBLFoivxZB7KMoT1LGWQZvd47IvJPvtA== -"@lexical/react@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/react/-/react-0.12.4.tgz#4c53c32d8575dff685334b116e5a2bdf19a34da5" - integrity sha512-tz4ebqJ++YP/Y6FCjk5aU3bvgrps8+i9abqvaaNCSzSQavI0qHtdS7EGy4S9qyO6qKuthXcOGIQxGTweRTkDsA== +"@lexical/react@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/react/-/react-0.13.1.tgz#6c35bf43e24560d2ca3aa2c6ff607ef37de87bac" + integrity sha512-Sy6EL230KAb0RZsZf1dZrRrc3+rvCDQWltcd8C/cqBUYlxsLYCW9s4f3RB2werngD/PtLYbBB48SYXNkIALITA== dependencies: - "@lexical/clipboard" "0.12.4" - "@lexical/code" "0.12.4" - "@lexical/dragon" "0.12.4" - "@lexical/hashtag" "0.12.4" - "@lexical/history" "0.12.4" - "@lexical/link" "0.12.4" - "@lexical/list" "0.12.4" - "@lexical/mark" "0.12.4" - "@lexical/markdown" "0.12.4" - "@lexical/overflow" "0.12.4" - "@lexical/plain-text" "0.12.4" - "@lexical/rich-text" "0.12.4" - "@lexical/selection" "0.12.4" - "@lexical/table" "0.12.4" - "@lexical/text" "0.12.4" - "@lexical/utils" "0.12.4" - "@lexical/yjs" "0.12.4" + "@lexical/clipboard" "0.13.1" + "@lexical/code" "0.13.1" + "@lexical/dragon" "0.13.1" + "@lexical/hashtag" "0.13.1" + "@lexical/history" "0.13.1" + "@lexical/link" "0.13.1" + "@lexical/list" "0.13.1" + "@lexical/mark" "0.13.1" + "@lexical/markdown" "0.13.1" + "@lexical/overflow" "0.13.1" + "@lexical/plain-text" "0.13.1" + "@lexical/rich-text" "0.13.1" + "@lexical/selection" "0.13.1" + "@lexical/table" "0.13.1" + "@lexical/text" "0.13.1" + "@lexical/utils" "0.13.1" + "@lexical/yjs" "0.13.1" react-error-boundary "^3.1.4" -"@lexical/rich-text@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/rich-text/-/rich-text-0.12.4.tgz#545a1d6bd88e930c572d17fe504a8796f6af0c9d" - integrity sha512-gWMDmdRRFPk00JfQv52650qcpjTN6oBrrYwBydYvEG8WTC8o1k8qEOZaOFja6GElPt0520dpyvcWHTlIL0jv3Q== +"@lexical/rich-text@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/rich-text/-/rich-text-0.13.1.tgz#8251e81a3985a4d76bef027cf6c0dc90c661e4ec" + integrity sha512-HliB9Ync06mv9DBg/5j0lIsTJp+exLHlaLJe+n8Zq1QNTzZzu2LsIT/Crquk50In7K/cjtlaQ/d5RB0LkjMHYg== -"@lexical/selection@0.12.4", "@lexical/selection@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/selection/-/selection-0.12.4.tgz#756922edbf42f3cb0bd6f99239d77ba2615c859c" - integrity sha512-9lJt9PBJW7lWYiPDo/PGl2nZ6NrdYaDBidEoMNhyusPjeBEr35z4Hm0qWUhDrPDQPhK2i1oBw6nZa94bxuS9Lw== +"@lexical/selection@0.13.1", "@lexical/selection@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/selection/-/selection-0.13.1.tgz#466d7cd0ee1b04680bd949112f1f5cb6a6618efa" + integrity sha512-Kt9eSwjxPznj7yzIYipu9yYEgmRJhHiq3DNxHRxInYcZJWWNNHum2xKyxwwcN8QYBBzgfPegfM/geqQEJSV1lQ== -"@lexical/table@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/table/-/table-0.12.4.tgz#b40426de069b7e962e95e38f2ff1bc10ca649388" - integrity sha512-Lyy6y1HOQqzU8O2cH5Zhzek46B0UU7NceM2fJKM7qiBSuxY/nE0BzkFq0xDk3x5W+vhXob6Z32sJSNFImtuqKw== +"@lexical/table@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/table/-/table-0.13.1.tgz#814d3b8a2afb821aff151c92cce831809f9d67a1" + integrity sha512-VQzgkfkEmnvn6C64O/kvl0HI3bFoBh3WA/U67ALw+DS11Mb5CKjbt0Gzm/258/reIxNMpshjjicpWMv9Miwauw== dependencies: - "@lexical/utils" "0.12.4" + "@lexical/utils" "0.13.1" -"@lexical/text@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/text/-/text-0.12.4.tgz#65ba9620492d673cd68c8380725d4e4fe845e603" - integrity sha512-r/7402eCf6C/7BqUNR7ZLZQQjsE62wjeuf0rFeW1ulOpwiti/dFn1o+EsCb0hvNeHPzfGgRC+FuDT9KSEKu7Ig== +"@lexical/text@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/text/-/text-0.13.1.tgz#12104d42da7a707a19853679f3a88e8ed6ce8084" + integrity sha512-NYy3TZKt3qzReDwN2Rr5RxyFlg84JjXP2JQGMrXSSN7wYe73ysQIU6PqdVrz4iZkP+w34F3pl55dJ24ei3An9w== -"@lexical/utils@0.12.4", "@lexical/utils@^0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/utils/-/utils-0.12.4.tgz#83ed97d31201e1b911cfa38b940909c3cca41d77" - integrity sha512-ColV11ANBY6deT7CdGwP4lzv3pb5caFfFLcVKdGDMMJSUYFQ5l69aZvDP2qWWnNqzGLb+AJSunMd142wWc5LGg== +"@lexical/utils@0.13.1", "@lexical/utils@^0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/utils/-/utils-0.13.1.tgz#f2a72f71c859933781294830b38b25b5b33122a9" + integrity sha512-AtQQKzYymkbOaQxaBXjRBS8IPxF9zWQnqwHTUTrJqJ4hX71aIQd/thqZbfQETAFJfC8pNBZw5zpxN6yPHk23dQ== dependencies: - "@lexical/list" "0.12.4" - "@lexical/selection" "0.12.4" - "@lexical/table" "0.12.4" + "@lexical/list" "0.13.1" + "@lexical/selection" "0.13.1" + "@lexical/table" "0.13.1" -"@lexical/yjs@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@lexical/yjs/-/yjs-0.12.4.tgz#ea986b66932558062bab2ccc1b46c34c0260ea3e" - integrity sha512-qtCiABugE1CiZ7K5iFfQnB1KqfWtLyiRK0nxAaSxuZzQTO4+Kh3WDh7ULppPa53Sf3pKpw8Sq2XB4AXP6csbkg== +"@lexical/yjs@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@lexical/yjs/-/yjs-0.13.1.tgz#2a71ae3c4b3cc5c660bbe66d537eb0cbf3c7c1b6" + integrity sha512-4GbqQM+PwNTV59AZoNrfTe/0rLjs+cX6Y6yAdZSRPBwr5L3JzYeU1TTcFCVQTtsE7KF8ddVP8sD7w9pi8rOWLA== dependencies: - "@lexical/offset" "0.12.4" + "@lexical/offset" "0.13.1" "@mdn/browser-compat-data@^5.2.34", "@mdn/browser-compat-data@^5.3.13": version "5.3.16" @@ -5357,10 +5357,10 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -husky@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +husky@^9.0.0: + version "9.0.10" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.10.tgz#ddca8908deb5f244e9286865ebc80b54387672c2" + integrity sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA== iconv-lite@0.6.3: version "0.6.3" @@ -6088,10 +6088,10 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lexical@^0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/lexical/-/lexical-0.12.4.tgz#1f38d40eb1b5bdcf30a79864027bf7443de52fb5" - integrity sha512-giNrnp45H6P4IHFhkKaHEPTF+bKLBWdEIDL/FGjRZf+to7l7TORIBk/23Zdchzt/VGgKGWu950EOvGh53gkVMQ== +lexical@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/lexical/-/lexical-0.13.1.tgz#0abffe9bc05a7a9da8a6128ea478bf08c11654db" + integrity sha512-jaqRYzVEfBKbX4FwYpd/g+MyOjRaraAel0iQsTrwvx3hyN0bswUZuzb6H6nGlFSjcdrc77wKpyKwoWj4aUd+Bw== li@^1.3.0: version "1.3.0"