@fenge/eslint-plugin 0.1.1 → 0.1.2-beta.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @fenge/eslint-plugin
2
2
 
3
+ ## 0.1.2-beta.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 0d0f18c: chore: refresh pkg, no changes
8
+
9
+ ## 0.1.2-beta.0
10
+
11
+ ### Patch Changes
12
+
13
+ - 51502cc: feat: add rule `@fenge/no-jsx-in-non-jsx-file`
14
+ - 713d9a2: feat(eslint-plugin): support glob for `call-arguments-length` option
15
+
3
16
  ## 0.1.1
4
17
 
5
18
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK;;CAKjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;CAMjB,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import { callArgumentsLength } from "./rules/call-arguments-length.js";
2
2
  import { noInstanceofBuiltin } from "./rules/no-instanceof-builtin.js";
3
+ import { noJsxInNonJsxFile } from "./rules/no-jsx-in-non-jsx-file.js";
3
4
  import { noRestrictedLoops } from "./rules/no-restricted-loops.js";
4
5
  import { noUnnecessaryTemplateString } from "./rules/no-unnecessary-template-string.js";
5
6
  export const rules = {
6
7
  [callArgumentsLength.name]: callArgumentsLength.rule,
7
8
  [noInstanceofBuiltin.name]: noInstanceofBuiltin.rule,
9
+ [noJsxInNonJsxFile.name]: noJsxInNonJsxFile.rule,
8
10
  [noRestrictedLoops.name]: noRestrictedLoops.rule,
9
11
  [noUnnecessaryTemplateString.name]: noUnnecessaryTemplateString.rule,
10
12
  };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFeEYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ2hELENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEVBQUUsMkJBQTJCLENBQUMsSUFBSTtDQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FsbEFyZ3VtZW50c0xlbmd0aCB9IGZyb20gXCIuL3J1bGVzL2NhbGwtYXJndW1lbnRzLWxlbmd0aC5qc1wiO1xuaW1wb3J0IHsgbm9JbnN0YW5jZW9mQnVpbHRpbiB9IGZyb20gXCIuL3J1bGVzL25vLWluc3RhbmNlb2YtYnVpbHRpbi5qc1wiO1xuaW1wb3J0IHsgbm9SZXN0cmljdGVkTG9vcHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLmpzXCI7XG5pbXBvcnQgeyBub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcgfSBmcm9tIFwiLi9ydWxlcy9uby11bm5lY2Vzc2FyeS10ZW1wbGF0ZS1zdHJpbmcuanNcIjtcblxuZXhwb3J0IGNvbnN0IHJ1bGVzID0ge1xuICBbY2FsbEFyZ3VtZW50c0xlbmd0aC5uYW1lXTogY2FsbEFyZ3VtZW50c0xlbmd0aC5ydWxlLFxuICBbbm9JbnN0YW5jZW9mQnVpbHRpbi5uYW1lXTogbm9JbnN0YW5jZW9mQnVpbHRpbi5ydWxlLFxuICBbbm9SZXN0cmljdGVkTG9vcHMubmFtZV06IG5vUmVzdHJpY3RlZExvb3BzLnJ1bGUsXG4gIFtub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcubmFtZV06IG5vVW5uZWNlc3NhcnlUZW1wbGF0ZVN0cmluZy5ydWxlLFxufTtcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFeEYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ2hELENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtJQUNoRCxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUk7Q0FDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbGxBcmd1bWVudHNMZW5ndGggfSBmcm9tIFwiLi9ydWxlcy9jYWxsLWFyZ3VtZW50cy1sZW5ndGguanNcIjtcbmltcG9ydCB7IG5vSW5zdGFuY2VvZkJ1aWx0aW4gfSBmcm9tIFwiLi9ydWxlcy9uby1pbnN0YW5jZW9mLWJ1aWx0aW4uanNcIjtcbmltcG9ydCB7IG5vSnN4SW5Ob25Kc3hGaWxlIH0gZnJvbSBcIi4vcnVsZXMvbm8tanN4LWluLW5vbi1qc3gtZmlsZS5qc1wiO1xuaW1wb3J0IHsgbm9SZXN0cmljdGVkTG9vcHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLmpzXCI7XG5pbXBvcnQgeyBub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcgfSBmcm9tIFwiLi9ydWxlcy9uby11bm5lY2Vzc2FyeS10ZW1wbGF0ZS1zdHJpbmcuanNcIjtcblxuZXhwb3J0IGNvbnN0IHJ1bGVzID0ge1xuICBbY2FsbEFyZ3VtZW50c0xlbmd0aC5uYW1lXTogY2FsbEFyZ3VtZW50c0xlbmd0aC5ydWxlLFxuICBbbm9JbnN0YW5jZW9mQnVpbHRpbi5uYW1lXTogbm9JbnN0YW5jZW9mQnVpbHRpbi5ydWxlLFxuICBbbm9Kc3hJbk5vbkpzeEZpbGUubmFtZV06IG5vSnN4SW5Ob25Kc3hGaWxlLnJ1bGUsXG4gIFtub1Jlc3RyaWN0ZWRMb29wcy5uYW1lXTogbm9SZXN0cmljdGVkTG9vcHMucnVsZSxcbiAgW25vVW5uZWNlc3NhcnlUZW1wbGF0ZVN0cmluZy5uYW1lXTogbm9Vbm5lY2Vzc2FyeVRlbXBsYXRlU3RyaW5nLnJ1bGUsXG59O1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"call-arguments-length.d.ts","sourceRoot":"","sources":["../../src/rules/call-arguments-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA0InC,eAAO,MAAM,mBAAmB;;;CAAiB,CAAC"}
