-
-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
utils.js
117 lines (98 loc) · 2.72 KB
/
utils.js
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
"use strict";
const { htmlVoidElements } = require("../../vendors/html-void-elements.json");
const getLast = require("../utils/get-last.js");
function isLastNodeOfSiblings(path) {
const node = path.getValue();
const parentNode = path.getParentNode(0);
if (
isParentOfSomeType(path, ["ElementNode"]) &&
getLast(parentNode.children) === node
) {
return true;
}
if (
isParentOfSomeType(path, ["Block"]) &&
getLast(parentNode.body) === node
) {
return true;
}
return false;
}
function isUppercase(string) {
return string.toUpperCase() === string;
}
function isGlimmerComponent(node) {
return (
isNodeOfSomeType(node, ["ElementNode"]) &&
typeof node.tag === "string" &&
!node.tag.startsWith(":") &&
(isUppercase(node.tag[0]) || node.tag.includes("."))
);
}
const voidTags = new Set(htmlVoidElements);
function isVoid(node) {
return (
voidTags.has(node.tag) ||
node.selfClosing === true ||
(isGlimmerComponent(node) &&
node.children.every((node) => isWhitespaceNode(node)))
);
}
function isWhitespaceNode(node) {
return isNodeOfSomeType(node, ["TextNode"]) && !/\S/.test(node.chars);
}
function isNodeOfSomeType(node, types) {
return node && types.includes(node.type);
}
function isParentOfSomeType(path, types) {
const parentNode = path.getParentNode(0);
return isNodeOfSomeType(parentNode, types);
}
function isPreviousNodeOfSomeType(path, types) {
const previousNode = getPreviousNode(path);
return isNodeOfSomeType(previousNode, types);
}
function isNextNodeOfSomeType(path, types) {
const nextNode = getNextNode(path);
return isNodeOfSomeType(nextNode, types);
}
function getSiblingNode(path, offset) {
const node = path.getValue();
const parentNode = path.getParentNode(0) ?? {};
const children =
parentNode.children ?? parentNode.body ?? parentNode.parts ?? [];
const index = children.indexOf(node);
return index !== -1 && children[index + offset];
}
function getPreviousNode(path, lookBack = 1) {
return getSiblingNode(path, -lookBack);
}
function getNextNode(path) {
return getSiblingNode(path, 1);
}
function isPrettierIgnoreNode(node) {
return (
isNodeOfSomeType(node, ["MustacheCommentStatement"]) &&
typeof node.value === "string" &&
node.value.trim() === "prettier-ignore"
);
}
function hasPrettierIgnore(path) {
const node = path.getValue();
const previousPreviousNode = getPreviousNode(path, 2);
return (
isPrettierIgnoreNode(node) || isPrettierIgnoreNode(previousPreviousNode)
);
}
module.exports = {
getNextNode,
getPreviousNode,
hasPrettierIgnore,
isLastNodeOfSiblings,
isNextNodeOfSomeType,
isNodeOfSomeType,
isParentOfSomeType,
isPreviousNodeOfSomeType,
isVoid,
isWhitespaceNode,
};