-
Notifications
You must be signed in to change notification settings - Fork 618
/
Copy path_macros.js
102 lines (96 loc) · 2.53 KB
/
_macros.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
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
// This is a workaround for the @typescript-eslint/naming-convention rule, whose options currently
// support a "selector" field that cannot match multiple selectors. This function receives an input
// array such as:
//
// [
// {
// selectors: ['class', 'typeAlias', 'enum'],
// format: ['PascalCase']
// },
// . . .
// ]
//
// ...and transforms "selectors" -> "selector, returning an array with expanded entries like this:
//
// [
// {
// selector: 'class',
// format: ['PascalCase']
// },
// {
// selector: 'typeAlias',
// format: ['PascalCase']
// },
// {
// selector: 'enum',
// format: ['PascalCase']
// },
// . . .
// ]
//
// It also supports a "enforceLeadingUnderscoreWhenPrivate" macro that expands this:
//
// [
// {
// selectors: ['property'],
// enforceLeadingUnderscoreWhenPrivate: true,
// format: ['camelCase']
// },
// . . .
// ]
//
// ...to produce this:
//
// [
// {
// selector: 'property',
//
// leadingUnderscore: 'allow',
// format: ['camelCase']
// },
// {
// selector: 'property',
// modifiers: ['private'],
//
// leadingUnderscore: 'require',
// format: ['camelCase']
// },
// . . .
// ]
function expandNamingConventionSelectors(inputBlocks) {
const firstPassBlocks = [];
// Expand "selectors" --> "selector"
for (const block of inputBlocks) {
for (const selector of block.selectors) {
const expandedBlock = { ...block };
delete expandedBlock.selectors;
expandedBlock.selector = selector;
firstPassBlocks.push(expandedBlock);
}
}
// Expand "enforceLeadingUnderscoreWhenPrivate" --> "leadingUnderscore"
const secondPassBlocks = [];
for (const block of firstPassBlocks) {
if (block.enforceLeadingUnderscoreWhenPrivate) {
const expandedBlock1 = {
...block,
leadingUnderscore: 'allow'
};
delete expandedBlock1.enforceLeadingUnderscoreWhenPrivate;
secondPassBlocks.push(expandedBlock1);
const expandedBlock2 = {
...block,
modifiers: [...(block.modifiers ?? []), 'private'],
leadingUnderscore: 'require'
};
delete expandedBlock2.enforceLeadingUnderscoreWhenPrivate;
secondPassBlocks.push(expandedBlock2);
} else {
secondPassBlocks.push(block);
}
}
return secondPassBlocks;
}
exports.expandNamingConventionSelectors = expandNamingConventionSelectors;