import { a as createRule, r as getValue } from "../utils.mjs";
//#region src/rules/prefer-default-export/prefer-default-export.ts
var prefer_default_export_default = createRule({
	name: "prefer-default-export",
	meta: {
		type: "suggestion",
		docs: { description: "Prefer a default export if module exports a single name or multiple names." },
		schema: [{
			type: "object",
			properties: { target: {
				type: "string",
				enum: ["single", "any"],
				default: "single"
			} },
			additionalProperties: false
		}],
		messages: {
			single: "Prefer default export on a file with single export.",
			any: "Prefer default export to be present on every file that has export."
		}
	},
	defaultOptions: [{ target: "single" }],
	create(context, [options]) {
		let specifierExportCount = 0;
		let hasDefaultExport = false;
		let hasStarExport = false;
		let hasTypeExport = false;
		let namedExportNode;
		const { target } = options;
		function captureDeclaration(identifierOrPattern) {
			if (identifierOrPattern?.type === "ObjectPattern") for (const property of identifierOrPattern.properties) captureDeclaration(property.value);
			else if (identifierOrPattern?.type === "ArrayPattern") for (const el of identifierOrPattern.elements) captureDeclaration(el);
			else specifierExportCount++;
		}
		return {
			ExportDefaultSpecifier() {
				hasDefaultExport = true;
			},
			ExportSpecifier(node) {
				if (getValue(node.exported) === "default") hasDefaultExport = true;
				else {
					specifierExportCount++;
					namedExportNode = node;
				}
			},
			ExportNamedDeclaration(node) {
				if (!node.declaration) return;
				const { type } = node.declaration;
				if (type === "TSTypeAliasDeclaration" || type === "TSInterfaceDeclaration") {
					specifierExportCount++;
					hasTypeExport = true;
					return;
				}
				if ("declarations" in node.declaration && node.declaration.declarations) for (const declaration of node.declaration.declarations) captureDeclaration(declaration.id);
				else specifierExportCount++;
				namedExportNode = node;
			},
			ExportDefaultDeclaration() {
				hasDefaultExport = true;
			},
			ExportAllDeclaration() {
				hasStarExport = true;
			},
			"Program:exit": function() {
				if (hasDefaultExport || hasStarExport || hasTypeExport) return;
				if (target === "single" && specifierExportCount === 1) context.report({
					node: namedExportNode,
					messageId: "single"
				});
				else if (target === "any" && specifierExportCount > 0) context.report({
					node: namedExportNode,
					messageId: "any"
				});
			}
		};
	}
});
//#endregion
export { prefer_default_export_default as t };
