hermes-transform 0.5.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/detachedNode.js +25 -49
- package/dist/detachedNode.js.flow +3 -3
- package/dist/generated/TransformCloneSignatures.js.flow +1728 -9
- package/dist/generated/TransformReplaceSignatures.js.flow +921 -780
- package/dist/generated/node-types.js +1099 -1156
- package/dist/generated/node-types.js.flow +77 -125
- package/dist/generated/special-case-node-types.js +106 -85
- package/dist/generated/special-case-node-types.js.flow +28 -2
- package/dist/getVisitorKeys.js +4 -6
- package/dist/getVisitorKeys.js.flow +1 -1
- package/dist/index.js +13 -18
- package/dist/index.js.flow +8 -2
- package/dist/transform/Errors.js +8 -116
- package/dist/transform/Errors.js.flow +1 -1
- package/dist/transform/MutationContext.js +54 -67
- package/dist/transform/MutationContext.js.flow +4 -3
- package/dist/transform/TransformContext.js +100 -58
- package/dist/transform/TransformContext.js.flow +277 -141
- package/dist/transform/comments/comments.js +127 -40
- package/dist/transform/comments/comments.js.flow +106 -29
- package/dist/transform/comments/prettier/common/util.js +46 -47
- package/dist/transform/comments/prettier/common/util.js.flow +1 -1
- package/dist/transform/comments/prettier/language-js/comments.js +199 -216
- package/dist/transform/comments/prettier/language-js/comments.js.flow +1 -1
- package/dist/transform/comments/prettier/language-js/loc.js +10 -9
- package/dist/transform/comments/prettier/language-js/loc.js.flow +1 -1
- package/dist/transform/comments/prettier/language-js/printer-estree.js +7 -6
- package/dist/transform/comments/prettier/language-js/printer-estree.js.flow +1 -1
- package/dist/transform/comments/prettier/language-js/utils.js +18 -30
- package/dist/transform/comments/prettier/language-js/utils.js.flow +1 -1
- package/dist/transform/comments/prettier/main/comments.js +225 -298
- package/dist/transform/comments/prettier/main/comments.js.flow +1 -1
- package/dist/transform/comments/prettier/utils/get-last.js +2 -4
- package/dist/transform/comments/prettier/utils/get-last.js.flow +1 -1
- package/dist/transform/getTransformedAST.js +81 -104
- package/dist/transform/getTransformedAST.js.flow +18 -13
- package/dist/transform/mutations/AddComments.js +43 -0
- package/dist/transform/mutations/AddComments.js.flow +50 -0
- package/dist/transform/mutations/CloneCommentsTo.js +16 -24
- package/dist/transform/mutations/CloneCommentsTo.js.flow +2 -3
- package/dist/transform/mutations/InsertStatement.js +28 -30
- package/dist/transform/mutations/InsertStatement.js.flow +7 -2
- package/dist/transform/mutations/RemoveComment.js +25 -43
- package/dist/transform/mutations/RemoveComment.js.flow +1 -1
- package/dist/transform/mutations/RemoveNode.js +192 -0
- package/dist/transform/mutations/RemoveNode.js.flow +290 -0
- package/dist/transform/mutations/RemoveStatement.js +7 -9
- package/dist/transform/mutations/RemoveStatement.js.flow +1 -1
- package/dist/transform/mutations/ReplaceNode.js +36 -44
- package/dist/transform/mutations/ReplaceNode.js.flow +1 -1
- package/dist/transform/mutations/ReplaceStatementWithMany.js +11 -13
- package/dist/transform/mutations/ReplaceStatementWithMany.js.flow +1 -1
- package/dist/transform/mutations/utils/arrayUtils.js +16 -14
- package/dist/transform/mutations/utils/arrayUtils.js.flow +16 -1
- package/dist/transform/mutations/utils/getStatementParent.js +23 -28
- package/dist/transform/mutations/utils/getStatementParent.js.flow +2 -2
- package/dist/transform/mutations/utils/isValidModuleDeclarationParent.js +7 -24
- package/dist/transform/mutations/utils/isValidModuleDeclarationParent.js.flow +1 -1
- package/dist/transform/transform.js +58 -30
- package/dist/transform/transform.js.flow +51 -13
- package/dist/traverse/NodeEventGenerator.js +91 -165
- package/dist/traverse/NodeEventGenerator.js.flow +1 -1
- package/dist/traverse/SafeEmitter.js +20 -38
- package/dist/traverse/SafeEmitter.js.flow +1 -1
- package/dist/traverse/SimpleTraverser.js +67 -98
- package/dist/traverse/SimpleTraverser.js.flow +4 -1
- package/dist/traverse/esquery.js +6 -6
- package/dist/traverse/esquery.js.flow +1 -1
- package/dist/traverse/traverse.js +64 -52
- package/dist/traverse/traverse.js.flow +63 -10
- package/package.json +5 -3
- package/dist/transform/mutations/AddLeadingComments.js +0 -47
- package/dist/transform/mutations/AddLeadingComments.js.flow +0 -49
- package/dist/transform/mutations/AddTrailingComments.js +0 -47
- package/dist/transform/mutations/AddTrailingComments.js.flow +0 -49
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -10,18 +10,19 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
+
import type {ESNode} from 'hermes-estree';
|
|
13
14
|
import type {Visitor} from '../traverse/traverse';
|
|
14
|
-
import type {
|
|
15
|
+
import type {TransformContextAdditions} from './TransformContext';
|
|
15
16
|
|
|
16
17
|
import * as prettier from 'prettier';
|
|
17
18
|
import {getTransformedAST} from './getTransformedAST';
|
|
18
19
|
import {SimpleTraverser} from '../traverse/SimpleTraverser';
|
|
19
20
|
|
|
20
|
-
export type
|
|
21
|
+
export type TransformVisitor = Visitor<TransformContextAdditions>;
|
|
21
22
|
|
|
22
23
|
export function transform(
|
|
23
24
|
originalCode: string,
|
|
24
|
-
visitors:
|
|
25
|
+
visitors: TransformVisitor,
|
|
25
26
|
prettierOptions: {...} = {},
|
|
26
27
|
): string {
|
|
27
28
|
const {ast, astWasMutated, mutatedCode} = getTransformedAST(
|
|
@@ -33,14 +34,25 @@ export function transform(
|
|
|
33
34
|
return originalCode;
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
// prettier fully expects the parent pointers are NOT set and
|
|
37
|
-
// certain cases can crash due to prettier infinite-looping
|
|
38
|
-
// whilst naively traversing the parent property
|
|
39
|
-
// https://github.com/prettier/prettier/issues/11793
|
|
40
37
|
SimpleTraverser.traverse(ast, {
|
|
41
38
|
enter(node) {
|
|
39
|
+
// prettier fully expects the parent pointers are NOT set and
|
|
40
|
+
// certain cases can crash due to prettier infinite-looping
|
|
41
|
+
// whilst naively traversing the parent property
|
|
42
|
+
// https://github.com/prettier/prettier/issues/11793
|
|
42
43
|
// $FlowExpectedError[cannot-write]
|
|
43
44
|
delete node.parent;
|
|
45
|
+
|
|
46
|
+
// prettier currently relies on the AST being in the old-school, deprecated AST format for optional chaining
|
|
47
|
+
// so we have to apply their transform to our AST so it can actually format it.
|
|
48
|
+
if (node.type === 'ChainExpression') {
|
|
49
|
+
const newNode = transformChainExpression(node.expression);
|
|
50
|
+
// $FlowExpectedError[cannot-write]
|
|
51
|
+
delete node.expression;
|
|
52
|
+
// $FlowExpectedError[prop-missing]
|
|
53
|
+
// $FlowExpectedError[cannot-write]
|
|
54
|
+
Object.assign(node, newNode);
|
|
55
|
+
}
|
|
44
56
|
},
|
|
45
57
|
leave() {},
|
|
46
58
|
});
|
|
@@ -51,10 +63,36 @@ export function transform(
|
|
|
51
63
|
// $FlowExpectedError[cannot-write]
|
|
52
64
|
delete ast.comments;
|
|
53
65
|
|
|
54
|
-
return prettier.format(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
66
|
+
return prettier.format(
|
|
67
|
+
mutatedCode,
|
|
68
|
+
// $FlowExpectedError[incompatible-exact] - we don't want to create a dependency on the prettier types
|
|
69
|
+
{
|
|
70
|
+
...prettierOptions,
|
|
71
|
+
parser() {
|
|
72
|
+
return ast;
|
|
73
|
+
},
|
|
58
74
|
},
|
|
59
|
-
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// https://github.com/prettier/prettier/blob/d962466a828f8ef51435e3e8840178d90b7ec6cd/src/language-js/parse/postprocess/index.js#L161-L182
|
|
79
|
+
function transformChainExpression(node: ESNode) {
|
|
80
|
+
switch (node.type) {
|
|
81
|
+
case 'CallExpression':
|
|
82
|
+
// $FlowExpectedError[cannot-write]
|
|
83
|
+
node.type = 'OptionalCallExpression';
|
|
84
|
+
// $FlowExpectedError[cannot-write]
|
|
85
|
+
node.callee = transformChainExpression(node.callee);
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case 'MemberExpression':
|
|
89
|
+
// $FlowExpectedError[cannot-write]
|
|
90
|
+
node.type = 'OptionalMemberExpression';
|
|
91
|
+
// $FlowExpectedError[cannot-write]
|
|
92
|
+
node.object = transformChainExpression(node.object);
|
|
93
|
+
break;
|
|
94
|
+
// No default
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return node;
|
|
60
98
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -9,8 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
-
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
13
|
-
|
|
14
12
|
Object.defineProperty(exports, "__esModule", {
|
|
15
13
|
value: true
|
|
16
14
|
});
|
|
@@ -20,36 +18,14 @@ var _hermesEslint = require("hermes-eslint");
|
|
|
20
18
|
|
|
21
19
|
var esquery = _interopRequireWildcard(require("./esquery"));
|
|
22
20
|
|
|
23
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function
|
|
24
|
-
|
|
25
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
26
|
-
|
|
27
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
28
|
-
|
|
29
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
30
|
-
|
|
31
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
32
|
-
|
|
33
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
34
|
-
|
|
35
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
21
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
36
22
|
|
|
37
|
-
function
|
|
23
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
38
24
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
42
|
-
|
|
43
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
44
|
-
|
|
45
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
46
|
-
|
|
47
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
48
|
-
|
|
49
|
-
var ESQUERY_OPTIONS = Object.freeze({
|
|
25
|
+
const ESQUERY_OPTIONS = Object.freeze({
|
|
50
26
|
visitorKeys: _hermesEslint.VisitorKeys,
|
|
51
|
-
fallback:
|
|
52
|
-
throw new Error(
|
|
27
|
+
fallback: node => {
|
|
28
|
+
throw new Error(`No visitor keys found for node type "${node.type}".`);
|
|
53
29
|
}
|
|
54
30
|
});
|
|
55
31
|
/**
|
|
@@ -58,12 +34,8 @@ var ESQUERY_OPTIONS = Object.freeze({
|
|
|
58
34
|
* @returns The union of the input arrays
|
|
59
35
|
*/
|
|
60
36
|
|
|
61
|
-
function union() {
|
|
62
|
-
|
|
63
|
-
arrays[_key] = arguments[_key];
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return _toConsumableArray(new Set(arrays.flat()));
|
|
37
|
+
function union(...arrays) {
|
|
38
|
+
return [...new Set(arrays.flat())];
|
|
67
39
|
}
|
|
68
40
|
/**
|
|
69
41
|
* Computes the intersection of one or more arrays
|
|
@@ -72,35 +44,15 @@ function union() {
|
|
|
72
44
|
*/
|
|
73
45
|
|
|
74
46
|
|
|
75
|
-
function intersection() {
|
|
76
|
-
for (var _len2 = arguments.length, arrays = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
77
|
-
arrays[_key2] = arguments[_key2];
|
|
78
|
-
}
|
|
79
|
-
|
|
47
|
+
function intersection(...arrays) {
|
|
80
48
|
if (arrays.length === 0) {
|
|
81
49
|
return [];
|
|
82
50
|
}
|
|
83
51
|
|
|
84
|
-
|
|
52
|
+
let result = [...new Set(arrays[0])];
|
|
85
53
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
try {
|
|
90
|
-
var _loop = function _loop() {
|
|
91
|
-
var array = _step.value;
|
|
92
|
-
result = result.filter(function (x) {
|
|
93
|
-
return array.includes(x);
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
98
|
-
_loop();
|
|
99
|
-
}
|
|
100
|
-
} catch (err) {
|
|
101
|
-
_iterator.e(err);
|
|
102
|
-
} finally {
|
|
103
|
-
_iterator.f();
|
|
54
|
+
for (const array of arrays.slice(1)) {
|
|
55
|
+
result = result.filter(x => array.includes(x));
|
|
104
56
|
}
|
|
105
57
|
|
|
106
58
|
return result;
|
|
@@ -116,7 +68,7 @@ function getPossibleTypes(parsedSelector) {
|
|
|
116
68
|
switch (parsedSelector.type) {
|
|
117
69
|
case 'identifier':
|
|
118
70
|
if (!(parsedSelector.value in _hermesEslint.VisitorKeys)) {
|
|
119
|
-
throw new Error(
|
|
71
|
+
throw new Error(`Unexpected selector ${parsedSelector.value}`);
|
|
120
72
|
} // $FlowExpectedError[incompatible-return]
|
|
121
73
|
|
|
122
74
|
|
|
@@ -124,11 +76,11 @@ function getPossibleTypes(parsedSelector) {
|
|
|
124
76
|
|
|
125
77
|
case 'matches':
|
|
126
78
|
{
|
|
127
|
-
|
|
128
|
-
|
|
79
|
+
const typesForComponents = parsedSelector.selectors.map(getPossibleTypes);
|
|
80
|
+
const typesForComponentsNonNull = typesForComponents.filter(Boolean);
|
|
129
81
|
|
|
130
82
|
if (typesForComponents.length === typesForComponentsNonNull.length) {
|
|
131
|
-
return union
|
|
83
|
+
return union(...typesForComponentsNonNull);
|
|
132
84
|
}
|
|
133
85
|
|
|
134
86
|
return null;
|
|
@@ -136,10 +88,9 @@ function getPossibleTypes(parsedSelector) {
|
|
|
136
88
|
|
|
137
89
|
case 'compound':
|
|
138
90
|
{
|
|
139
|
-
|
|
140
|
-
|
|
91
|
+
const typesForComponents = parsedSelector.selectors.map(getPossibleTypes).filter(Boolean); // If all of the components could match any type, then the compound could also match any type.
|
|
141
92
|
|
|
142
|
-
if (!
|
|
93
|
+
if (!typesForComponents.length) {
|
|
143
94
|
return null;
|
|
144
95
|
}
|
|
145
96
|
/*
|
|
@@ -148,7 +99,7 @@ function getPossibleTypes(parsedSelector) {
|
|
|
148
99
|
*/
|
|
149
100
|
|
|
150
101
|
|
|
151
|
-
return intersection
|
|
102
|
+
return intersection(...typesForComponents);
|
|
152
103
|
}
|
|
153
104
|
|
|
154
105
|
case 'child':
|
|
@@ -186,9 +137,7 @@ function countClassAttributes(parsedSelector) {
|
|
|
186
137
|
case 'compound':
|
|
187
138
|
case 'not':
|
|
188
139
|
case 'matches':
|
|
189
|
-
return parsedSelector.selectors.reduce(
|
|
190
|
-
return sum + countClassAttributes(childSelector);
|
|
191
|
-
}, 0);
|
|
140
|
+
return parsedSelector.selectors.reduce((sum, childSelector) => sum + countClassAttributes(childSelector), 0);
|
|
192
141
|
|
|
193
142
|
case 'attribute':
|
|
194
143
|
case 'field':
|
|
@@ -218,9 +167,7 @@ function countIdentifiers(parsedSelector) {
|
|
|
218
167
|
case 'compound':
|
|
219
168
|
case 'not':
|
|
220
169
|
case 'matches':
|
|
221
|
-
return parsedSelector.selectors.reduce(
|
|
222
|
-
return sum + countIdentifiers(childSelector);
|
|
223
|
-
}, 0);
|
|
170
|
+
return parsedSelector.selectors.reduce((sum, childSelector) => sum + countIdentifiers(childSelector), 0);
|
|
224
171
|
|
|
225
172
|
case 'identifier':
|
|
226
173
|
return 1;
|
|
@@ -254,17 +201,17 @@ function compareSpecificity(selectorA, selectorB) {
|
|
|
254
201
|
|
|
255
202
|
function tryParseSelector(rawSelector) {
|
|
256
203
|
try {
|
|
257
|
-
return esquery.parse(rawSelector.replace(/:exit
|
|
204
|
+
return esquery.parse(rawSelector.replace(/:exit$/u, ''));
|
|
258
205
|
} catch (err) {
|
|
259
206
|
if (err.location && err.location.start && typeof err.location.start.offset === 'number') {
|
|
260
|
-
throw new SyntaxError(
|
|
207
|
+
throw new SyntaxError(`Syntax error in selector "${rawSelector}" at position ${err.location.start.offset}: ${err.message}`);
|
|
261
208
|
}
|
|
262
209
|
|
|
263
210
|
throw err;
|
|
264
211
|
}
|
|
265
212
|
}
|
|
266
213
|
|
|
267
|
-
|
|
214
|
+
const selectorCache = new Map();
|
|
268
215
|
/**
|
|
269
216
|
* Parses a raw selector string, and returns the parsed selector along with specificity and type information.
|
|
270
217
|
* @param rawSelector A raw AST selector
|
|
@@ -272,17 +219,17 @@ var selectorCache = new Map();
|
|
|
272
219
|
*/
|
|
273
220
|
|
|
274
221
|
function parseSelector(rawSelector) {
|
|
275
|
-
|
|
222
|
+
const cachedSelector = selectorCache.get(rawSelector);
|
|
276
223
|
|
|
277
224
|
if (cachedSelector) {
|
|
278
225
|
return cachedSelector;
|
|
279
226
|
}
|
|
280
227
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
rawSelector
|
|
228
|
+
const parsedSelector = tryParseSelector(rawSelector);
|
|
229
|
+
const result = {
|
|
230
|
+
rawSelector,
|
|
284
231
|
isExit: rawSelector.endsWith(':exit'),
|
|
285
|
-
parsedSelector
|
|
232
|
+
parsedSelector,
|
|
286
233
|
listenerTypes: getPossibleTypes(parsedSelector),
|
|
287
234
|
attributeCount: countClassAttributes(parsedSelector),
|
|
288
235
|
identifierCount: countIdentifiers(parsedSelector)
|
|
@@ -295,38 +242,28 @@ function parseSelector(rawSelector) {
|
|
|
295
242
|
*/
|
|
296
243
|
|
|
297
244
|
|
|
298
|
-
|
|
245
|
+
class NodeEventGenerator {
|
|
299
246
|
/**
|
|
300
247
|
* @param emitter
|
|
301
248
|
* An SafeEmitter which is the destination of events. This emitter must already
|
|
302
249
|
* have registered listeners for all of the events that it needs to listen for.
|
|
303
250
|
* (See lib/linter/safe-emitter.js for more details on `SafeEmitter`.)
|
|
304
251
|
*/
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
_defineProperty(this, "_currentAncestry", []);
|
|
313
|
-
|
|
314
|
-
_defineProperty(this, "_enterSelectorsByNodeType", new Map());
|
|
315
|
-
|
|
316
|
-
_defineProperty(this, "_exitSelectorsByNodeType", new Map());
|
|
317
|
-
|
|
318
|
-
_defineProperty(this, "_anyTypeEnterSelectors", []);
|
|
319
|
-
|
|
320
|
-
_defineProperty(this, "_anyTypeExitSelectors", []);
|
|
321
|
-
|
|
252
|
+
constructor(emitter) {
|
|
253
|
+
this.emitter = void 0;
|
|
254
|
+
this._currentAncestry = [];
|
|
255
|
+
this._enterSelectorsByNodeType = new Map();
|
|
256
|
+
this._exitSelectorsByNodeType = new Map();
|
|
257
|
+
this._anyTypeEnterSelectors = [];
|
|
258
|
+
this._anyTypeExitSelectors = [];
|
|
322
259
|
this.emitter = emitter;
|
|
323
|
-
emitter.eventNames().forEach(
|
|
324
|
-
|
|
260
|
+
emitter.eventNames().forEach(rawSelector => {
|
|
261
|
+
const selector = parseSelector(rawSelector);
|
|
325
262
|
|
|
326
263
|
if (selector.listenerTypes) {
|
|
327
|
-
|
|
328
|
-
selector.listenerTypes.forEach(
|
|
329
|
-
|
|
264
|
+
const typeMap = selector.isExit ? this._exitSelectorsByNodeType : this._enterSelectorsByNodeType;
|
|
265
|
+
selector.listenerTypes.forEach(nodeType => {
|
|
266
|
+
const selectors = typeMap.get(nodeType);
|
|
330
267
|
|
|
331
268
|
if (!selectors) {
|
|
332
269
|
typeMap.set(nodeType, [selector]);
|
|
@@ -335,7 +272,7 @@ var NodeEventGenerator = /*#__PURE__*/function () {
|
|
|
335
272
|
}
|
|
336
273
|
});
|
|
337
274
|
} else {
|
|
338
|
-
|
|
275
|
+
const selectors = selector.isExit ? this._anyTypeExitSelectors : this._anyTypeEnterSelectors;
|
|
339
276
|
selectors.push(selector);
|
|
340
277
|
}
|
|
341
278
|
});
|
|
@@ -344,13 +281,9 @@ var NodeEventGenerator = /*#__PURE__*/function () {
|
|
|
344
281
|
|
|
345
282
|
this._anyTypeExitSelectors.sort(compareSpecificity);
|
|
346
283
|
|
|
347
|
-
this._enterSelectorsByNodeType.forEach(
|
|
348
|
-
return selectorList.sort(compareSpecificity);
|
|
349
|
-
});
|
|
284
|
+
this._enterSelectorsByNodeType.forEach(selectorList => selectorList.sort(compareSpecificity));
|
|
350
285
|
|
|
351
|
-
this._exitSelectorsByNodeType.forEach(
|
|
352
|
-
return selectorList.sort(compareSpecificity);
|
|
353
|
-
});
|
|
286
|
+
this._exitSelectorsByNodeType.forEach(selectorList => selectorList.sort(compareSpecificity));
|
|
354
287
|
}
|
|
355
288
|
/**
|
|
356
289
|
* Checks a selector against a node, and emits it if it matches
|
|
@@ -360,68 +293,61 @@ var NodeEventGenerator = /*#__PURE__*/function () {
|
|
|
360
293
|
*/
|
|
361
294
|
|
|
362
295
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
if (esquery.matches(node, selector.parsedSelector, this._currentAncestry, ESQUERY_OPTIONS)) {
|
|
367
|
-
this.emitter.emit(selector.rawSelector, node);
|
|
368
|
-
}
|
|
296
|
+
_applySelector(node, selector) {
|
|
297
|
+
if (esquery.matches(node, selector.parsedSelector, this._currentAncestry, ESQUERY_OPTIONS)) {
|
|
298
|
+
this.emitter.emit(selector.rawSelector, node);
|
|
369
299
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Applies all appropriate selectors to a node, in specificity order
|
|
303
|
+
* @param node The node to check
|
|
304
|
+
* @param isExit `false` if the node is currently being entered, `true` if it's currently being exited
|
|
305
|
+
* @private
|
|
306
|
+
*/
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
_applySelectors(node, isExit) {
|
|
310
|
+
const selectorsByNodeType = (isExit ? this._exitSelectorsByNodeType : this._enterSelectorsByNodeType).get(node.type) || [];
|
|
311
|
+
const anyTypeSelectors = isExit ? this._anyTypeExitSelectors : this._anyTypeEnterSelectors;
|
|
312
|
+
/*
|
|
313
|
+
* selectorsByNodeType and anyTypeSelectors were already sorted by specificity in the constructor.
|
|
314
|
+
* Iterate through each of them, applying selectors in the right order.
|
|
375
315
|
*/
|
|
376
316
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
*/
|
|
386
|
-
|
|
387
|
-
var selectorsByTypeIndex = 0;
|
|
388
|
-
var anyTypeSelectorsIndex = 0;
|
|
389
|
-
|
|
390
|
-
while (selectorsByTypeIndex < selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length) {
|
|
391
|
-
if (selectorsByTypeIndex >= selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length && compareSpecificity(anyTypeSelectors[anyTypeSelectorsIndex], selectorsByNodeType[selectorsByTypeIndex]) < 0) {
|
|
392
|
-
this._applySelector(node, anyTypeSelectors[anyTypeSelectorsIndex++]);
|
|
393
|
-
} else {
|
|
394
|
-
this._applySelector(node, selectorsByNodeType[selectorsByTypeIndex++]);
|
|
395
|
-
}
|
|
317
|
+
let selectorsByTypeIndex = 0;
|
|
318
|
+
let anyTypeSelectorsIndex = 0;
|
|
319
|
+
|
|
320
|
+
while (selectorsByTypeIndex < selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length) {
|
|
321
|
+
if (selectorsByTypeIndex >= selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length && compareSpecificity(anyTypeSelectors[anyTypeSelectorsIndex], selectorsByNodeType[selectorsByTypeIndex]) < 0) {
|
|
322
|
+
this._applySelector(node, anyTypeSelectors[anyTypeSelectorsIndex++]);
|
|
323
|
+
} else {
|
|
324
|
+
this._applySelector(node, selectorsByNodeType[selectorsByTypeIndex++]);
|
|
396
325
|
}
|
|
397
326
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Emits an event of entering AST node.
|
|
330
|
+
* @param node A node which was entered.
|
|
331
|
+
*/
|
|
402
332
|
|
|
403
|
-
}, {
|
|
404
|
-
key: "enterNode",
|
|
405
|
-
value: function enterNode(node) {
|
|
406
|
-
this._applySelectors(node, false);
|
|
407
333
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
334
|
+
enterNode(node) {
|
|
335
|
+
this._applySelectors(node, false);
|
|
336
|
+
|
|
337
|
+
this._currentAncestry.unshift(node);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Emits an event of leaving AST node.
|
|
341
|
+
* @param node A node which was left.
|
|
342
|
+
*/
|
|
414
343
|
|
|
415
|
-
}, {
|
|
416
|
-
key: "leaveNode",
|
|
417
|
-
value: function leaveNode(node) {
|
|
418
|
-
this._currentAncestry.shift();
|
|
419
344
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
}]);
|
|
345
|
+
leaveNode(node) {
|
|
346
|
+
this._currentAncestry.shift();
|
|
423
347
|
|
|
424
|
-
|
|
425
|
-
}
|
|
348
|
+
this._applySelectors(node, true);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
}
|
|
426
352
|
|
|
427
353
|
exports.NodeEventGenerator = NodeEventGenerator;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright (c)
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -14,14 +14,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
14
14
|
});
|
|
15
15
|
exports.SafeEmitter = void 0;
|
|
16
16
|
|
|
17
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
18
|
-
|
|
19
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
20
|
-
|
|
21
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
22
|
-
|
|
23
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
24
|
-
|
|
25
17
|
/**
|
|
26
18
|
* Creates an object which can listen for and emit events.
|
|
27
19
|
* This is similar to the EventEmitter API in Node's standard library, but it has a few differences.
|
|
@@ -32,39 +24,29 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
32
24
|
* 2. It calls listener functions without any `this` value. (`EventEmitter` calls listeners with a
|
|
33
25
|
* `this` value of the emitter instance, which would give listeners access to other listeners.)
|
|
34
26
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
_defineProperty(this, "listeners", Object.create(null));
|
|
27
|
+
class SafeEmitter {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.listeners = Object.create(null);
|
|
40
30
|
}
|
|
41
31
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} else {
|
|
48
|
-
this.listeners[eventName] = [listener];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}, {
|
|
52
|
-
key: "emit",
|
|
53
|
-
value: function emit(eventName, node) {
|
|
54
|
-
if (eventName in this.listeners) {
|
|
55
|
-
this.listeners[eventName].forEach(function (listener) {
|
|
56
|
-
return listener(node);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
32
|
+
on(eventName, listener) {
|
|
33
|
+
if (eventName in this.listeners) {
|
|
34
|
+
this.listeners[eventName].push(listener);
|
|
35
|
+
} else {
|
|
36
|
+
this.listeners[eventName] = [listener];
|
|
59
37
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
emit(eventName, node) {
|
|
41
|
+
if (eventName in this.listeners) {
|
|
42
|
+
this.listeners[eventName].forEach(listener => listener(node));
|
|
64
43
|
}
|
|
65
|
-
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
eventNames() {
|
|
47
|
+
return Object.keys(this.listeners);
|
|
48
|
+
}
|
|
66
49
|
|
|
67
|
-
|
|
68
|
-
}();
|
|
50
|
+
}
|
|
69
51
|
|
|
70
52
|
exports.SafeEmitter = SafeEmitter;
|