1
+ {"version":3,"file":"call-arguments-length.d.ts","sourceRoot":"","sources":["../../src/rules/call-arguments-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkKnC,eAAO,MAAM,mBAAmB;;;CAAiB,CAAC"}
@@ -23,12 +23,12 @@ const rule = {
23
23
  if (typeof expectedLength === "object" &&
24
24
  expectedLength &&
25
25
  "min" in expectedLength) {
26
- result.push(`>= ${expectedLength.min}`);
26
+ result.push(`>= ${String(expectedLength.min)}`);
27
27
  }
28
28
  if (typeof expectedLength === "object" &&
29
29
  expectedLength &&
30
30
  "max" in expectedLength) {
31
- result.push(`<= ${expectedLength.max}`);
31
+ result.push(`<= ${String(expectedLength.max)}`);
32
32
  }
33
33
  return result.join(" and ");
34
34
  };
@@ -69,44 +69,60 @@ const rule = {
69
69
  });
70
70
  };
71
71
  const options = Object.entries(context.options[0] ?? {
72
+ // 1
72
73
  "*.reduce": 2,
73
74
  "*.reduceRight": 2,
74
75
  "*.push": { min: 1 },
76
+ "Math.max": { min: 2 },
77
+ "Math.min": { min: 2 },
78
+ // 2
75
79
  "new Set": { max: 1 },
76
80
  "new Map": { max: 1 },
77
- });
78
- return {
79
- CallExpression: (node) => {
80
- // function call
81
- if (node.callee.type === "Identifier") {
82
- for (const [pattern, expectedLength] of options.filter(([pattern]) => !pattern.startsWith("*.") && !pattern.startsWith("new "))) {
83
- if (node.callee.name !== pattern)
84
- continue;
85
- report(node, pattern, expectedLength);
81
+ }).map(([pattern, expectedLength]) => ({
82
+ regex: new RegExp(`^${pattern.replaceAll(".", "\\.").replaceAll("*", ".*")}$`),
83
+ pattern,
84
+ expectedLength,
85
+ }));
86
+ const handle = (node) => {
87
+ const prefix = node.type === "NewExpression" ? "new " : "";
88
+ const { callee } = node;
89
+ // function call
90
+ if (callee.type === "Identifier") {
91
+ // code like `foo()` or `new Foo()`
92
+ options
93
+ .filter((option) => option.regex.test(`${prefix}${callee.name}`))
94
+ .forEach(({ pattern, expectedLength }) => {
95
+ report(node, pattern, expectedLength);
96
+ });
97
+ }
98
+ // method call
99
+ else if (callee.type === "MemberExpression" &&
100
+ callee.property.type === "Identifier") {
101
+ const { object: calleeObject, property: calleeProperty } = callee;
102
+ options
103
+ .filter((option) => {
104
+ // code like `Math.max()` or `new Foo.Bar()`, the calleeObject is `Math` or `Foo`
105
+ if ("name" in calleeObject &&
106
+ option.regex.test(`${prefix}${calleeObject.name}.${calleeProperty.name}`)) {
107
+ return true;
86
108
  }
87
- }
88
- // method call
89
- else if (node.callee.type === "MemberExpression" &&
90
- node.callee.property.type === "Identifier") {
91
- for (const [pattern, expectedLength] of options.filter(([pattern]) => pattern.startsWith("*."))) {
92
- if (node.callee.property.name !== pattern.split(".")[1])
93
- continue;
94
- report(node, pattern, expectedLength);
109
+ // code like `[].reduce()` or `new ({Foo: class{}}).Foo()`, the calleeObject is `[]` or `{Foo: class{}}`
110
+ if (!("name" in calleeObject) &&
111
+ option.regex.test(`${prefix}.${calleeProperty.name}`)) {
112
+ return true;
95
113
  }
96
- }
97
- },
98
- // new call
99
- NewExpression: (node) => {
100
- if (node.callee.type !== "Identifier")
101
- return;
102
- for (const [pattern, expectedLength] of options.filter(([pattern]) => pattern.startsWith("new "))) {
103
- if (node.callee.name !== pattern.split(" ")[1])
104
- continue;
114
+ return false;
115
+ })
116
+ .forEach(({ pattern, expectedLength }) => {
105
117
  report(node, pattern, expectedLength);
106
- }
107
- },
118
+ });
119
+ }
120
+ };
121
+ return {
122
+ CallExpression: handle,
123
+ NewExpression: handle,
108
124
  };
109
125
  },
