@lexical/utils 0.5.1-next.2 → 0.6.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,6 +24,67 @@ function removeClassNamesFromElement(element, ...classNames) {
24
24
  }
25
25
  });
26
26
  }
27
+ function isMimeType(file, acceptableMimeTypes) {
28
+ for (const acceptableType of acceptableMimeTypes) {
29
+ if (file.type.startsWith(acceptableType)) {
30
+ return true;
31
+ }
32
+ }
33
+
34
+ return false;
35
+ }
36
+ /**
37
+ * Lexical File Reader with:
38
+ * 1. MIME type support
39
+ * 2. batched results (HistoryPlugin compatibility)
40
+ * 3. Order aware (respects the order when multiple Files are passed)
41
+ *
42
+ * const filesResult = await mediaFileReader(files, ['image/']);
43
+ * filesResult.forEach(file => editor.dispatchCommand('INSERT_IMAGE', {
44
+ * src: file.result,
45
+ * }));
46
+ */
47
+
48
+ function mediaFileReader(files, acceptableMimeTypes) {
49
+ const filesIterator = files[Symbol.iterator]();
50
+ return new Promise((resolve, reject) => {
51
+ const processed = [];
52
+
53
+ const handleNextFile = () => {
54
+ const {
55
+ done,
56
+ value: file
57
+ } = filesIterator.next();
58
+
59
+ if (done) {
60
+ return resolve(processed);
61
+ }
62
+
63
+ const fileReader = new FileReader();
64
+ fileReader.addEventListener('error', reject);
65
+ fileReader.addEventListener('load', () => {
66
+ const result = fileReader.result;
67
+
68
+ if (typeof result === 'string') {
69
+ processed.push({
70
+ file,
71
+ result
72
+ });
73
+ }
74
+
75
+ handleNextFile();
76
+ });
77
+
78
+ if (isMimeType(file, acceptableMimeTypes)) {
79
+ fileReader.readAsDataURL(file);
80
+ } else {
81
+ handleNextFile();
82
+ }
83
+ };
84
+
85
+ handleNextFile();
86
+ });
87
+ }
27
88
  function $dfs(startingNode, endingNode) {
28
89
  const nodes = [];
29
90
  const start = (startingNode || lexical.$getRoot()).getLatest();
@@ -351,6 +412,8 @@ exports.$insertNodeToNearestRoot = $insertNodeToNearestRoot;
351
412
  exports.$restoreEditorState = $restoreEditorState;
352
413
  exports.$wrapNodeInElement = $wrapNodeInElement;
353
414
  exports.addClassNamesToElement = addClassNamesToElement;
415
+ exports.isMimeType = isMimeType;
416
+ exports.mediaFileReader = mediaFileReader;
354
417
  exports.mergeRegister = mergeRegister;
355
418
  exports.registerNestedElementResolver = registerNestedElementResolver;
356
419
  exports.removeClassNamesFromElement = removeClassNamesFromElement;
@@ -24,6 +24,14 @@ declare export function removeClassNamesFromElement(
24
24
  element: HTMLElement,
25
25
  ...classNames: Array<typeof undefined | boolean | null | string>
26
26
  ): void;
27
+ declare export function isMimeType(
28
+ file: File,
29
+ acceptableMimeTypes: Array<string>,
30
+ ): boolean;
31
+ declare export function mediaFileReader(
32
+ files: Array<File>,
33
+ acceptableMimeTypes: Array<string>,
34
+ ): Promise<Array<$ReadOnly<{file: File, result: string}>>>;
27
35
  declare export function $dfs(
28
36
  startingNode?: LexicalNode,
29
37
  endingNode?: LexicalNode,
@@ -4,13 +4,14 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- 'use strict';var l=require("lexical");function n(a){throw Error(`Minified Lexical error #${a}; visit https://lexical.dev/docs/error?code=${a} for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}function p(a,b){for(;a!==l.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}
8
- function q(a,b,d,f,e){var c=d._nodes.get(a.__type);void 0===c&&n(5);for(var h in a){var k=a[h];if(null!=k&&"object"===typeof k&&(k=k.editorState,null!=k)){var g=l.createEditor({namespace:k.namespace});g._nodes=d._nodes;g._parentEditor=d._parentEditor;g._pendingEditorState=r(g,k);a[h]=g}}c=c.klass;h=a.__key;a.__key=void 0;c=c.clone(a);a.__key=h;h=c.__key;e._nodeMap.set(h,c);c.__parent=f;if(l.$isElementNode(c)){f=a.__children;for(k=0;k<f.length;k++)g=b.get(f[k]),void 0!==g&&(g=q(g,b,d,h,e).__key,c.__children.push(g));
7
+ 'use strict';var l=require("lexical");function n(a){throw Error(`Minified Lexical error #${a}; visit https://lexical.dev/docs/error?code=${a} for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}function p(a,b){for(let d of b)if(a.type.startsWith(d))return!0;return!1}function q(a,b){for(;a!==l.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}
8
+ function r(a,b,d,f,e){var c=d._nodes.get(a.__type);void 0===c&&n(5);for(var h in a){var k=a[h];if(null!=k&&"object"===typeof k&&(k=k.editorState,null!=k)){var g=l.createEditor({namespace:k.namespace});g._nodes=d._nodes;g._parentEditor=d._parentEditor;g._pendingEditorState=t(g,k);a[h]=g}}c=c.klass;h=a.__key;a.__key=void 0;c=c.clone(a);a.__key=h;h=c.__key;e._nodeMap.set(h,c);c.__parent=f;if(l.$isElementNode(c)){f=a.__children;for(k=0;k<f.length;k++)g=b.get(f[k]),void 0!==g&&(g=r(g,b,d,h,e).__key,c.__children.push(g));
9
9
  c.__indent=a.__indent;c.__format=a.__format;c.__dir=a.__dir}else l.$isTextNode(c)&&(c.__format=a.__format,c.__style=a.__style,c.__mode=a.__mode,c.__detail=a.__detail);return c}
10
- function t(a,b){let d=b._editorState.constructor,f=new Map,e=new d(f),c=new Map(a._nodeMap),h=c.get("root");a=b._updating;try{b._updating=!1,b.update(()=>{let k=b._dirtyElements,g=b._dirtyLeaves,m=b._dirtyType;b._dirtyElements=new Map;b._dirtyLeaves=new Set;b._dirtyType=0;try{q(h,c,b,null,e)}finally{b._dirtyElements=k,b._dirtyLeaves=g,b._dirtyType=m}})}finally{b._updating=a}e._readOnly=!0;return e}function r(a,b){b="string"===typeof b?JSON.parse(b):b;return t(b,a)}
11
- exports.$dfs=function(a,b){let d=[];a=(a||l.$getRoot()).getLatest();b=b||(l.$isElementNode(a)?a.getLastDescendant():a);for(var f=a,e=0;null!==(f=f.getParent());)e++;for(f=e;null!==a&&!a.is(b);)if(d.push({depth:f,node:a}),l.$isElementNode(a)&&0<a.getChildrenSize())a=a.getFirstChild(),f++;else for(e=null;null===e&&null!==a;)e=a.getNextSibling(),null===e?(a=a.getParent(),f--):a=e;null!==a&&a.is(b)&&d.push({depth:f,node:a});return d};exports.$findMatchingParent=p;
12
- exports.$getNearestBlockElementAncestorOrThrow=function(a){a=p(a,b=>l.$isElementNode(b)&&!b.isInline());l.$isElementNode(a)||n(4);return a};exports.$getNearestNodeOfType=function(a,b){for(;null!=a;){if(a instanceof b)return a;a=a.getParent()}return null};
10
+ function v(a,b){let d=b._editorState.constructor,f=new Map,e=new d(f),c=new Map(a._nodeMap),h=c.get("root");a=b._updating;try{b._updating=!1,b.update(()=>{let k=b._dirtyElements,g=b._dirtyLeaves,m=b._dirtyType;b._dirtyElements=new Map;b._dirtyLeaves=new Set;b._dirtyType=0;try{r(h,c,b,null,e)}finally{b._dirtyElements=k,b._dirtyLeaves=g,b._dirtyType=m}})}finally{b._updating=a}e._readOnly=!0;return e}function t(a,b){b="string"===typeof b?JSON.parse(b):b;return v(b,a)}
11
+ exports.$dfs=function(a,b){let d=[];a=(a||l.$getRoot()).getLatest();b=b||(l.$isElementNode(a)?a.getLastDescendant():a);for(var f=a,e=0;null!==(f=f.getParent());)e++;for(f=e;null!==a&&!a.is(b);)if(d.push({depth:f,node:a}),l.$isElementNode(a)&&0<a.getChildrenSize())a=a.getFirstChild(),f++;else for(e=null;null===e&&null!==a;)e=a.getNextSibling(),null===e?(a=a.getParent(),f--):a=e;null!==a&&a.is(b)&&d.push({depth:f,node:a});return d};exports.$findMatchingParent=q;
12
+ exports.$getNearestBlockElementAncestorOrThrow=function(a){a=q(a,b=>l.$isElementNode(b)&&!b.isInline());l.$isElementNode(a)||n(4);return a};exports.$getNearestNodeOfType=function(a,b){for(;null!=a;){if(a instanceof b)return a;a=a.getParent()}return null};
13
13
  exports.$insertNodeToNearestRoot=function(a){var b=l.$getSelection();l.$isRangeSelection(b)?b.focus.getNode().getTopLevelElementOrThrow().insertAfter(a):l.$isNodeSelection(b)||l.DEPRECATED_$isGridSelection(b)?(b=b.getNodes(),b[b.length-1].getTopLevelElementOrThrow().insertAfter(a)):l.$getRoot().append(a);b=l.$createParagraphNode();a.insertAfter(b);b.select();return a.getLatest()};
14
- exports.$restoreEditorState=function(a,b){let d=new Map(b._nodeMap),f=a._pendingEditorState;f&&(f._nodeMap=d);a._dirtyType=2;a=b._selection;l.$setSelection(null===a?null:a.clone())};exports.$wrapNodeInElement=function(a,b){b=b();a.replace(b);b.append(a);return b};exports.addClassNamesToElement=function(a,...b){b.forEach(d=>{"string"===typeof d&&(d=d.split(" ").filter(f=>""!==f),a.classList.add(...d))})};exports.mergeRegister=function(...a){return()=>{a.forEach(b=>b())}};
14
+ exports.$restoreEditorState=function(a,b){let d=new Map(b._nodeMap),f=a._pendingEditorState;f&&(f._nodeMap=d);a._dirtyType=2;a=b._selection;l.$setSelection(null===a?null:a.clone())};exports.$wrapNodeInElement=function(a,b){b=b();a.replace(b);b.append(a);return b};exports.addClassNamesToElement=function(a,...b){b.forEach(d=>{"string"===typeof d&&(d=d.split(" ").filter(f=>""!==f),a.classList.add(...d))})};exports.isMimeType=p;
15
+ exports.mediaFileReader=function(a,b){let d=a[Symbol.iterator]();return new Promise((f,e)=>{let c=[],h=()=>{const {done:k,value:g}=d.next();if(k)return f(c);const m=new FileReader;m.addEventListener("error",e);m.addEventListener("load",()=>{const u=m.result;"string"===typeof u&&c.push({file:g,result:u});h()});p(g,b)?m.readAsDataURL(g):h()};h()})};exports.mergeRegister=function(...a){return()=>{a.forEach(b=>b())}};
15
16
  exports.registerNestedElementResolver=function(a,b,d,f){return a.registerNodeTransform(b,e=>{a:{var c=e.getChildren();for(var h=0;h<c.length;h++)if(c[h]instanceof b){c=null;break a}for(c=e;null!==c;)if(h=c,c=c.getParent(),c instanceof b){c={child:h,parent:c};break a}c=null}if(null!==c){const {child:k,parent:g}=c;if(k.is(e)){f(g,e);e=k.getNextSiblings();c=e.length;g.insertAfter(k);if(0!==c){h=d(g);k.insertAfter(h);for(let m=0;m<c;m++)h.append(e[m])}g.canBeEmpty()||0!==g.getChildrenSize()||g.remove()}}})};
16
- exports.removeClassNamesFromElement=function(a,...b){b.forEach(d=>{"string"===typeof d&&a.classList.remove(...d.split(" "))})};exports.unstable_convertLegacyJSONEditorState=r
17
+ exports.removeClassNamesFromElement=function(a,...b){b.forEach(d=>{"string"===typeof d&&a.classList.remove(...d.split(" "))})};exports.unstable_convertLegacyJSONEditorState=t
package/index.d.ts CHANGED
@@ -13,6 +13,22 @@ export declare type DFSNode = Readonly<{
13
13
  }>;
14
14
  export declare function addClassNamesToElement(element: HTMLElement, ...classNames: Array<typeof undefined | boolean | null | string>): void;
15
15
  export declare function removeClassNamesFromElement(element: HTMLElement, ...classNames: Array<typeof undefined | boolean | null | string>): void;
16
+ export declare function isMimeType(file: File, acceptableMimeTypes: Array<string>): boolean;
17
+ /**
18
+ * Lexical File Reader with:
19
+ * 1. MIME type support
20
+ * 2. batched results (HistoryPlugin compatibility)
21
+ * 3. Order aware (respects the order when multiple Files are passed)
22
+ *
23
+ * const filesResult = await mediaFileReader(files, ['image/']);
24
+ * filesResult.forEach(file => editor.dispatchCommand('INSERT_IMAGE', {
25
+ * src: file.result,
26
+ * }));
27
+ */
28
+ export declare function mediaFileReader(files: Array<File>, acceptableMimeTypes: Array<string>): Promise<Array<{
29
+ file: File;
30
+ result: string;
31
+ }>>;
16
32
  export declare function $dfs(startingNode?: LexicalNode, endingNode?: LexicalNode): Array<DFSNode>;
17
33
  export declare function $getNearestNodeOfType<T extends ElementNode>(node: LexicalNode, klass: Klass<T>): T | null;
18
34
  export declare function $getNearestBlockElementAncestorOrThrow(startNode: LexicalNode): ElementNode;
package/package.json CHANGED
@@ -8,14 +8,14 @@
8
8
  "utils"
9
9
  ],
10
10
  "license": "MIT",
11
- "version": "0.5.1-next.2",
11
+ "version": "0.6.1-next.0",
12
12
  "main": "LexicalUtils.js",
13
13
  "peerDependencies": {
14
- "lexical": "0.5.1-next.2"
14
+ "lexical": "0.6.1-next.0"
15
15
  },
16
16
  "dependencies": {
17
- "@lexical/list": "0.5.1-next.2",
18
- "@lexical/table": "0.5.1-next.2"
17
+ "@lexical/list": "0.6.1-next.0",
18
+ "@lexical/table": "0.6.1-next.0"
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",