datocms-html-to-structured-text
Version:
Convert HTML (or a `hast` syntax tree) to a valid DatoCMS Structured Text `dast` document
48 lines (43 loc) • 1.19 kB
text/typescript
import {
Node,
HastNode,
HastElementNode,
CreateNodeFunction,
Context,
} from './types';
import visitNode from './visit-node';
// visitChildren() is for visiting all the children of a node
export default async function visitChildren(
createNode: CreateNodeFunction,
parentNode: HastElementNode,
context: Context,
): Promise<Node | Array<Node> | void> {
const nodes: HastNode[] = Array.isArray(parentNode.children)
? parentNode.children
: [];
let values: Node[] = [];
let index = -1;
let result;
while (++index < nodes.length) {
result = (await visitNode(createNode, nodes[index], {
...context,
parentNode,
})) as Node | Array<Node | Promise<Node>> | void;
if (result) {
if (Array.isArray(result)) {
result = (await Promise.all(
result.map(
(nodeOrPromise: Node | Promise<Node>): Promise<Node> => {
if (nodeOrPromise instanceof Promise) {
return nodeOrPromise;
}
return Promise.resolve(nodeOrPromise);
},
),
)) as Array<Node>;
}
values = values.concat(result);
}
}
return values;
}