110
126
  };
111
127
  export const callArgumentsLength = { name, rule };
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1hcmd1bWVudHMtbGVuZ3RoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL2NhbGwtYXJndW1lbnRzLWxlbmd0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDBJQUEwSTtBQUMxSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDhEQUE4RDtTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLG1GQUFtRjtTQUN0RjtRQUNELE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsNENBQTRDO0tBQzNFO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxjQUF1QixFQUFFLEVBQUU7WUFDL0MsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWMsRUFDdkIsQ0FBQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELElBQ0UsT0FBTyxjQUFjLEtBQUssUUFBUTtnQkFDbEMsY0FBYztnQkFDZCxLQUFLLElBQUksY0FBYyxFQUN2QixDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBYyxFQUFFLGNBQXVCLEVBQUUsRUFBRTtZQUNoRSxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLE1BQU0sS0FBSyxjQUFjLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztZQUM3QixJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWM7Z0JBQ3ZCLE9BQU8sY0FBYyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQ3RDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWM7Z0JBQ3ZCLE9BQU8sY0FBYyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQ3RDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLENBQ2IsSUFBb0MsRUFDcEMsZUFBdUIsRUFDdkIsY0FBdUIsRUFDdkIsRUFBRTtZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxlQUFlLENBQ3RDO2dCQUNDLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQ2IsSUFBSTtvQkFDSixTQUFTLEVBQUUsR0FBRyxJQUFJLFFBQVE7b0JBQzFCLElBQUksRUFBRTt3QkFDSixlQUFlO3dCQUNmLFNBQVMsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDO3FCQUN4QztpQkFDRixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3BCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsZUFBZSxFQUFFLENBQUM7WUFDbEIsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtZQUNwQixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7U0FDdEIsQ0FDRixDQUFDO1FBQ0YsT0FBTztZQUNMLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN2QixnQkFBZ0I7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3RDLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUNwRCxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUNaLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQzNELEVBQUUsQ0FBQzt3QkFDRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU87NEJBQUUsU0FBUzt3QkFDM0MsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3hDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxjQUFjO3FCQUNULElBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0JBQWtCO29CQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUMxQyxDQUFDO29CQUNELEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQ25FLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQ3pCLEVBQUUsQ0FBQzt3QkFDRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFBRSxTQUFTO3dCQUNsRSxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELFdBQVc7WUFDWCxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZO29CQUFFLE9BQU87Z0JBQzlDLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQ25FLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQzNCLEVBQUUsQ0FBQztvQkFDRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFFLFNBQVM7b0JBQ3pELE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHR5cGUgeyBDYWxsRXhwcmVzc2lvbiwgTmV3RXhwcmVzc2lvbiB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbi8vIFRPRE86IElmIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZXNsaW50LXBsdWdpbi11bmljb3JuL2lzc3Vlcy8xMzU2IGlzIGltcGxlbWVudGVkLCBtaWdyYXRlIHRoaXMgcnVsZSB0byBgZXNsaW50LXBsdWdpbi11bmljb3JuYFxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEaXNhbGxvdyBjYWxsaW5nIGEgZnVuY3Rpb24gd2l0aCBpbmNvcnJlY3QgYXJndW1lbnRzIGxlbmd0aC5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTpcbiAgICAgICAgXCJUaGUgYXJndW1lbnRzIGxlbmd0aCBvZiBjYWxsaW5nIGB7eyBmdW5jdGlvblBhdHRlcm4gfX1gIHNob3VsZCBiZSB7eyBsZW5ndGhNc2cgfX1cIixcbiAgICB9LFxuICAgIHNjaGVtYTogW3sgdHlwZTogXCJvYmplY3RcIiB9XSwgLy8gVE9ETzogZW5oYW5jZSBzY2hlbWEgZm9yIGNoZWNraW5nIG9wdGlvbnNcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGdldExlbmd0aE1zZyA9IChleHBlY3RlZExlbmd0aDogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGV4cGVjdGVkTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWRMZW5ndGguam9pbihcIiBvciBcIik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICBcIm1pblwiIGluIGV4cGVjdGVkTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYD49ICR7ZXhwZWN0ZWRMZW5ndGgubWlufWApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGggJiZcbiAgICAgICAgXCJtYXhcIiBpbiBleHBlY3RlZExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGA8PSAke2V4cGVjdGVkTGVuZ3RoLm1heH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuam9pbihcIiBhbmQgXCIpO1xuICAgIH07XG4gICAgY29uc3QgaXNMZW5ndGhWYWxpZCA9IChsZW5ndGg6IG51bWJlciwgZXhwZWN0ZWRMZW5ndGg6IHVua25vd24pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gZXhwZWN0ZWRMZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZExlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkTGVuZ3RoLmluY2x1ZGVzKGxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IGJvb2xlYW5bXSA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGggJiZcbiAgICAgICAgXCJtaW5cIiBpbiBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGgubWluID09PSBcIm51bWJlclwiXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobGVuZ3RoID49IGV4cGVjdGVkTGVuZ3RoLm1pbik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICBcIm1heFwiIGluIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aC5tYXggPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChsZW5ndGggPD0gZXhwZWN0ZWRMZW5ndGgubWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuZXZlcnkoKGl0ZW0pID0+IGl0ZW0pO1xuICAgIH07XG4gICAgY29uc3QgcmVwb3J0ID0gKFxuICAgICAgbm9kZTogQ2FsbEV4cHJlc3Npb24gfCBOZXdFeHByZXNzaW9uLFxuICAgICAgZnVuY3Rpb25QYXR0ZXJuOiBzdHJpbmcsXG4gICAgICBleHBlY3RlZExlbmd0aDogdW5rbm93bixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGFyZ3NMZW5ndGggPSBub2RlLmFyZ3VtZW50cy5zb21lKFxuICAgICAgICAoYXJnKSA9PiBhcmcudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICApXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiBub2RlLmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWlzTGVuZ3RoVmFsaWQoYXJnc0xlbmd0aCwgZXhwZWN0ZWRMZW5ndGgpKVxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmdW5jdGlvblBhdHRlcm4sXG4gICAgICAgICAgICBsZW5ndGhNc2c6IGdldExlbmd0aE1zZyhleHBlY3RlZExlbmd0aCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXSA/PyB7XG4gICAgICAgIFwiKi5yZWR1Y2VcIjogMixcbiAgICAgICAgXCIqLnJlZHVjZVJpZ2h0XCI6IDIsXG4gICAgICAgIFwiKi5wdXNoXCI6IHsgbWluOiAxIH0sXG4gICAgICAgIFwibmV3IFNldFwiOiB7IG1heDogMSB9LFxuICAgICAgICBcIm5ldyBNYXBcIjogeyBtYXg6IDEgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb246IChub2RlKSA9PiB7XG4gICAgICAgIC8vIGZ1bmN0aW9uIGNhbGxcbiAgICAgICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0dGVybiwgZXhwZWN0ZWRMZW5ndGhdIG9mIG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgKFtwYXR0ZXJuXSkgPT5cbiAgICAgICAgICAgICAgIXBhdHRlcm4uc3RhcnRzV2l0aChcIiouXCIpICYmICFwYXR0ZXJuLnN0YXJ0c1dpdGgoXCJuZXcgXCIpLFxuICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNhbGxlZS5uYW1lICE9PSBwYXR0ZXJuKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlcG9ydChub2RlLCBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG1ldGhvZCBjYWxsXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiICYmXG4gICAgICAgICAgbm9kZS5jYWxsZWUucHJvcGVydHkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0dGVybiwgZXhwZWN0ZWRMZW5ndGhdIG9mIG9wdGlvbnMuZmlsdGVyKChbcGF0dGVybl0pID0+XG4gICAgICAgICAgICBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIqLlwiKSxcbiAgICAgICAgICApKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jYWxsZWUucHJvcGVydHkubmFtZSAhPT0gcGF0dGVybi5zcGxpdChcIi5cIilbMV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmVwb3J0KG5vZGUsIHBhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBuZXcgY2FsbFxuICAgICAgTmV3RXhwcmVzc2lvbjogKG5vZGUpID0+IHtcbiAgICAgICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoXSBvZiBvcHRpb25zLmZpbHRlcigoW3BhdHRlcm5dKSA9PlxuICAgICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aChcIm5ldyBcIiksXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAobm9kZS5jYWxsZWUubmFtZSAhPT0gcGF0dGVybi5zcGxpdChcIiBcIilbMV0pIGNvbnRpbnVlO1xuICAgICAgICAgIHJlcG9ydChub2RlLCBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBjYWxsQXJndW1lbnRzTGVuZ3RoID0geyBuYW1lLCBydWxlIH07XG4iXX0=
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1hcmd1bWVudHMtbGVuZ3RoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL2NhbGwtYXJndW1lbnRzLWxlbmd0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDBJQUEwSTtBQUMxSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDhEQUE4RDtTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLG1GQUFtRjtTQUN0RjtRQUNELE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsNENBQTRDO0tBQzNFO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxjQUF1QixFQUFFLEVBQUU7WUFDL0MsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWMsRUFDdkIsQ0FBQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FB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TUFBTSxDQUFDO2dCQUNsRSxPQUFPO3FCQUNKLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNqQixpRkFBaUY7b0JBQ2pGLElBQ0UsTUFBTSxJQUFJLFlBQVk7d0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNmLEdBQUcsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxDQUN2RCxFQUNELENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCx3R0FBd0c7b0JBQ3hHLElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7d0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUNyRCxDQUFDO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDO3FCQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsY0FBYyxFQUFFLE1BQU07WUFDdEIsYUFBYSxFQUFFLE1BQU07U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IENhbGxFeHByZXNzaW9uLCBOZXdFeHByZXNzaW9uIH0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcblxuLy8gVE9ETzogSWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzEzNTYgaXMgaW1wbGVtZW50ZWQsIG1pZ3JhdGUgdGhpcyBydWxlIHRvIGBlc2xpbnQtcGx1Z2luLXVuaWNvcm5gXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpc2FsbG93IGNhbGxpbmcgYSBmdW5jdGlvbiB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgbGVuZ3RoLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIlRoZSBhcmd1bWVudHMgbGVuZ3RoIG9mIGNhbGxpbmcgYHt7IGZ1bmN0aW9uUGF0dGVybiB9fWAgc2hvdWxkIGJlIHt7IGxlbmd0aE1zZyB9fVwiLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbeyB0eXBlOiBcIm9iamVjdFwiIH1dLCAvLyBUT0RPOiBlbmhhbmNlIHNjaGVtYSBmb3IgY2hlY2tpbmcgb3B0aW9uc1xuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgZ2V0TGVuZ3RoTXNnID0gKGV4cGVjdGVkTGVuZ3RoOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RlZExlbmd0aC5qb2luKFwiIG9yIFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWluXCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPj0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWluKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWF4XCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPD0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWF4KX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuam9pbihcIiBhbmQgXCIpO1xuICAgIH07XG4gICAgY29uc3QgaXNMZW5ndGhWYWxpZCA9IChsZW5ndGg6IG51bWJlciwgZXhwZWN0ZWRMZW5ndGg6IHVua25vd24pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gZXhwZWN0ZWRMZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZExlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkTGVuZ3RoLmluY2x1ZGVzKGxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IGJvb2xlYW5bXSA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGggJiZcbiAgICAgICAgXCJtaW5cIiBpbiBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGgubWluID09PSBcIm51bWJlclwiXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobGVuZ3RoID49IGV4cGVjdGVkTGVuZ3RoLm1pbik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICBcIm1heFwiIGluIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aC5tYXggPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChsZW5ndGggPD0gZXhwZWN0ZWRMZW5ndGgubWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuZXZlcnkoKGl0ZW0pID0+IGl0ZW0pO1xuICAgIH07XG4gICAgY29uc3QgcmVwb3J0ID0gKFxuICAgICAgbm9kZTogQ2FsbEV4cHJlc3Npb24gfCBOZXdFeHByZXNzaW9uLFxuICAgICAgZnVuY3Rpb25QYXR0ZXJuOiBzdHJpbmcsXG4gICAgICBleHBlY3RlZExlbmd0aDogdW5rbm93bixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGFyZ3NMZW5ndGggPSBub2RlLmFyZ3VtZW50cy5zb21lKFxuICAgICAgICAoYXJnKSA9PiBhcmcudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICApXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiBub2RlLmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWlzTGVuZ3RoVmFsaWQoYXJnc0xlbmd0aCwgZXhwZWN0ZWRMZW5ndGgpKVxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmdW5jdGlvblBhdHRlcm4sXG4gICAgICAgICAgICBsZW5ndGhNc2c6IGdldExlbmd0aE1zZyhleHBlY3RlZExlbmd0aCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXSA/PyB7XG4gICAgICAgIC8vIDFcbiAgICAgICAgXCIqLnJlZHVjZVwiOiAyLFxuICAgICAgICBcIioucmVkdWNlUmlnaHRcIjogMixcbiAgICAgICAgXCIqLnB1c2hcIjogeyBtaW46IDEgfSxcbiAgICAgICAgXCJNYXRoLm1heFwiOiB7IG1pbjogMiB9LFxuICAgICAgICBcIk1hdGgubWluXCI6IHsgbWluOiAyIH0sXG4gICAgICAgIC8vIDJcbiAgICAgICAgXCJuZXcgU2V0XCI6IHsgbWF4OiAxIH0sXG4gICAgICAgIFwibmV3IE1hcFwiOiB7IG1heDogMSB9LFxuICAgICAgfSxcbiAgICApLm1hcCgoW3BhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoXSkgPT4gKHtcbiAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFxuICAgICAgICBgXiR7cGF0dGVybi5yZXBsYWNlQWxsKFwiLlwiLCBcIlxcXFwuXCIpLnJlcGxhY2VBbGwoXCIqXCIsIFwiLipcIil9JGAsXG4gICAgICApLFxuICAgICAgcGF0dGVybixcbiAgICAgIGV4cGVjdGVkTGVuZ3RoLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBDYWxsRXhwcmVzc2lvbiB8IE5ld0V4cHJlc3Npb24pID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG5vZGUudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgPyBcIm5ldyBcIiA6IFwiXCI7XG5cbiAgICAgIGNvbnN0IHsgY2FsbGVlIH0gPSBub2RlO1xuICAgICAgLy8gZnVuY3Rpb24gY2FsbFxuICAgICAgaWYgKGNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAvLyBjb2RlIGxpa2UgYGZvbygpYCBvciBgbmV3IEZvbygpYFxuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ucmVnZXgudGVzdChgJHtwcmVmaXh9JHtjYWxsZWUubmFtZX1gKSlcbiAgICAgICAgICAuZm9yRWFjaCgoeyBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCB9KSA9PiB7XG4gICAgICAgICAgICByZXBvcnQobm9kZSwgcGF0dGVybiwgZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gbWV0aG9kIGNhbGxcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICBjYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBvYmplY3Q6IGNhbGxlZU9iamVjdCwgcHJvcGVydHk6IGNhbGxlZVByb3BlcnR5IH0gPSBjYWxsZWU7XG4gICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIC8vIGNvZGUgbGlrZSBgTWF0aC5tYXgoKWAgb3IgYG5ldyBGb28uQmFyKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBNYXRoYCBvciBgRm9vYFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcIm5hbWVcIiBpbiBjYWxsZWVPYmplY3QgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fSR7Y2FsbGVlT2JqZWN0Lm5hbWV9LiR7Y2FsbGVlUHJvcGVydHkubmFtZX1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb2RlIGxpa2UgYFtdLnJlZHVjZSgpYCBvciBgbmV3ICh7Rm9vOiBjbGFzc3t9fSkuRm9vKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBbXWAgb3IgYHtGb286IGNsYXNze319YFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFwibmFtZVwiIGluIGNhbGxlZU9iamVjdCkgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoYCR7cHJlZml4fS4ke2NhbGxlZVByb3BlcnR5Lm5hbWV9YClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKCh7IHBhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoIH0pID0+IHtcbiAgICAgICAgICAgIHJlcG9ydChub2RlLCBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbjogaGFuZGxlLFxuICAgICAgTmV3RXhwcmVzc2lvbjogaGFuZGxlLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY2FsbEFyZ3VtZW50c0xlbmd0aCA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
@@ -0,0 +1,6 @@
1
+ import type { Rule } from "eslint";
2
+ export declare const noJsxInNonJsxFile: {
3
+ name: string;
4
+ rule: Rule.RuleModule;
5
+ };
6
+ //# sourceMappingURL=no-jsx-in-non-jsx-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-jsx-in-non-jsx-file.d.ts","sourceRoot":"","sources":["../../src/rules/no-jsx-in-non-jsx-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA6BnC,eAAO,MAAM,iBAAiB;;;CAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { getRuleName } from "../utils.js";
2
+ const name = getRuleName(import.meta.url);
3
+ const rule = {
4
+ meta: {
5
+ docs: {
6
+ description: "Only allow JSX syntax in `.jsx` and `.tsx` file.",
7
+ },
8
+ messages: {
9
+ [`${name}/error`]: "Only allow JSX syntax in `.jsx` and `.tsx` file.",
10
+ },
11
+ },
12
+ create: (context) => {
13
+ if (context.filename.endsWith(".jsx") ||
14
+ context.filename.endsWith(".tsx")) {
15
+ return {};
16
+ }
17
+ return {
18
+ ":matches(JSXElement, JSXFragment)": (node) => {
19
+ context.report({ node, messageId: `${name}/error` });
20
+ },
21
+ };
22
+ },
23
+ };
24
+ export const noJsxInNonJsxFile = { name, rule };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tanN4LWluLW5vbi1qc3gtZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1qc3gtaW4tbm9uLWpzeC1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsTUFBTSxJQUFJLEdBQW9CO0lBQzVCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxrREFBa0Q7U0FDaEU7UUFDRCxRQUFRLEVBQUU7WUFDUixDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxrREFBa0Q7U0FDdEU7S0FDRjtJQUNELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2xCLElBQ0UsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUNqQyxDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTztZQUNMLG1DQUFtQyxFQUFFLENBQUMsSUFBVSxFQUFFLEVBQUU7Z0JBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbmNvbnN0IG5hbWUgPSBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgcnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246IFwiT25seSBhbGxvdyBKU1ggc3ludGF4IGluIGAuanN4YCBhbmQgYC50c3hgIGZpbGUuXCIsXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgW2Ake25hbWV9L2Vycm9yYF06IFwiT25seSBhbGxvdyBKU1ggc3ludGF4IGluIGAuanN4YCBhbmQgYC50c3hgIGZpbGUuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGlmIChcbiAgICAgIGNvbnRleHQuZmlsZW5hbWUuZW5kc1dpdGgoXCIuanN4XCIpIHx8XG4gICAgICBjb250ZXh0LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRzeFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgXCI6bWF0Y2hlcyhKU1hFbGVtZW50LCBKU1hGcmFnbWVudClcIjogKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBub0pzeEluTm9uSnN4RmlsZSA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenge/eslint-plugin",
3
- "version": "0.1.1",
3
+ "version": "0.1.2-beta.1",
4
4
  "description": "ESLint plugin for JavaScript.",
