'use strict';

const require_runtime = require('../_virtual/_rolldown/runtime.js');
const require_index = require('../utils/index.js');

//#region lib/rules/no-child-content.js
/**
* @author Flo Edelmann
* See LICENSE file in root directory for full license.
*/
var require_no_child_content = /* @__PURE__ */ require_runtime.__commonJSMin(((exports, module) => {
	const { defineTemplateBodyVisitor } = require_index.default;
	/**
	* @typedef {object} RuleOption
	* @property {string[]} additionalDirectives
	*/
	/**
	* @param {VNode | Token} node
	* @returns {boolean}
	*/
	function isWhiteSpaceTextNode(node) {
		return node.type === "VText" && node.value.trim() === "";
	}
	/**
	* @param {Position} pos1
	* @param {Position} pos2
	* @returns {'less' | 'equal' | 'greater'}
	*/
	function comparePositions(pos1, pos2) {
		if (pos1.line < pos2.line || pos1.line === pos2.line && pos1.column < pos2.column) return "less";
		if (pos1.line > pos2.line || pos1.line === pos2.line && pos1.column > pos2.column) return "greater";
		return "equal";
	}
	/**
	* @param {(VNode | Token)[]} nodes
	* @returns {SourceLocation | undefined}
	*/
	function getLocationRange(nodes) {
		/** @type {Position | undefined} */
		let start;
		/** @type {Position | undefined} */
		let end;
		for (const node of nodes) {
			if (!start || comparePositions(node.loc.start, start) === "less") start = node.loc.start;
			if (!end || comparePositions(node.loc.end, end) === "greater") end = node.loc.end;
		}
		if (start === void 0 || end === void 0) return;
		return {
			start,
			end
		};
	}
	module.exports = {
		meta: {
			type: "problem",
			docs: {
				description: "disallow element's child contents which would be overwritten by a directive like `v-html` or `v-text`",
				categories: ["vue3-essential", "vue2-essential"],
				url: "https://eslint.vuejs.org/rules/no-child-content.html"
			},
			fixable: null,
			hasSuggestions: true,
			schema: [{
				type: "object",
				additionalProperties: false,
				properties: { additionalDirectives: {
					type: "array",
					uniqueItems: true,
					minItems: 1,
					items: { type: "string" }
				} },
				required: ["additionalDirectives"]
			}],
			messages: {
				disallowedChildContent: "Child content is disallowed because it will be overwritten by the v-{{ directiveName }} directive.",
				removeChildContent: "Remove child content."
			}
		},
		create(context) {
			const directives = new Set(["html", "text"]);
			/** @type {RuleOption | undefined} */
			const option = context.options[0];
			if (option !== void 0) for (const directive of option.additionalDirectives) directives.add(directive);
			return defineTemplateBodyVisitor(context, { "VAttribute[directive=true]"(directiveNode) {
				const directiveName = directiveNode.key.name.name;
				const elementNode = directiveNode.parent.parent;
				if (elementNode.endTag === null || !directives.has(directiveName)) return;
				const elementComments = context.sourceCode.parserServices.getTemplateBodyTokenStore().getTokensBetween(elementNode.startTag, elementNode.endTag, {
					includeComments: true,
					filter: (token) => token.type === "HTMLComment"
				});
				const childNodes = [...elementNode.children, ...elementComments];
				if (childNodes.some((childNode) => !isWhiteSpaceTextNode(childNode))) context.report({
					node: elementNode,
					loc: getLocationRange(childNodes),
					messageId: "disallowedChildContent",
					data: { directiveName },
					suggest: [{
						messageId: "removeChildContent",
						*fix(fixer) {
							for (const childNode of childNodes) yield fixer.remove(childNode);
						}
					}]
				});
			} });
		}
	};
}));

//#endregion
Object.defineProperty(exports, 'default', {
  enumerable: true,
  get: function () {
    return require_no_child_content();
  }
});