50 lines
1.1 KiB
JavaScript
50 lines
1.1 KiB
JavaScript
/**
|
|
* @typedef {import('hast').Nodes} Nodes
|
|
* @typedef {import('hast').Parents} Parents
|
|
*
|
|
* @typedef {import('../index.js').State} State
|
|
*/
|
|
|
|
import {zwitch} from 'zwitch'
|
|
import {comment} from './comment.js'
|
|
import {doctype} from './doctype.js'
|
|
import {element} from './element.js'
|
|
import {raw} from './raw.js'
|
|
import {root} from './root.js'
|
|
import {text} from './text.js'
|
|
|
|
/**
|
|
* @type {(node: Nodes, index: number | undefined, parent: Parents | undefined, state: State) => string}
|
|
*/
|
|
export const handle = zwitch('type', {
|
|
invalid,
|
|
unknown,
|
|
handlers: {comment, doctype, element, raw, root, text}
|
|
})
|
|
|
|
/**
|
|
* Fail when a non-node is found in the tree.
|
|
*
|
|
* @param {unknown} node
|
|
* Unknown value.
|
|
* @returns {never}
|
|
* Never.
|
|
*/
|
|
function invalid(node) {
|
|
throw new Error('Expected node, not `' + node + '`')
|
|
}
|
|
|
|
/**
|
|
* Fail when a node with an unknown type is found in the tree.
|
|
*
|
|
* @param {unknown} node_
|
|
* Unknown node.
|
|
* @returns {never}
|
|
* Never.
|
|
*/
|
|
function unknown(node_) {
|
|
// `type` is guaranteed by runtime JS.
|
|
const node = /** @type {Nodes} */ (node_)
|
|
throw new Error('Cannot compile unknown node `' + node.type + '`')
|
|
}
|