[release-2.19] fix: resolve error when adding tables in default editor (#6588)

This is an automated cherry-pick of #6587

/assign LIlGG

```release-note
解决在默认编辑器中添加表格报错的问题
```
pull/6608/head
Halo Dev Bot 2024-09-04 22:49:45 +08:00 committed by GitHub
parent 30d054a009
commit a45ebb0825
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 10 additions and 37 deletions

View File

@ -1,3 +1,4 @@
import { randomUUID } from "@/utils/id";
import { import {
getExtensionField, getExtensionField,
type AnyConfig, type AnyConfig,
@ -10,12 +11,17 @@ export function useExtension() {
if (!extensions) { if (!extensions) {
return; return;
} }
const resolvedExtensions = sort(extensions);
const resolvedExtensions = sort(flatten(extensions));
const map = new Map<string, AnyExtension>(); const map = new Map<string, AnyExtension>();
resolvedExtensions.forEach((extension) => { resolvedExtensions.forEach((extension) => {
if (!extension.name) {
console.warn(
`Extension name is missing for Extension, type: ${extension.type}.`
);
const key = randomUUID().toString();
map.set(key, extension);
return;
}
const key = `${extension.type}-${extension.name}`; const key = `${extension.type}-${extension.name}`;
if (map.has(key)) { if (map.has(key)) {
console.warn( console.warn(
@ -24,42 +30,9 @@ export function useExtension() {
} }
map.set(key, extension); map.set(key, extension);
}); });
return Array.from(map.values()); return Array.from(map.values());
}; };
/**
* Create a flattened array of extensions by traversing the `addExtensions` field.
* @param extensions An array of Tiptap extensions
* @returns A flattened array of Tiptap extensions
*/
const flatten = (extensions: Extensions): Extensions => {
return (
extensions
.map((extension) => {
const context = {
name: extension.name,
options: extension.options,
storage: extension.storage,
};
const addExtensions = getExtensionField<AnyConfig["addExtensions"]>(
extension,
"addExtensions",
context
);
if (addExtensions) {
return [extension, ...flatten(addExtensions())];
}
return extension;
})
// `Infinity` will break TypeScript so we set a number that is probably high enough
.flat(10)
);
};
/** /**
* Sort extensions by priority. * Sort extensions by priority.
* @param extensions An array of Tiptap extensions * @param extensions An array of Tiptap extensions