File size: 2,454 Bytes
04ec17f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/** @import { TSESTree } from '@typescript-eslint/types' */
/** @import { Visitors } from '../../types.js' */
/** @import { TSOptions } from '../types.js' */
import ts from '../ts/index.js';

/** @typedef {TSESTree.Node} Node */

/**
 * @param {TSOptions} [options]
 * @returns {Visitors<TSESTree.Node>}
 */
export default (options) => ({
	...ts(options),

	JSXElement(node, context) {
		context.visit(node.openingElement);

		if (node.children.length > 0) {
			context.indent();
		}

		for (const child of node.children) {
			context.visit(child);
		}

		if (node.children.length > 0) {
			context.dedent();
		}

		if (node.closingElement) {
			context.visit(node.closingElement);
		}
	},

	JSXOpeningElement(node, context) {
		context.write('<');

		context.visit(node.name);

		for (const attribute of node.attributes) {
			context.write(' ');
			context.visit(attribute);
		}

		if (node.selfClosing) {
			context.write(' /');
		}

		context.write('>');
	},

	JSXClosingElement(node, context) {
		context.write('</');

		context.visit(node.name);

		context.write('>');
	},

	JSXNamespacedName(node, context) {
		context.visit(node.namespace);
		context.write(':');
		context.visit(node.name);
	},

	JSXIdentifier(node, context) {
		context.write(node.name, node);
	},

	JSXMemberExpression(node, context) {
		context.visit(node.object);
		context.write('.');
		context.visit(node.property);
	},

	JSXText(node, context) {
		context.write(node.value, node);
	},

	JSXAttribute(node, context) {
		context.visit(node.name);
		if (node.value) {
			context.write('=');
			context.visit(node.value);
		}
	},

	JSXEmptyExpression(node, context) {},

	JSXFragment(node, context) {
		context.visit(node.openingFragment);

		if (node.children.length > 0) {
			context.indent();
		}

		for (const child of node.children) {
			context.visit(child);
		}

		if (node.children.length > 0) {
			context.dedent();
		}

		context.visit(node.closingFragment);
	},

	JSXOpeningFragment(node, context) {
		context.write('<>');
	},

	JSXClosingFragment(node, context) {
		context.write('</>');
	},

	JSXExpressionContainer(node, context) {
		context.write('{');

		context.visit(node.expression);

		context.write('}');
	},

	JSXSpreadChild(node, context) {
		context.write('{...');

		context.visit(node.expression);

		context.write('}');
	},

	JSXSpreadAttribute(node, context) {
		context.write('{...');

		context.visit(node.argument);

		context.write('}');
	}
});