"use strict";
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
Object.defineProperty(exports, "__esModule", { value: true });
/* Based on remark-slug (https://github.com/remarkjs/remark-slug) and gatsby-remark-autolink-headers (https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-remark-autolink-headers) */
const utils_1 = require("@docusaurus/utils");
function plugin() {
    return async (root) => {
        const { toString } = await import('mdast-util-to-string');
        const { visit } = await import('unist-util-visit');
        const slugs = (0, utils_1.createSlugger)();
        visit(root, 'heading', (headingNode) => {
            const data = headingNode.data ?? (headingNode.data = {});
            const properties = (data.hProperties || (data.hProperties = {}));
            let { id } = properties;
            if (id) {
                id = slugs.slug(id, { maintainCase: true });
            }
            else {
                const headingTextNodes = headingNode.children.filter(({ type }) => !['html', 'jsx'].includes(type));
                const heading = toString(headingTextNodes.length > 0 ? headingTextNodes : headingNode);
                // Support explicit heading IDs
                const parsedHeading = (0, utils_1.parseMarkdownHeadingId)(heading);
                id = parsedHeading.id ?? slugs.slug(heading);
                if (parsedHeading.id) {
                    // When there's an id, it is always in the last child node
                    // Sometimes heading is in multiple "parts" (** syntax creates a child
                    // node):
                    // ## part1 *part2* part3 {#id}
                    const lastNode = headingNode.children[headingNode.children.length - 1];
                    if (headingNode.children.length > 1) {
                        const lastNodeText = (0, utils_1.parseMarkdownHeadingId)(lastNode.value).text;
                        // When last part contains test+id, remove the id
                        if (lastNodeText) {
                            lastNode.value = lastNodeText;
                        }
                        // When last part contains only the id: completely remove that node
                        else {
                            headingNode.children.pop();
                        }
                    }
                    else {
                        lastNode.value = parsedHeading.text;
                    }
                }
            }
            data.id = id;
            properties.id = id;
        });
    };
}
exports.default = plugin;
//# sourceMappingURL=index.js.map