5
5
  "keywords": [
6
6
  "opinionated",
@@ -21,16 +21,16 @@
21
21
  "type": "module",
22
22
  "exports": "./dist/index.js",
23
23
  "devDependencies": {
24
- "@swc-node/register": "1.10.0",
25
24
  "@types/eslint": "8.56.11",
26
25
  "@types/estree": "1.0.6",
27
26
  "@types/json-schema": "7.0.15",
28
- "@types/node": "22.7.5",
29
- "@typescript-eslint/parser": "7.16.1",
30
- "eslint": "8.57.0"
27
+ "@types/node": "22.9.1",
28
+ "@typescript-eslint/parser": "8.16.0",
29
+ "eslint": "8.57.1",
30
+ "tsx": "4.19.2"
31
31
  },
32
32
  "scripts": {
33
- "build": "tsc -p tsconfig.build.json",
34
- "test": "globstar -- node --test --import @swc-node/register/esm-register src/**/*.spec.ts"
33
+ "build": "tsc",
34
+ "test": "node --test --import tsx/esm \"**/*.spec.ts\""
35
35
  }
36
36
  }
package/src/index.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import { callArgumentsLength } from "./rules/call-arguments-length.js";
2
2
  import { noInstanceofBuiltin } from "./rules/no-instanceof-builtin.js";
