From 8d0c872b78f497ceb2291a17674001a5dd20b99b Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+dimaanj@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:18:01 +0300 Subject: [PATCH] [LinkPlugin] Allows pasting `email` links from clipboard (#2444) * [LinkPlugin] allow pasting email links * [LinkPlugin] apply lock file updates * Create smooth-beds-kneel.md --------- Co-authored-by: Ziad Beyens --- .changeset/smooth-beds-kneel.md | 5 +++++ packages/utils/src/isUrl.spec.ts | 8 ++++++++ packages/utils/src/isUrl.ts | 6 +++++- yarn.lock | 34 ++++++++++++++++---------------- 4 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 .changeset/smooth-beds-kneel.md diff --git a/.changeset/smooth-beds-kneel.md b/.changeset/smooth-beds-kneel.md new file mode 100644 index 0000000000..d9bba5bb5e --- /dev/null +++ b/.changeset/smooth-beds-kneel.md @@ -0,0 +1,5 @@ +--- +"@udecode/utils": patch +--- + +`isUrl`: support email urls diff --git a/packages/utils/src/isUrl.spec.ts b/packages/utils/src/isUrl.spec.ts index 9e10f9cddd..89a4bdbdbe 100644 --- a/packages/utils/src/isUrl.spec.ts +++ b/packages/utils/src/isUrl.spec.ts @@ -90,6 +90,10 @@ describe('is-url', () => { it('http://localhost:342/a/path', () => { expect(isUrl('http://localhost:342/a/path')).toBeTruthy(); }); + + it('mailto:sample-mail@gmail.com', () => { + expect(isUrl('mailto:sample-mail@gmail.com')).toBeTruthy(); + }); }); describe('invalid', () => { @@ -132,6 +136,10 @@ describe('is-url', () => { it('re', () => { expect(!isUrl(/abc/)).toBeTruthy(); }); + + it('mailto:', () => { + expect(!isUrl('mailto:')).toBeTruthy(); + }); }); describe('redos', () => { diff --git a/packages/utils/src/isUrl.ts b/packages/utils/src/isUrl.ts index f8f65d5011..660af6f713 100644 --- a/packages/utils/src/isUrl.ts +++ b/packages/utils/src/isUrl.ts @@ -5,6 +5,7 @@ */ const protocolAndDomainRE = /^(?:\w+:)?\/\/(\S+)$/; +const emailLintRE = /mailto:([^\\?]+)/; const localhostDomainRE = /^localhost[:?\d]*(?:[^:?\d]\S*)?$/; const nonLocalhostDomainRE = /^[^\s.]+\.\S{2,}$/; @@ -17,7 +18,10 @@ export const isUrl = (string: any) => { return false; } - const match = string.match(protocolAndDomainRE); + const generalMatch = string.match(protocolAndDomainRE); + const emailLinkMatch = string.match(emailLintRE); + + const match = generalMatch || emailLinkMatch; if (!match) { return false; } diff --git a/yarn.lock b/yarn.lock index e5cfcf41b7..40bd4fbba9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6792,7 +6792,7 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-headless@npm:21.3.5, @udecode/plate-headless@workspace:packages/headless": +"@udecode/plate-headless@npm:21.4.0, @udecode/plate-headless@workspace:packages/headless": version: 0.0.0-use.local resolution: "@udecode/plate-headless@workspace:packages/headless" dependencies: @@ -6818,7 +6818,7 @@ __metadata: "@udecode/plate-indent-list": "npm:21.3.2" "@udecode/plate-kbd": "npm:21.3.2" "@udecode/plate-line-height": "npm:21.3.2" - "@udecode/plate-link": "npm:21.3.2" + "@udecode/plate-link": "npm:21.4.0" "@udecode/plate-list": "npm:21.3.2" "@udecode/plate-media": "npm:21.3.4" "@udecode/plate-mention": "npm:21.3.5" @@ -6830,7 +6830,7 @@ __metadata: "@udecode/plate-serializer-csv": "npm:21.3.4" "@udecode/plate-serializer-docx": "npm:21.3.4" "@udecode/plate-serializer-html": "npm:21.3.2" - "@udecode/plate-serializer-md": "npm:21.3.2" + "@udecode/plate-serializer-md": "npm:21.4.0" "@udecode/plate-suggestion": "npm:21.3.2" "@udecode/plate-tabbable": "npm:21.3.2" "@udecode/plate-table": "npm:21.3.4" @@ -6947,7 +6947,7 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-link@npm:21.3.2, @udecode/plate-link@workspace:packages/nodes/link": +"@udecode/plate-link@npm:21.4.0, @udecode/plate-link@workspace:packages/nodes/link": version: 0.0.0-use.local resolution: "@udecode/plate-link@workspace:packages/nodes/link" dependencies: @@ -7153,7 +7153,7 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-serializer-md@npm:21.3.2, @udecode/plate-serializer-md@workspace:packages/serializers/md": +"@udecode/plate-serializer-md@npm:21.4.0, @udecode/plate-serializer-md@workspace:packages/serializers/md": version: 0.0.0-use.local resolution: "@udecode/plate-serializer-md@workspace:packages/serializers/md" dependencies: @@ -7161,7 +7161,7 @@ __metadata: "@udecode/plate-code-block": "npm:21.3.2" "@udecode/plate-common": "npm:21.3.2" "@udecode/plate-heading": "npm:21.3.2" - "@udecode/plate-link": "npm:21.3.2" + "@udecode/plate-link": "npm:21.4.0" "@udecode/plate-list": "npm:21.3.2" "@udecode/plate-paragraph": "npm:21.3.2" remark-parse: "npm:^9.0.0" @@ -7531,12 +7531,12 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-ui-link@npm:21.3.5, @udecode/plate-ui-link@workspace:packages/ui/nodes/link": +"@udecode/plate-ui-link@npm:21.4.0, @udecode/plate-ui-link@workspace:packages/ui/nodes/link": version: 0.0.0-use.local resolution: "@udecode/plate-ui-link@workspace:packages/ui/nodes/link" dependencies: "@udecode/plate-common": "npm:21.3.2" - "@udecode/plate-link": "npm:21.3.2" + "@udecode/plate-link": "npm:21.4.0" "@udecode/plate-styled-components": "npm:21.3.2" "@udecode/plate-ui-button": "npm:21.3.5" "@udecode/plate-ui-toolbar": "npm:21.3.5" @@ -7568,16 +7568,16 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-ui-media@npm:21.3.5, @udecode/plate-ui-media@workspace:packages/ui/nodes/media": +"@udecode/plate-ui-media@npm:21.4.0, @udecode/plate-ui-media@workspace:packages/ui/nodes/media": version: 0.0.0-use.local resolution: "@udecode/plate-ui-media@workspace:packages/ui/nodes/media" dependencies: "@udecode/plate-common": "npm:21.3.2" "@udecode/plate-floating": "npm:21.3.2" - "@udecode/plate-link": "npm:21.3.2" + "@udecode/plate-link": "npm:21.4.0" "@udecode/plate-media": "npm:21.3.4" "@udecode/plate-styled-components": "npm:21.3.2" - "@udecode/plate-ui-link": "npm:21.3.5" + "@udecode/plate-ui-link": "npm:21.4.0" "@udecode/plate-ui-toolbar": "npm:21.3.5" js-video-url-parser: "npm:0.5.1" peerDependencies: @@ -7665,11 +7665,11 @@ __metadata: languageName: unknown linkType: soft -"@udecode/plate-ui@npm:21.3.5, @udecode/plate-ui@workspace:packages/ui/plate": +"@udecode/plate-ui@npm:21.4.0, @udecode/plate-ui@workspace:packages/ui/plate": version: 0.0.0-use.local resolution: "@udecode/plate-ui@workspace:packages/ui/plate" dependencies: - "@udecode/plate-headless": "npm:21.3.5" + "@udecode/plate-headless": "npm:21.4.0" "@udecode/plate-styled-components": "npm:21.3.2" "@udecode/plate-ui-alignment": "npm:21.3.5" "@udecode/plate-ui-block-quote": "npm:21.3.2" @@ -7682,9 +7682,9 @@ __metadata: "@udecode/plate-ui-find-replace": "npm:21.3.5" "@udecode/plate-ui-font": "npm:21.3.5" "@udecode/plate-ui-line-height": "npm:21.3.5" - "@udecode/plate-ui-link": "npm:21.3.5" + "@udecode/plate-ui-link": "npm:21.4.0" "@udecode/plate-ui-list": "npm:21.3.5" - "@udecode/plate-ui-media": "npm:21.3.5" + "@udecode/plate-ui-media": "npm:21.4.0" "@udecode/plate-ui-mention": "npm:21.3.5" "@udecode/plate-ui-placeholder": "npm:21.3.2" "@udecode/plate-ui-table": "npm:21.3.5" @@ -7726,8 +7726,8 @@ __metadata: version: 0.0.0-use.local resolution: "@udecode/plate@workspace:packages/plate" dependencies: - "@udecode/plate-headless": "npm:21.3.5" - "@udecode/plate-ui": "npm:21.3.5" + "@udecode/plate-headless": "npm:21.4.0" + "@udecode/plate-ui": "npm:21.4.0" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0"