3
+ import { noJsxInNonJsxFile } from "./rules/no-jsx-in-non-jsx-file.js";
3
4
  import { noRestrictedLoops } from "./rules/no-restricted-loops.js";
4
5
  import { noUnnecessaryTemplateString } from "./rules/no-unnecessary-template-string.js";
5
6
 
6
7
  export const rules = {
7
8
  [callArgumentsLength.name]: callArgumentsLength.rule,
8
9
  [noInstanceofBuiltin.name]: noInstanceofBuiltin.rule,
10
+ [noJsxInNonJsxFile.name]: noJsxInNonJsxFile.rule,
9
11
  [noRestrictedLoops.name]: noRestrictedLoops.rule,
10
12
  [noUnnecessaryTemplateString.name]: noUnnecessaryTemplateString.rule,
11
13
  };
@@ -18,6 +18,7 @@ const valid = [
18
18
  "foo.reduceRight(bar, baz)",
19
19
  "reduce(()=>123)",
20
20
  "foo.reduceLeft(()=>123)",
21
+ "Math.max(...foo)",
21
22
 
22
23
  "new foo.Set(...bar)",
23
24
  "new Set(bar)",
@@ -36,6 +37,9 @@ const invalid = [
36
37
  "foo.reduceRight(bar)",
37
38
  "[].reduce(...foo)",
38
39
  "[].reduce(...foo, ...bar)",
40
+ "Math.max()",
41
+ "Math.max(1)",
42
+ "Math.min(foo)",
39
43
 
40
44
  "new Set(...foo)",
41
45
  "new Set(foo,bar)",
@@ -30,14 +30,14 @@ const rule: Rule.RuleModule = {
30
30
  expectedLength &&
31
31
  "min" in expectedLength
32
32
  ) {
33
- result.push(`>= ${expectedLength.min}`);
33
+ result.push(`>= ${String(expectedLength.min)}`);
34
34
  }
35
35
  if (
36
36
  typeof expectedLength === "object" &&
37
37
  expectedLength &&
38
38
  "max" in expectedLength
39
39
  ) {
40
- result.push(`<= ${expectedLength.max}`);
40
+ result.push(`<= ${String(expectedLength.max)}`);
41
41
  }
42
42
  return result.join(" and ");
43
43
  };
@@ -90,48 +90,72 @@ const rule: Rule.RuleModule = {
90
90
 
91
91
  const options = Object.entries(
92
92
  context.options[0] ?? {
93
+ // 1
93
94
  "*.reduce": 2,
94
95
  "*.reduceRight": 2,
95
96
  "*.push": { min: 1 },
97
+ "Math.max": { min: 2 },
98
+ "Math.min": { min: 2 },
99
+ // 2
96
100
  "new Set": { max: 1 },
97
101
  "new Map": { max: 1 },
98
102
  },
99
- );
100
- return {
101
- CallExpression: (node) => {
102
- // function call
103
- if (node.callee.type === "Identifier") {
104
- for (const [pattern, expectedLength] of options.filter(
105
- ([pattern]) =>
106
- !pattern.startsWith("*.") && !pattern.startsWith("new "),
107
- )) {
108
- if (node.callee.name !== pattern) continue;
103
+ ).map(([pattern, expectedLength]) => ({
104
+ regex: new RegExp(
105
+ `^${pattern.replaceAll(".", "\\.").replaceAll("*", ".*")}$`,
106
+ ),
107
+ pattern,
108
+ expectedLength,
109
+ }));
110
+
111
+ const handle = (node: CallExpression | NewExpression) => {
112
+ const prefix = node.type === "NewExpression" ? "new " : "";
113
+
114
+ const { callee } = node;
115
+ // function call
116
+ if (callee.type === "Identifier") {
117
+ // code like `foo()` or `new Foo()`
118
+ options
119
+ .filter((option) => option.regex.test(`${prefix}${callee.name}`))
120
+ .forEach(({ pattern, expectedLength }) => {
109
121
  report(node, pattern, expectedLength);
110
- }
111
- }
112
- // method call
113
- else if (
114
- node.callee.type === "MemberExpression" &&
115
- node.callee.property.type === "Identifier"
116
- ) {
117
- for (const [pattern, expectedLength] of options.filter(([pattern]) =>
118
- pattern.startsWith("*."),
119
- )) {
120
- if (node.callee.property.name !== pattern.split(".")[1]) continue;
122
+ });
123
+ }
124
+ // method call
125
+ else if (
126
+ callee.type === "MemberExpression" &&
127
+ callee.property.type === "Identifier"
128
+ ) {
129
+ const { object: calleeObject, property: calleeProperty } = callee;
130
+ options
131
+ .filter((option) => {
132
+ // code like `Math.max()` or `new Foo.Bar()`, the calleeObject is `Math` or `Foo`
133
+ if (
134
+ "name" in calleeObject &&
135
+ option.regex.test(
136
+ `${prefix}${calleeObject.name}.${calleeProperty.name}`,
137
+ )
138
+ ) {
139
+ return true;
140
+ }
141
+ // code like `[].reduce()` or `new ({Foo: class{}}).Foo()`, the calleeObject is `[]` or `{Foo: class{}}`
142
+ if (
143
+ !("name" in calleeObject) &&
144
+ option.regex.test(`${prefix}.${calleeProperty.name}`)
145
+ ) {
146
+ return true;
147
+ }
148
+ return false;
149
+ })
150
+ .forEach(({ pattern, expectedLength }) => {
121
151
  report(node, pattern, expectedLength);
122
- }
123
- }
124
- },
125
- // new call
126
- NewExpression: (node) => {
127
- if (node.callee.type !== "Identifier") return;
128
- for (const [pattern, expectedLength] of options.filter(([pattern]) =>
129
- pattern.startsWith("new "),
130
- )) {
131
- if (node.callee.name !== pattern.split(" ")[1]) continue;
132
- report(node, pattern, expectedLength);
133
- }
134
- },
152
+ });
153
+ }
154
+ };
155
+
156
+ return {
157
+ CallExpression: handle,
158
+ NewExpression: handle,
135
159
  };
136
160
  },
137
161
  };
@@ -0,0 +1,22 @@
1
+ import { test } from "../test.spec.js";
2
+ import { noJsxInNonJsxFile } from "./no-jsx-in-non-jsx-file.js";
3
+
4
+ const codes = [
5
+ "const Foo = () => <div></div>",
6
+ "const Foo = () => <></>",
7
+ "function Foo(){const x = <div>foo</div>}",
8
+ "function Foo(){const x = <>foo</>}",
9
+ ];
10
+
11
+ const valid = [
12
+ ...codes.map((code) => ({ code, filename: "foo.jsx" })),
13
+ ...codes.map((code) => ({ code, filename: "foo.tsx" })),
14
+ ];
15
+
16
+ const invalid = [
17
+ ...codes.map((code) => ({ code, filename: "foo.js" })),
18
+ ...codes.map((code) => ({ code, filename: "foo.cjs" })),
19
+ ...codes.map((code) => ({ code, filename: "foo.mjs" })),
20
+ ];
21
+
22
+ test({ valid, invalid, ...noJsxInNonJsxFile });
@@ -0,0 +1,30 @@
1
+ import type { Rule } from "eslint";
2
+ import type { Node } from "estree";
3
+ import { getRuleName } from "../utils.js";
4
+
5
+ const name = getRuleName(import.meta.url);
6
+ const rule: Rule.RuleModule = {
7
+ meta: {
8
+ docs: {
9
+ description: "Only allow JSX syntax in `.jsx` and `.tsx` file.",
10
+ },
11
+ messages: {
12
+ [`${name}/error`]: "Only allow JSX syntax in `.jsx` and `.tsx` file.",
13
+ },
14
+ },
15
+ create: (context) => {
16
+ if (
17
+ context.filename.endsWith(".jsx") ||
18
+ context.filename.endsWith(".tsx")
19
+ ) {
20
+ return {};
21
+ }
22
+ return {
23
+ ":matches(JSXElement, JSXFragment)": (node: Node) => {
24
+ context.report({ node, messageId: `${name}/error` });
25
+ },
26
+ };
27
+ },
28
+ };
29
+
30
+ export const noJsxInNonJsxFile = { name, rule };
@@ -4,7 +4,7 @@ import { noUnnecessaryTemplateString } from "./no-unnecessary-template-string.js
4
4
  const valid = [
5
5
  "'abc'",
6
6
  '"def"',
7
- "`ab${cd}ef`", // eslint-disable-line no-template-curly-in-string
7
+ "`ab${cd}ef`",
8
8
  "`\n`",
9
9
  "`abc\n`",
10
10
  "`\nabc`",
package/tsconfig.json CHANGED
@@ -1,3 +1,5 @@
1
1
  {
2
- "extends": "../../tsconfig"
2
+ "extends": "../../tsconfig",
3
+ "include": ["src"],
4
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"]
3
5
  }
@@ -1,5 +0,0 @@
1
- {
2
- "extends": "./tsconfig",
3
- "include": ["src"],
4
- "exclude": ["**/*.spec.ts", "**/*.test.ts"]
5
- }