@fenge/eslint-plugin 0.1.2 → 0.2.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +7 -1
  4. package/dist/rules/call-arguments-length.js +1 -1
  5. package/dist/rules/no-instanceof-builtin.d.ts.map +1 -1
  6. package/dist/rules/no-instanceof-builtin.js +4 -1
  7. package/dist/rules/no-jsx-in-non-jsx-file.d.ts.map +1 -1
  8. package/dist/rules/no-jsx-in-non-jsx-file.js +3 -4
  9. package/dist/rules/no-nested-class.d.ts +6 -0
  10. package/dist/rules/no-nested-class.d.ts.map +1 -0
  11. package/dist/rules/no-nested-class.js +23 -0
  12. package/dist/rules/no-nested-function.d.ts +6 -0
  13. package/dist/rules/no-nested-function.d.ts.map +1 -0
  14. package/dist/rules/no-nested-function.js +25 -0
  15. package/dist/rules/no-restricted-loops.js +1 -1
  16. package/dist/rules/no-top-level-arrow-function.d.ts +6 -0
  17. package/dist/rules/no-top-level-arrow-function.d.ts.map +1 -0
  18. package/dist/rules/no-top-level-arrow-function.js +27 -0
  19. package/dist/rules/no-unnecessary-template-string.js +1 -1
  20. package/doc/rules/call-arguments-length.md +52 -0
  21. package/doc/rules/no-instanceof-builtin.md +50 -0
  22. package/doc/rules/no-jsx-in-non-jsx-file.md +37 -0
  23. package/doc/rules/no-nested-class.md +31 -0
  24. package/doc/rules/no-nested-function.md +42 -0
  25. package/doc/rules/no-restricted-loops.md +23 -0
  26. package/doc/rules/no-top-level-arrow-function.md +45 -0
  27. package/doc/rules/no-unnecessary-template-string.md +34 -0
  28. package/package.json +5 -7
  29. package/src/index.ts +11 -5
  30. package/src/rules/call-arguments-length.spec.ts +2 -2
  31. package/src/rules/call-arguments-length.ts +1 -1
  32. package/src/rules/no-instanceof-builtin.spec.ts +2 -2
  33. package/src/rules/no-instanceof-builtin.ts +4 -1
  34. package/src/rules/no-jsx-in-non-jsx-file.spec.ts +2 -2
  35. package/src/rules/no-jsx-in-non-jsx-file.ts +3 -7
  36. package/src/rules/no-nested-class.spec.ts +27 -0
  37. package/src/rules/no-nested-class.ts +31 -0
  38. package/src/rules/no-nested-function.spec.ts +49 -0
  39. package/src/rules/no-nested-function.ts +32 -0
  40. package/src/rules/no-restricted-loops.spec.ts +2 -2
  41. package/src/rules/no-restricted-loops.ts +1 -1
  42. package/src/rules/no-top-level-arrow-function.spec.ts +32 -0
  43. package/src/rules/no-top-level-arrow-function.ts +35 -0
  44. package/src/rules/no-unnecessary-template-string.spec.ts +2 -2
  45. package/src/rules/no-unnecessary-template-string.ts +1 -1
  46. package/src/test.spec.ts +0 -51
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @fenge/eslint-plugin
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d2e61d3: feat: `no-top-level-arrow-function` only report when the function body is `BlockStatement`
8
+
9
+ ## 0.1.3
10
+
11
+ ### Patch Changes
12
+
13
+ - d0e9357: feat: add rule `no-nested-function`
14
+ - d0e9357: feat: add rule `no-top-level-arrow-function`
15
+ - d0e9357: feat: add rule `no-nested-class`
16
+
3
17
  ## 0.1.2
4
18
 
5
19
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;CAMjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,KAAK;;CASjB,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,19 @@
1
1
  import { callArgumentsLength } from "./rules/call-arguments-length.js";
2
2
  import { noInstanceofBuiltin } from "./rules/no-instanceof-builtin.js";
3
3
  import { noJsxInNonJsxFile } from "./rules/no-jsx-in-non-jsx-file.js";
4
+ import { noNestedClass } from "./rules/no-nested-class.js";
5
+ import { noNestedFunction } from "./rules/no-nested-function.js";
4
6
  import { noRestrictedLoops } from "./rules/no-restricted-loops.js";
7
+ import { noTopLevelArrowFunction } from "./rules/no-top-level-arrow-function.js";
5
8
  import { noUnnecessaryTemplateString } from "./rules/no-unnecessary-template-string.js";
6
9
  export const rules = {
7
10
  [callArgumentsLength.name]: callArgumentsLength.rule,
8
11
  [noInstanceofBuiltin.name]: noInstanceofBuiltin.rule,
9
12
  [noJsxInNonJsxFile.name]: noJsxInNonJsxFile.rule,
13
+ [noNestedClass.name]: noNestedClass.rule,
14
+ [noNestedFunction.name]: noNestedFunction.rule,
10
15
  [noRestrictedLoops.name]: noRestrictedLoops.rule,
16
+ [noTopLevelArrowFunction.name]: noTopLevelArrowFunction.rule,
11
17
  [noUnnecessaryTemplateString.name]: noUnnecessaryTemplateString.rule,
12
18
  };
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFeEYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ2hELENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtJQUNoRCxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUk7Q0FDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbGxBcmd1bWVudHNMZW5ndGggfSBmcm9tIFwiLi9ydWxlcy9jYWxsLWFyZ3VtZW50cy1sZW5ndGguanNcIjtcbmltcG9ydCB7IG5vSW5zdGFuY2VvZkJ1aWx0aW4gfSBmcm9tIFwiLi9ydWxlcy9uby1pbnN0YW5jZW9mLWJ1aWx0aW4uanNcIjtcbmltcG9ydCB7IG5vSnN4SW5Ob25Kc3hGaWxlIH0gZnJvbSBcIi4vcnVsZXMvbm8tanN4LWluLW5vbi1qc3gtZmlsZS5qc1wiO1xuaW1wb3J0IHsgbm9SZXN0cmljdGVkTG9vcHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLmpzXCI7XG5pbXBvcnQgeyBub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcgfSBmcm9tIFwiLi9ydWxlcy9uby11bm5lY2Vzc2FyeS10ZW1wbGF0ZS1zdHJpbmcuanNcIjtcblxuZXhwb3J0IGNvbnN0IHJ1bGVzID0ge1xuICBbY2FsbEFyZ3VtZW50c0xlbmd0aC5uYW1lXTogY2FsbEFyZ3VtZW50c0xlbmd0aC5ydWxlLFxuICBbbm9JbnN0YW5jZW9mQnVpbHRpbi5uYW1lXTogbm9JbnN0YW5jZW9mQnVpbHRpbi5ydWxlLFxuICBbbm9Kc3hJbk5vbkpzeEZpbGUubmFtZV06IG5vSnN4SW5Ob25Kc3hGaWxlLnJ1bGUsXG4gIFtub1Jlc3RyaWN0ZWRMb29wcy5uYW1lXTogbm9SZXN0cmljdGVkTG9vcHMucnVsZSxcbiAgW25vVW5uZWNlc3NhcnlUZW1wbGF0ZVN0cmluZy5uYW1lXTogbm9Vbm5lY2Vzc2FyeVRlbXBsYXRlU3RyaW5nLnJ1bGUsXG59O1xuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXhGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRztJQUNuQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtJQUNoRCxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLENBQUMsSUFBSTtJQUN4QyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLElBQUk7SUFDOUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ2hELENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsSUFBSTtJQUM1RCxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLElBQUk7Q0FDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbGxBcmd1bWVudHNMZW5ndGggfSBmcm9tIFwiLi9ydWxlcy9jYWxsLWFyZ3VtZW50cy1sZW5ndGgudHNcIjtcbmltcG9ydCB7IG5vSW5zdGFuY2VvZkJ1aWx0aW4gfSBmcm9tIFwiLi9ydWxlcy9uby1pbnN0YW5jZW9mLWJ1aWx0aW4udHNcIjtcbmltcG9ydCB7IG5vSnN4SW5Ob25Kc3hGaWxlIH0gZnJvbSBcIi4vcnVsZXMvbm8tanN4LWluLW5vbi1qc3gtZmlsZS50c1wiO1xuaW1wb3J0IHsgbm9OZXN0ZWRDbGFzcyB9IGZyb20gXCIuL3J1bGVzL25vLW5lc3RlZC1jbGFzcy50c1wiO1xuaW1wb3J0IHsgbm9OZXN0ZWRGdW5jdGlvbiB9IGZyb20gXCIuL3J1bGVzL25vLW5lc3RlZC1mdW5jdGlvbi50c1wiO1xuaW1wb3J0IHsgbm9SZXN0cmljdGVkTG9vcHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLnRzXCI7XG5pbXBvcnQgeyBub1RvcExldmVsQXJyb3dGdW5jdGlvbiB9IGZyb20gXCIuL3J1bGVzL25vLXRvcC1sZXZlbC1hcnJvdy1mdW5jdGlvbi50c1wiO1xuaW1wb3J0IHsgbm9Vbm5lY2Vzc2FyeVRlbXBsYXRlU3RyaW5nIH0gZnJvbSBcIi4vcnVsZXMvbm8tdW5uZWNlc3NhcnktdGVtcGxhdGUtc3RyaW5nLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgW2NhbGxBcmd1bWVudHNMZW5ndGgubmFtZV06IGNhbGxBcmd1bWVudHNMZW5ndGgucnVsZSxcbiAgW25vSW5zdGFuY2VvZkJ1aWx0aW4ubmFtZV06IG5vSW5zdGFuY2VvZkJ1aWx0aW4ucnVsZSxcbiAgW25vSnN4SW5Ob25Kc3hGaWxlLm5hbWVdOiBub0pzeEluTm9uSnN4RmlsZS5ydWxlLFxuICBbbm9OZXN0ZWRDbGFzcy5uYW1lXTogbm9OZXN0ZWRDbGFzcy5ydWxlLFxuICBbbm9OZXN0ZWRGdW5jdGlvbi5uYW1lXTogbm9OZXN0ZWRGdW5jdGlvbi5ydWxlLFxuICBbbm9SZXN0cmljdGVkTG9vcHMubmFtZV06IG5vUmVzdHJpY3RlZExvb3BzLnJ1bGUsXG4gIFtub1RvcExldmVsQXJyb3dGdW5jdGlvbi5uYW1lXTogbm9Ub3BMZXZlbEFycm93RnVuY3Rpb24ucnVsZSxcbiAgW25vVW5uZWNlc3NhcnlUZW1wbGF0ZVN0cmluZy5uYW1lXTogbm9Vbm5lY2Vzc2FyeVRlbXBsYXRlU3RyaW5nLnJ1bGUsXG59O1xuIl19
@@ -125,4 +125,4 @@ const rule = {
125
125
  },
126
126
  };
127
127
  export const callArgumentsLength = { name, rule };
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1hcmd1bWVudHMtbGVuZ3RoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL2NhbGwtYXJndW1lbnRzLWxlbmd0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDBJQUEwSTtBQUMxSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDhEQUE4RDtTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLG1GQUFtRjtTQUN0RjtRQUNELE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsNENBQTRDO0tBQzNFO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxjQUF1QixFQUFFLEVBQUU7WUFDL0MsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWMsRUFDdkIsQ0FBQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FB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TUFBTSxDQUFDO2dCQUNsRSxPQUFPO3FCQUNKLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNqQixpRkFBaUY7b0JBQ2pGLElBQ0UsTUFBTSxJQUFJLFlBQVk7d0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNmLEdBQUcsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxDQUN2RCxFQUNELENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCx3R0FBd0c7b0JBQ3hHLElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7d0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUNyRCxDQUFDO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDO3FCQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsY0FBYyxFQUFFLE1BQU07WUFDdEIsYUFBYSxFQUFFLE1BQU07U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IENhbGxFeHByZXNzaW9uLCBOZXdFeHByZXNzaW9uIH0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcblxuLy8gVE9ETzogSWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzEzNTYgaXMgaW1wbGVtZW50ZWQsIG1pZ3JhdGUgdGhpcyBydWxlIHRvIGBlc2xpbnQtcGx1Z2luLXVuaWNvcm5gXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpc2FsbG93IGNhbGxpbmcgYSBmdW5jdGlvbiB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgbGVuZ3RoLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIlRoZSBhcmd1bWVudHMgbGVuZ3RoIG9mIGNhbGxpbmcgYHt7IGZ1bmN0aW9uUGF0dGVybiB9fWAgc2hvdWxkIGJlIHt7IGxlbmd0aE1zZyB9fVwiLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbeyB0eXBlOiBcIm9iamVjdFwiIH1dLCAvLyBUT0RPOiBlbmhhbmNlIHNjaGVtYSBmb3IgY2hlY2tpbmcgb3B0aW9uc1xuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgZ2V0TGVuZ3RoTXNnID0gKGV4cGVjdGVkTGVuZ3RoOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RlZExlbmd0aC5qb2luKFwiIG9yIFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWluXCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPj0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWluKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWF4XCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPD0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWF4KX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuam9pbihcIiBhbmQgXCIpO1xuICAgIH07XG4gICAgY29uc3QgaXNMZW5ndGhWYWxpZCA9IChsZW5ndGg6IG51bWJlciwgZXhwZWN0ZWRMZW5ndGg6IHVua25vd24pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gZXhwZWN0ZWRMZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZExlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkTGVuZ3RoLmluY2x1ZGVzKGxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IGJvb2xlYW5bXSA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGggJiZcbiAgICAgICAgXCJtaW5cIiBpbiBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGgubWluID09PSBcIm51bWJlclwiXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobGVuZ3RoID49IGV4cGVjdGVkTGVuZ3RoLm1pbik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICBcIm1heFwiIGluIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aC5tYXggPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChsZW5ndGggPD0gZXhwZWN0ZWRMZW5ndGgubWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuZXZlcnkoKGl0ZW0pID0+IGl0ZW0pO1xuICAgIH07XG4gICAgY29uc3QgcmVwb3J0ID0gKFxuICAgICAgbm9kZTogQ2FsbEV4cHJlc3Npb24gfCBOZXdFeHByZXNzaW9uLFxuICAgICAgZnVuY3Rpb25QYXR0ZXJuOiBzdHJpbmcsXG4gICAgICBleHBlY3RlZExlbmd0aDogdW5rbm93bixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGFyZ3NMZW5ndGggPSBub2RlLmFyZ3VtZW50cy5zb21lKFxuICAgICAgICAoYXJnKSA9PiBhcmcudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICApXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiBub2RlLmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWlzTGVuZ3RoVmFsaWQoYXJnc0xlbmd0aCwgZXhwZWN0ZWRMZW5ndGgpKVxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmdW5jdGlvblBhdHRlcm4sXG4gICAgICAgICAgICBsZW5ndGhNc2c6IGdldExlbmd0aE1zZyhleHBlY3RlZExlbmd0aCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXSA/PyB7XG4gICAgICAgIC8vIDFcbiAgICAgICAgXCIqLnJlZHVjZVwiOiAyLFxuICAgICAgICBcIioucmVkdWNlUmlnaHRcIjogMixcbiAgICAgICAgXCIqLnB1c2hcIjogeyBtaW46IDEgfSxcbiAgICAgICAgXCJNYXRoLm1heFwiOiB7IG1pbjogMiB9LFxuICAgICAgICBcIk1hdGgubWluXCI6IHsgbWluOiAyIH0sXG4gICAgICAgIC8vIDJcbiAgICAgICAgXCJuZXcgU2V0XCI6IHsgbWF4OiAxIH0sXG4gICAgICAgIFwibmV3IE1hcFwiOiB7IG1heDogMSB9LFxuICAgICAgfSxcbiAgICApLm1hcCgoW3BhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoXSkgPT4gKHtcbiAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFxuICAgICAgICBgXiR7cGF0dGVybi5yZXBsYWNlQWxsKFwiLlwiLCBcIlxcXFwuXCIpLnJlcGxhY2VBbGwoXCIqXCIsIFwiLipcIil9JGAsXG4gICAgICApLFxuICAgICAgcGF0dGVybixcbiAgICAgIGV4cGVjdGVkTGVuZ3RoLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBDYWxsRXhwcmVzc2lvbiB8IE5ld0V4cHJlc3Npb24pID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG5vZGUudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgPyBcIm5ldyBcIiA6IFwiXCI7XG5cbiAgICAgIGNvbnN0IHsgY2FsbGVlIH0gPSBub2RlO1xuICAgICAgLy8gZnVuY3Rpb24gY2FsbFxuICAgICAgaWYgKGNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAvLyBjb2RlIGxpa2UgYGZvbygpYCBvciBgbmV3IEZvbygpYFxuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ucmVnZXgudGVzdChgJHtwcmVmaXh9JHtjYWxsZWUubmFtZX1gKSlcbiAgICAgICAgICAuZm9yRWFjaCgoeyBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCB9KSA9PiB7XG4gICAgICAgICAgICByZXBvcnQobm9kZSwgcGF0dGVybiwgZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gbWV0aG9kIGNhbGxcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICBjYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBvYmplY3Q6IGNhbGxlZU9iamVjdCwgcHJvcGVydHk6IGNhbGxlZVByb3BlcnR5IH0gPSBjYWxsZWU7XG4gICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIC8vIGNvZGUgbGlrZSBgTWF0aC5tYXgoKWAgb3IgYG5ldyBGb28uQmFyKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBNYXRoYCBvciBgRm9vYFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcIm5hbWVcIiBpbiBjYWxsZWVPYmplY3QgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fSR7Y2FsbGVlT2JqZWN0Lm5hbWV9LiR7Y2FsbGVlUHJvcGVydHkubmFtZX1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb2RlIGxpa2UgYFtdLnJlZHVjZSgpYCBvciBgbmV3ICh7Rm9vOiBjbGFzc3t9fSkuRm9vKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBbXWAgb3IgYHtGb286IGNsYXNze319YFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFwibmFtZVwiIGluIGNhbGxlZU9iamVjdCkgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoYCR7cHJlZml4fS4ke2NhbGxlZVByb3BlcnR5Lm5hbWV9YClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKCh7IHBhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoIH0pID0+IHtcbiAgICAgICAgICAgIHJlcG9ydChub2RlLCBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbjogaGFuZGxlLFxuICAgICAgTmV3RXhwcmVzc2lvbjogaGFuZGxlLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY2FsbEFyZ3VtZW50c0xlbmd0aCA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbC1hcmd1bWVudHMtbGVuZ3RoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL2NhbGwtYXJndW1lbnRzLWxlbmd0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDBJQUEwSTtBQUMxSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULDhEQUE4RDtTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLG1GQUFtRjtTQUN0RjtRQUNELE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsNENBQTRDO0tBQzNFO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxjQUF1QixFQUFFLEVBQUU7WUFDL0MsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixJQUNFLE9BQU8sY0FBYyxLQUFLLFFBQVE7Z0JBQ2xDLGNBQWM7Z0JBQ2QsS0FBSyxJQUFJLGNBQWMsRUFDdkIsQ0FBQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FB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TUFBTSxDQUFDO2dCQUNsRSxPQUFPO3FCQUNKLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNqQixpRkFBaUY7b0JBQ2pGLElBQ0UsTUFBTSxJQUFJLFlBQVk7d0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNmLEdBQUcsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxDQUN2RCxFQUNELENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCx3R0FBd0c7b0JBQ3hHLElBQ0UsQ0FBQyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7d0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUNyRCxDQUFDO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDO3FCQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUU7b0JBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsY0FBYyxFQUFFLE1BQU07WUFDdEIsYUFBYSxFQUFFLE1BQU07U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IENhbGxFeHByZXNzaW9uLCBOZXdFeHByZXNzaW9uIH0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxuLy8gVE9ETzogSWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzEzNTYgaXMgaW1wbGVtZW50ZWQsIG1pZ3JhdGUgdGhpcyBydWxlIHRvIGBlc2xpbnQtcGx1Z2luLXVuaWNvcm5gXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpc2FsbG93IGNhbGxpbmcgYSBmdW5jdGlvbiB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgbGVuZ3RoLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIlRoZSBhcmd1bWVudHMgbGVuZ3RoIG9mIGNhbGxpbmcgYHt7IGZ1bmN0aW9uUGF0dGVybiB9fWAgc2hvdWxkIGJlIHt7IGxlbmd0aE1zZyB9fVwiLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbeyB0eXBlOiBcIm9iamVjdFwiIH1dLCAvLyBUT0RPOiBlbmhhbmNlIHNjaGVtYSBmb3IgY2hlY2tpbmcgb3B0aW9uc1xuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgZ2V0TGVuZ3RoTXNnID0gKGV4cGVjdGVkTGVuZ3RoOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RlZExlbmd0aC5qb2luKFwiIG9yIFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWluXCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPj0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWluKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4cGVjdGVkTGVuZ3RoID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIFwibWF4XCIgaW4gZXhwZWN0ZWRMZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChgPD0gJHtTdHJpbmcoZXhwZWN0ZWRMZW5ndGgubWF4KX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuam9pbihcIiBhbmQgXCIpO1xuICAgIH07XG4gICAgY29uc3QgaXNMZW5ndGhWYWxpZCA9IChsZW5ndGg6IG51bWJlciwgZXhwZWN0ZWRMZW5ndGg6IHVua25vd24pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gZXhwZWN0ZWRMZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZExlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkTGVuZ3RoLmluY2x1ZGVzKGxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQ6IGJvb2xlYW5bXSA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXhwZWN0ZWRMZW5ndGggJiZcbiAgICAgICAgXCJtaW5cIiBpbiBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICB0eXBlb2YgZXhwZWN0ZWRMZW5ndGgubWluID09PSBcIm51bWJlclwiXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobGVuZ3RoID49IGV4cGVjdGVkTGVuZ3RoLm1pbik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBleHBlY3RlZExlbmd0aCAmJlxuICAgICAgICBcIm1heFwiIGluIGV4cGVjdGVkTGVuZ3RoICYmXG4gICAgICAgIHR5cGVvZiBleHBlY3RlZExlbmd0aC5tYXggPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChsZW5ndGggPD0gZXhwZWN0ZWRMZW5ndGgubWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuZXZlcnkoKGl0ZW0pID0+IGl0ZW0pO1xuICAgIH07XG4gICAgY29uc3QgcmVwb3J0ID0gKFxuICAgICAgbm9kZTogQ2FsbEV4cHJlc3Npb24gfCBOZXdFeHByZXNzaW9uLFxuICAgICAgZnVuY3Rpb25QYXR0ZXJuOiBzdHJpbmcsXG4gICAgICBleHBlY3RlZExlbmd0aDogdW5rbm93bixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGFyZ3NMZW5ndGggPSBub2RlLmFyZ3VtZW50cy5zb21lKFxuICAgICAgICAoYXJnKSA9PiBhcmcudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICApXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiBub2RlLmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWlzTGVuZ3RoVmFsaWQoYXJnc0xlbmd0aCwgZXhwZWN0ZWRMZW5ndGgpKVxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmdW5jdGlvblBhdHRlcm4sXG4gICAgICAgICAgICBsZW5ndGhNc2c6IGdldExlbmd0aE1zZyhleHBlY3RlZExlbmd0aCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXSA/PyB7XG4gICAgICAgIC8vIDFcbiAgICAgICAgXCIqLnJlZHVjZVwiOiAyLFxuICAgICAgICBcIioucmVkdWNlUmlnaHRcIjogMixcbiAgICAgICAgXCIqLnB1c2hcIjogeyBtaW46IDEgfSxcbiAgICAgICAgXCJNYXRoLm1heFwiOiB7IG1pbjogMiB9LFxuICAgICAgICBcIk1hdGgubWluXCI6IHsgbWluOiAyIH0sXG4gICAgICAgIC8vIDJcbiAgICAgICAgXCJuZXcgU2V0XCI6IHsgbWF4OiAxIH0sXG4gICAgICAgIFwibmV3IE1hcFwiOiB7IG1heDogMSB9LFxuICAgICAgfSxcbiAgICApLm1hcCgoW3BhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoXSkgPT4gKHtcbiAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFxuICAgICAgICBgXiR7cGF0dGVybi5yZXBsYWNlQWxsKFwiLlwiLCBcIlxcXFwuXCIpLnJlcGxhY2VBbGwoXCIqXCIsIFwiLipcIil9JGAsXG4gICAgICApLFxuICAgICAgcGF0dGVybixcbiAgICAgIGV4cGVjdGVkTGVuZ3RoLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBDYWxsRXhwcmVzc2lvbiB8IE5ld0V4cHJlc3Npb24pID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG5vZGUudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgPyBcIm5ldyBcIiA6IFwiXCI7XG5cbiAgICAgIGNvbnN0IHsgY2FsbGVlIH0gPSBub2RlO1xuICAgICAgLy8gZnVuY3Rpb24gY2FsbFxuICAgICAgaWYgKGNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAvLyBjb2RlIGxpa2UgYGZvbygpYCBvciBgbmV3IEZvbygpYFxuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ucmVnZXgudGVzdChgJHtwcmVmaXh9JHtjYWxsZWUubmFtZX1gKSlcbiAgICAgICAgICAuZm9yRWFjaCgoeyBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCB9KSA9PiB7XG4gICAgICAgICAgICByZXBvcnQobm9kZSwgcGF0dGVybiwgZXhwZWN0ZWRMZW5ndGgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gbWV0aG9kIGNhbGxcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICBjYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBvYmplY3Q6IGNhbGxlZU9iamVjdCwgcHJvcGVydHk6IGNhbGxlZVByb3BlcnR5IH0gPSBjYWxsZWU7XG4gICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIC8vIGNvZGUgbGlrZSBgTWF0aC5tYXgoKWAgb3IgYG5ldyBGb28uQmFyKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBNYXRoYCBvciBgRm9vYFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcIm5hbWVcIiBpbiBjYWxsZWVPYmplY3QgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fSR7Y2FsbGVlT2JqZWN0Lm5hbWV9LiR7Y2FsbGVlUHJvcGVydHkubmFtZX1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb2RlIGxpa2UgYFtdLnJlZHVjZSgpYCBvciBgbmV3ICh7Rm9vOiBjbGFzc3t9fSkuRm9vKClgLCB0aGUgY2FsbGVlT2JqZWN0IGlzIGBbXWAgb3IgYHtGb286IGNsYXNze319YFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKFwibmFtZVwiIGluIGNhbGxlZU9iamVjdCkgJiZcbiAgICAgICAgICAgICAgb3B0aW9uLnJlZ2V4LnRlc3QoYCR7cHJlZml4fS4ke2NhbGxlZVByb3BlcnR5Lm5hbWV9YClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKCh7IHBhdHRlcm4sIGV4cGVjdGVkTGVuZ3RoIH0pID0+IHtcbiAgICAgICAgICAgIHJlcG9ydChub2RlLCBwYXR0ZXJuLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbjogaGFuZGxlLFxuICAgICAgTmV3RXhwcmVzc2lvbjogaGFuZGxlLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY2FsbEFyZ3VtZW50c0xlbmd0aCA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"no-instanceof-builtin.d.ts","sourceRoot":"","sources":["../../src/rules/no-instanceof-builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA0CnC,eAAO,MAAM,mBAAmB;;;CAAiB,CAAC"}
1
+ {"version":3,"file":"no-instanceof-builtin.d.ts","sourceRoot":"","sources":["../../src/rules/no-instanceof-builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA6CnC,eAAO,MAAM,mBAAmB;;;CAAiB,CAAC"}
@@ -13,6 +13,9 @@ const rule = {
13
13
  create: (context) => {
14
14
  let builtins = undefined;
15
15
  return {
16
+ // ESLint visit the Node from root to leaf. The Program Node is the root.
17
+ // Therefore, Program will be called before BinaryExpression.
18
+ // https://eslint.org/docs/latest/extend/code-path-analysis
16
19
  Program: (node) => {
17
20
  const scope = context.sourceCode.getScope(node);
18
21
  builtins = new Set([
@@ -35,4 +38,4 @@ const rule = {
35
38
  },
36
39
  };
37
40
  export const noInstanceofBuiltin = { name, rule };
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5zdGFuY2VvZi1idWlsdGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLWluc3RhbmNlb2YtYnVpbHRpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLHVJQUF1STtBQUN2SSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLHNEQUFzRDtTQUNwRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLHNEQUFzRDtTQUMxRTtLQUNGO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsSUFBSSxRQUFRLEdBQTRCLFNBQVMsQ0FBQztRQUNsRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUM7b0JBQ2pCLGtDQUFrQztvQkFDbEMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDckMsZ0NBQWdDO29CQUNoQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztpQkFDbkQsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3pCLElBQ0UsSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZO29CQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQ2hDLENBQUM7b0JBQ0QsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcblxuLy8gVE9ETzogSWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzI0NTIgaXMgYWNjZXB0ZWQsIG1pZ3JhdGUgdGhpcyBydWxlIHRvIGBlc2xpbnQtcGx1Z2luLXVuaWNvcm5gXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJpZ2h0IGhhbmQgb2YgYGluc3RhbmNlb2ZgIGNhbid0IGJlIGEgYnVpbHRpbiBjbGFzcy5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTogXCJSaWdodCBoYW5kIG9mIGBpbnN0YW5jZW9mYCBjYW4ndCBiZSBhIGJ1aWx0aW4gY2xhc3MuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGxldCBidWlsdGluczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIFByb2dyYW06IChub2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gY29udGV4dC5zb3VyY2VDb2RlLmdldFNjb3BlKG5vZGUpO1xuICAgICAgICBidWlsdGlucyA9IG5ldyBTZXQoW1xuICAgICAgICAgIC8vIFZhcmlhYmxlcyBkZWNsYXJlZCBpbiBgZ2xvYmFsc2BcbiAgICAgICAgICAuLi5zY29wZS52YXJpYWJsZXMubWFwKCh2KSA9PiB2Lm5hbWUpLFxuICAgICAgICAgIC8vIFZhcmlhYmxlcyBub3QgZGVjbGFyZWQgYXQgYWxsXG4gICAgICAgICAgLi4uc2NvcGUudGhyb3VnaC5tYXAoKHJlZikgPT4gcmVmLmlkZW50aWZpZXIubmFtZSksXG4gICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIEJpbmFyeUV4cHJlc3Npb246IChub2RlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBub2RlLm9wZXJhdG9yICE9PSBcImluc3RhbmNlb2ZcIiB8fFxuICAgICAgICAgIG5vZGUucmlnaHQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1aWx0aW5zPy5oYXMobm9kZS5yaWdodC5uYW1lKSA/PyB0cnVlKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBub2RlLnJpZ2h0LCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG5vSW5zdGFuY2VvZkJ1aWx0aW4gPSB7IG5hbWUsIHJ1bGUgfTtcbiJdfQ==
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5zdGFuY2VvZi1idWlsdGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLWluc3RhbmNlb2YtYnVpbHRpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLHVJQUF1STtBQUN2SSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLHNEQUFzRDtTQUNwRTtRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLHNEQUFzRDtTQUMxRTtLQUNGO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsSUFBSSxRQUFRLEdBQTRCLFNBQVMsQ0FBQztRQUNsRCxPQUFPO1lBQ0wseUVBQXlFO1lBQ3pFLDZEQUE2RDtZQUM3RCwyREFBMkQ7WUFDM0QsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUM7b0JBQ2pCLGtDQUFrQztvQkFDbEMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDckMsZ0NBQWdDO29CQUNoQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztpQkFDbkQsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3pCLElBQ0UsSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZO29CQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQ2hDLENBQUM7b0JBQ0QsT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxuLy8gVE9ETzogSWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzI0NTIgaXMgYWNjZXB0ZWQsIG1pZ3JhdGUgdGhpcyBydWxlIHRvIGBlc2xpbnQtcGx1Z2luLXVuaWNvcm5gXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJpZ2h0IGhhbmQgb2YgYGluc3RhbmNlb2ZgIGNhbid0IGJlIGEgYnVpbHRpbiBjbGFzcy5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTogXCJSaWdodCBoYW5kIG9mIGBpbnN0YW5jZW9mYCBjYW4ndCBiZSBhIGJ1aWx0aW4gY2xhc3MuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGxldCBidWlsdGluczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEVTTGludCB2aXNpdCB0aGUgTm9kZSBmcm9tIHJvb3QgdG8gbGVhZi4gVGhlIFByb2dyYW0gTm9kZSBpcyB0aGUgcm9vdC5cbiAgICAgIC8vIFRoZXJlZm9yZSwgUHJvZ3JhbSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgQmluYXJ5RXhwcmVzc2lvbi5cbiAgICAgIC8vIGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC9leHRlbmQvY29kZS1wYXRoLWFuYWx5c2lzXG4gICAgICBQcm9ncmFtOiAobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShub2RlKTtcbiAgICAgICAgYnVpbHRpbnMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAvLyBWYXJpYWJsZXMgZGVjbGFyZWQgaW4gYGdsb2JhbHNgXG4gICAgICAgICAgLi4uc2NvcGUudmFyaWFibGVzLm1hcCgodikgPT4gdi5uYW1lKSxcbiAgICAgICAgICAvLyBWYXJpYWJsZXMgbm90IGRlY2xhcmVkIGF0IGFsbFxuICAgICAgICAgIC4uLnNjb3BlLnRocm91Z2gubWFwKChyZWYpID0+IHJlZi5pZGVudGlmaWVyLm5hbWUpLFxuICAgICAgICBdKTtcbiAgICAgIH0sXG4gICAgICBCaW5hcnlFeHByZXNzaW9uOiAobm9kZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZS5vcGVyYXRvciAhPT0gXCJpbnN0YW5jZW9mXCIgfHxcbiAgICAgICAgICBub2RlLnJpZ2h0LnR5cGUgIT09IFwiSWRlbnRpZmllclwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWlsdGlucz8uaGFzKG5vZGUucmlnaHQubmFtZSkgPz8gdHJ1ZSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZTogbm9kZS5yaWdodCwgbWVzc2FnZUlkOiBgJHtuYW1lfS9lcnJvcmAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBub0luc3RhbmNlb2ZCdWlsdGluID0geyBuYW1lLCBydWxlIH07XG4iXX0=
@@ -1 +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"}
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;AAyBnC,eAAO,MAAM,iBAAiB;;;CAAiB,CAAC"}
@@ -10,10 +10,9 @@ const rule = {
10
10
  },
11
11
  },
12
12
  create: (context) => {
13
- if (context.filename.endsWith(".jsx") ||
14
- context.filename.endsWith(".tsx")) {
13
+ // ignore jsx files
14
+ if (/\.[tj]sx$/.test(context.filename))
15
15
  return {};
16
- }
17
16
  return {
18
17
  ":matches(JSXElement, JSXFragment)": (node) => {
19
18
  context.report({ node, messageId: `${name}/error` });
@@ -22,4 +21,4 @@ const rule = {
22
21
  },
23
22
  };
24
23
  export const noJsxInNonJsxFile = { name, rule };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tanN4LWluLW5vbi1qc3gtZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1qc3gtaW4tbm9uLWpzeC1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsTUFBTSxJQUFJLEdBQW9CO0lBQzVCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxrREFBa0Q7U0FDaEU7UUFDRCxRQUFRLEVBQUU7WUFDUixDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxrREFBa0Q7U0FDdEU7S0FDRjtJQUNELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2xCLElBQ0UsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUNqQyxDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTztZQUNMLG1DQUFtQyxFQUFFLENBQUMsSUFBVSxFQUFFLEVBQUU7Z0JBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbmNvbnN0IG5hbWUgPSBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgcnVsZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246IFwiT25seSBhbGxvdyBKU1ggc3ludGF4IGluIGAuanN4YCBhbmQgYC50c3hgIGZpbGUuXCIsXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgW2Ake25hbWV9L2Vycm9yYF06IFwiT25seSBhbGxvdyBKU1ggc3ludGF4IGluIGAuanN4YCBhbmQgYC50c3hgIGZpbGUuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGlmIChcbiAgICAgIGNvbnRleHQuZmlsZW5hbWUuZW5kc1dpdGgoXCIuanN4XCIpIHx8XG4gICAgICBjb250ZXh0LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRzeFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgXCI6bWF0Y2hlcyhKU1hFbGVtZW50LCBKU1hGcmFnbWVudClcIjogKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBub0pzeEluTm9uSnN4RmlsZSA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tanN4LWluLW5vbi1qc3gtZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1qc3gtaW4tbm9uLWpzeC1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsTUFBTSxJQUFJLEdBQW9CO0lBQzVCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxrREFBa0Q7U0FDaEU7UUFDRCxRQUFRLEVBQUU7WUFDUixDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxrREFBa0Q7U0FDdEU7S0FDRjtJQUNELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2xCLG1CQUFtQjtRQUNuQixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2xELE9BQU87WUFDTCxtQ0FBbUMsRUFBRSxDQUFDLElBQVUsRUFBRSxFQUFFO2dCQUNsRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tIFwiZXN0cmVlXCI7XG5pbXBvcnQgeyBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk9ubHkgYWxsb3cgSlNYIHN5bnRheCBpbiBgLmpzeGAgYW5kIGAudHN4YCBmaWxlLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOiBcIk9ubHkgYWxsb3cgSlNYIHN5bnRheCBpbiBgLmpzeGAgYW5kIGAudHN4YCBmaWxlLlwiLFxuICAgIH0sXG4gIH0sXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IHtcbiAgICAvLyBpZ25vcmUganN4IGZpbGVzXG4gICAgaWYgKC9cXC5bdGpdc3gkLy50ZXN0KGNvbnRleHQuZmlsZW5hbWUpKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiOm1hdGNoZXMoSlNYRWxlbWVudCwgSlNYRnJhZ21lbnQpXCI6IChub2RlOiBOb2RlKSA9PiB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZUlkOiBgJHtuYW1lfS9lcnJvcmAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgbm9Kc3hJbk5vbkpzeEZpbGUgPSB7IG5hbWUsIHJ1bGUgfTtcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import type { Rule } from "eslint";
2
+ export declare const noNestedClass: {
3
+ name: string;
4
+ rule: Rule.RuleModule;
5
+ };
6
+ //# sourceMappingURL=no-nested-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-nested-class.d.ts","sourceRoot":"","sources":["../../src/rules/no-nested-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA8BnC,eAAO,MAAM,aAAa;;;CAAiB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { getRuleName } from "../utils.js";
2
+ const name = getRuleName(import.meta.url);
3
+ const rule = {
4
+ meta: {
5
+ docs: {
6
+ description: "Disallow nested class. Classes are expected to place at top level.",
7
+ },
8
+ messages: {
9
+ [`${name}/error`]: "Disallow nested class. Classes are expected to place at top level.",
10
+ },
11
+ },
12
+ create: (context) => {
13
+ const handle = (node) => context.report({ node, messageId: `${name}/error` });
14
+ return {
15
+ // ClassDeclaration is only allowed when parent is Program, or parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
16
+ "ClassDeclaration[parent.type!='Program'][parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']": handle,
17
+ // ClassExpression is only allowed when parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
18
+ "ClassExpression[parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']": handle,
19
+ };
20
+ },
21
+ };
22
+ export const noNestedClass = { name, rule };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tbmVzdGVkLWNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLW5lc3RlZC1jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1Qsb0VBQW9FO1NBQ3ZFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQ2Ysb0VBQW9FO1NBQ3ZFO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87WUFDTCxzSUFBc0k7WUFDdEksMEhBQTBILEVBQ3hILE1BQU07WUFDUiwrR0FBK0c7WUFDL0csaUdBQWlHLEVBQy9GLE1BQU07U0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tIFwiZXN0cmVlXCI7XG5pbXBvcnQgeyBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRpc2FsbG93IG5lc3RlZCBjbGFzcy4gQ2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gcGxhY2UgYXQgdG9wIGxldmVsLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIkRpc2FsbG93IG5lc3RlZCBjbGFzcy4gQ2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gcGxhY2UgYXQgdG9wIGxldmVsLlwiLFxuICAgIH0sXG4gIH0sXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBoYW5kbGUgPSAobm9kZTogTm9kZSkgPT5cbiAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZUlkOiBgJHtuYW1lfS9lcnJvcmAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIENsYXNzRGVjbGFyYXRpb24gaXMgb25seSBhbGxvd2VkIHdoZW4gcGFyZW50IGlzIFByb2dyYW0sIG9yIHBhcmVudCBpcyBFeHBvcnROYW1lZERlY2xhcmF0aW9uLCBvciBwYXJlbnQgaXMgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXG4gICAgICBcIkNsYXNzRGVjbGFyYXRpb25bcGFyZW50LnR5cGUhPSdQcm9ncmFtJ11bcGFyZW50LnR5cGUhPSdFeHBvcnROYW1lZERlY2xhcmF0aW9uJ11bcGFyZW50LnR5cGUhPSdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nXVwiOlxuICAgICAgICBoYW5kbGUsXG4gICAgICAvLyBDbGFzc0V4cHJlc3Npb24gaXMgb25seSBhbGxvd2VkIHdoZW4gcGFyZW50IGlzIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24sIG9yIHBhcmVudCBpcyBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgIFwiQ2xhc3NFeHByZXNzaW9uW3BhcmVudC50eXBlIT0nRXhwb3J0TmFtZWREZWNsYXJhdGlvbiddW3BhcmVudC50eXBlIT0nRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJ11cIjpcbiAgICAgICAgaGFuZGxlLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgbm9OZXN0ZWRDbGFzcyA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
@@ -0,0 +1,6 @@
1
+ import type { Rule } from "eslint";
2
+ export declare const noNestedFunction: {
3
+ name: string;
4
+ rule: Rule.RuleModule;
5
+ };
6
+ //# sourceMappingURL=no-nested-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-nested-function.d.ts","sourceRoot":"","sources":["../../src/rules/no-nested-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AA+BnC,eAAO,MAAM,gBAAgB;;;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: "Non top-level functions are expected to be arrow functions instead of function declarations.",
7
+ },
8
+ messages: {
9
+ [`${name}/error`]: "Non top-level functions are expected to be arrow functions instead of function declarations.",
10
+ },
11
+ },
12
+ create: (context) => {
13
+ const handle = (node) => context.report({ node, messageId: `${name}/error` });
14
+ return {
15
+ // FunctionDeclaration is only allowed when parent is Program, or parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
16
+ // function foo(){}
17
+ "FunctionDeclaration[parent.type!='Program'][parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']": handle,
18
+ // FunctionExpression is only allowed when parent is MethodDefinition
19
+ // function (){}
20
+ "FunctionExpression[parent.type!='MethodDefinition']": handle,
21
+ };
22
+ },
23
+ };
24
+ export const noNestedFunction = { name, rule };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tbmVzdGVkLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLW5lc3RlZC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1QsOEZBQThGO1NBQ2pHO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQ2YsOEZBQThGO1NBQ2pHO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87WUFDTCx5SUFBeUk7WUFDekksbUJBQW1CO1lBQ25CLDZIQUE2SCxFQUMzSCxNQUFNO1lBQ1IscUVBQXFFO1lBQ3JFLGdCQUFnQjtZQUNoQixxREFBcUQsRUFBRSxNQUFNO1NBQzlELENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHsgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJOb24gdG9wLWxldmVsIGZ1bmN0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgYXJyb3cgZnVuY3Rpb25zIGluc3RlYWQgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIk5vbiB0b3AtbGV2ZWwgZnVuY3Rpb25zIGFyZSBleHBlY3RlZCB0byBiZSBhcnJvdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBOb2RlKSA9PlxuICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gRnVuY3Rpb25EZWNsYXJhdGlvbiBpcyBvbmx5IGFsbG93ZWQgd2hlbiBwYXJlbnQgaXMgUHJvZ3JhbSwgb3IgcGFyZW50IGlzIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24sIG9yIHBhcmVudCBpcyBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgIC8vIGZ1bmN0aW9uIGZvbygpe31cbiAgICAgIFwiRnVuY3Rpb25EZWNsYXJhdGlvbltwYXJlbnQudHlwZSE9J1Byb2dyYW0nXVtwYXJlbnQudHlwZSE9J0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nXVtwYXJlbnQudHlwZSE9J0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbiddXCI6XG4gICAgICAgIGhhbmRsZSxcbiAgICAgIC8vIEZ1bmN0aW9uRXhwcmVzc2lvbiBpcyBvbmx5IGFsbG93ZWQgd2hlbiBwYXJlbnQgaXMgTWV0aG9kRGVmaW5pdGlvblxuICAgICAgLy8gZnVuY3Rpb24gKCl7fVxuICAgICAgXCJGdW5jdGlvbkV4cHJlc3Npb25bcGFyZW50LnR5cGUhPSdNZXRob2REZWZpbml0aW9uJ11cIjogaGFuZGxlLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgbm9OZXN0ZWRGdW5jdGlvbiA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
@@ -21,4 +21,4 @@ const rule = {
21
21
  }),
22
22
  };
23
23
  export const noRestrictedLoops = { name, rule };
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcmVzdHJpY3RlZC1sb29wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsdUlBQXVJO0FBQ3ZJLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDOzs7R0FHRztBQUNILE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1QsNkdBQTZHO1NBQ2hIO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQ2YsNkdBQTZHO1NBQ2hIO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEIsc0ZBQXNGLEVBQ3BGLENBQUMsSUFBVSxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO0tBQ0osQ0FBQztDQUNILENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbi8vIFRPRE86IElmIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZXNsaW50LXBsdWdpbi11bmljb3JuL2lzc3Vlcy8yNDUzIGlzIGFjY2VwdGVkLCBtaWdyYXRlIHRoaXMgcnVsZSB0byBgZXNsaW50LXBsdWdpbi11bmljb3JuYFxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG4vKipcbiAqIE9ubHkgYWxsb3cgYHdoaWxlYCBhbmQgYGZvci1vZmAgbG9vcHMuIGBmb3JgLCBgZm9yLWluYCwgYGRvLXdoaWxlYCBhbmQgYGZvci1hd2FpdC1vZmAgbG9vcHMgYXJlIGRpc2FsbG93ZWQuXG4gKiBWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2VzbGludC1wbHVnaW4tdW5pY29ybi9pc3N1ZXMvMjQ1MyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJPbmx5IGFsbG93IGB3aGlsZWAgYW5kIGBmb3Itb2ZgIGxvb3BzLiBgZm9yYCwgYGZvci1pbmAsIGBkby13aGlsZWAgYW5kIGBmb3ItYXdhaXQtb2ZgIGxvb3BzIGFyZSBkaXNhbGxvd2VkLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIk9ubHkgYWxsb3cgYHdoaWxlYCBhbmQgYGZvci1vZmAgbG9vcHMuIGBmb3JgLCBgZm9yLWluYCwgYGRvLXdoaWxlYCBhbmQgYGZvci1hd2FpdC1vZmAgbG9vcHMgYXJlIGRpc2FsbG93ZWQuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4gKHtcbiAgICBcIjptYXRjaGVzKEZvclN0YXRlbWVudCwgRm9ySW5TdGF0ZW1lbnQsIERvV2hpbGVTdGF0ZW1lbnQsIEZvck9mU3RhdGVtZW50W2F3YWl0PXRydWVdKVwiOlxuICAgICAgKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgIH0sXG4gIH0pLFxufTtcblxuZXhwb3J0IGNvbnN0IG5vUmVzdHJpY3RlZExvb3BzID0geyBuYW1lLCBydWxlIH07XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcmVzdHJpY3RlZC1sb29wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZXN0cmljdGVkLWxvb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsdUlBQXVJO0FBQ3ZJLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDOzs7R0FHRztBQUNILE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1QsNkdBQTZHO1NBQ2hIO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQ2YsNkdBQTZHO1NBQ2hIO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEIsc0ZBQXNGLEVBQ3BGLENBQUMsSUFBVSxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO0tBQ0osQ0FBQztDQUNILENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGdldFJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzLnRzXCI7XG5cbi8vIFRPRE86IElmIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZXNsaW50LXBsdWdpbi11bmljb3JuL2lzc3Vlcy8yNDUzIGlzIGFjY2VwdGVkLCBtaWdyYXRlIHRoaXMgcnVsZSB0byBgZXNsaW50LXBsdWdpbi11bmljb3JuYFxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG4vKipcbiAqIE9ubHkgYWxsb3cgYHdoaWxlYCBhbmQgYGZvci1vZmAgbG9vcHMuIGBmb3JgLCBgZm9yLWluYCwgYGRvLXdoaWxlYCBhbmQgYGZvci1hd2FpdC1vZmAgbG9vcHMgYXJlIGRpc2FsbG93ZWQuXG4gKiBWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2VzbGludC1wbHVnaW4tdW5pY29ybi9pc3N1ZXMvMjQ1MyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJPbmx5IGFsbG93IGB3aGlsZWAgYW5kIGBmb3Itb2ZgIGxvb3BzLiBgZm9yYCwgYGZvci1pbmAsIGBkby13aGlsZWAgYW5kIGBmb3ItYXdhaXQtb2ZgIGxvb3BzIGFyZSBkaXNhbGxvd2VkLlwiLFxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtgJHtuYW1lfS9lcnJvcmBdOlxuICAgICAgICBcIk9ubHkgYWxsb3cgYHdoaWxlYCBhbmQgYGZvci1vZmAgbG9vcHMuIGBmb3JgLCBgZm9yLWluYCwgYGRvLXdoaWxlYCBhbmQgYGZvci1hd2FpdC1vZmAgbG9vcHMgYXJlIGRpc2FsbG93ZWQuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4gKHtcbiAgICBcIjptYXRjaGVzKEZvclN0YXRlbWVudCwgRm9ySW5TdGF0ZW1lbnQsIERvV2hpbGVTdGF0ZW1lbnQsIEZvck9mU3RhdGVtZW50W2F3YWl0PXRydWVdKVwiOlxuICAgICAgKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgIH0sXG4gIH0pLFxufTtcblxuZXhwb3J0IGNvbnN0IG5vUmVzdHJpY3RlZExvb3BzID0geyBuYW1lLCBydWxlIH07XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import type { Rule } from "eslint";
2
+ export declare const noTopLevelArrowFunction: {
3
+ name: string;
4
+ rule: Rule.RuleModule;
5
+ };
6
+ //# sourceMappingURL=no-top-level-arrow-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-top-level-arrow-function.d.ts","sourceRoot":"","sources":["../../src/rules/no-top-level-arrow-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkCnC,eAAO,MAAM,uBAAuB;;;CAAiB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { getRuleName } from "../utils.js";
2
+ const name = getRuleName(import.meta.url);
3
+ const rule = {
4
+ meta: {
5
+ docs: {
6
+ description: "Top-level functions are expected to be function declarations instead of arrow functions.",
7
+ },
8
+ messages: {
9
+ [`${name}/error`]: "Top-level functions are expected to be function declarations instead of arrow functions.",
10
+ },
11
+ },
12
+ create: (context) => {
13
+ const handle = (node) => {
14
+ if (node.body.type === "BlockStatement") {
15
+ context.report({ node, messageId: `${name}/error` });
16
+ }
17
+ };
18
+ return {
19
+ "VariableDeclaration[parent.type='Program'] > VariableDeclarator > ArrowFunctionExpression": handle,
20
+ "ExpressionStatement[parent.type='Program'] > AssignmentExpression > ArrowFunctionExpression": handle,
21
+ "ExportNamedDeclaration > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression": handle,
22
+ "ExportDefaultDeclaration > ArrowFunctionExpression": handle,
23
+ };
24
+ },
25
+ };
26
+ export const noTopLevelArrowFunction = { name, rule };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdG9wLWxldmVsLWFycm93LWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXRvcC1sZXZlbC1hcnJvdy1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sSUFBSSxHQUFvQjtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixXQUFXLEVBQ1QsMEZBQTBGO1NBQzdGO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEVBQ2YsMEZBQTBGO1NBQzdGO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQTZCLEVBQUUsRUFBRTtZQUMvQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixPQUFPO1lBQ0wsMkZBQTJGLEVBQ3pGLE1BQU07WUFDUiw2RkFBNkYsRUFDM0YsTUFBTTtZQUNSLDZGQUE2RixFQUMzRixNQUFNO1lBQ1Isb0RBQW9ELEVBQUUsTUFBTTtTQUM3RCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gXCJlc2xpbnRcIjtcbmltcG9ydCB0eXBlIHsgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiZXN0cmVlXCI7XG5pbXBvcnQgeyBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG5jb25zdCBuYW1lID0gZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRvcC1sZXZlbCBmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbnN0ZWFkIG9mIGFycm93IGZ1bmN0aW9ucy5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTpcbiAgICAgICAgXCJUb3AtbGV2ZWwgZnVuY3Rpb25zIGFyZSBleHBlY3RlZCB0byBiZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW5zdGVhZCBvZiBhcnJvdyBmdW5jdGlvbnMuXCIsXG4gICAgfSxcbiAgfSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IChub2RlOiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbikgPT4ge1xuICAgICAgaWYgKG5vZGUuYm9keS50eXBlID09PSBcIkJsb2NrU3RhdGVtZW50XCIpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IGAke25hbWV9L2Vycm9yYCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBcIlZhcmlhYmxlRGVjbGFyYXRpb25bcGFyZW50LnR5cGU9J1Byb2dyYW0nXSA+IFZhcmlhYmxlRGVjbGFyYXRvciA+IEFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgIGhhbmRsZSxcbiAgICAgIFwiRXhwcmVzc2lvblN0YXRlbWVudFtwYXJlbnQudHlwZT0nUHJvZ3JhbSddID4gQXNzaWdubWVudEV4cHJlc3Npb24gPiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgICAgICBoYW5kbGUsXG4gICAgICBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24gPiBWYXJpYWJsZURlY2xhcmF0aW9uID4gVmFyaWFibGVEZWNsYXJhdG9yID4gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICAgICAgaGFuZGxlLFxuICAgICAgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiOiBoYW5kbGUsXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBub1RvcExldmVsQXJyb3dGdW5jdGlvbiA9IHsgbmFtZSwgcnVsZSB9O1xuIl19
@@ -21,4 +21,4 @@ const rule = {
21
21
  }),
22
22
  };
23
23
  export const noUnnecessaryTemplateString = { name, rule };
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW5uZWNlc3NhcnktdGVtcGxhdGUtc3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXVubmVjZXNzYXJ5LXRlbXBsYXRlLXN0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDhHQUE4RztBQUM5RyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULHFHQUFxRztTQUN4RztRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLHFHQUFxRztTQUN4RztLQUNGO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3hCLElBQ0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFDM0MsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7Q0FDSCxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgeyBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuXG4vLyBUT0RPIGRlcHJlY2F0ZSB0aGlzIHJ1bGUgaWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzcxIGlzIGltcGxlbWVudGVkLlxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEaXNhbGxvdyB1c2luZyB0ZW1wbGF0ZSBzdHJpbmcgd2hlbiBpdCdzIHVubmVjZXNzYXJ5LiBVc2Ugbm9ybWFsIGxpdGVyYWwgc3RyaW5nIGV4cHJlc3Npb24gaW5zdGVhZC5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTpcbiAgICAgICAgXCJEaXNhbGxvdyB1c2luZyB0ZW1wbGF0ZSBzdHJpbmcgd2hlbiBpdCdzIHVubmVjZXNzYXJ5LiBVc2Ugbm9ybWFsIGxpdGVyYWwgc3RyaW5nIGV4cHJlc3Npb24gaW5zdGVhZC5cIixcbiAgICB9LFxuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiAoe1xuICAgIFRlbXBsYXRlTGl0ZXJhbDogKG5vZGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5xdWFzaXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIG5vZGUubG9jPy5zdGFydC5saW5lID09PSBub2RlLmxvYz8uZW5kLmxpbmVcbiAgICAgICkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7IG5vZGUsIG1lc3NhZ2VJZDogYCR7bmFtZX0vZXJyb3JgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0pLFxufTtcbmV4cG9ydCBjb25zdCBub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcgPSB7IG5hbWUsIHJ1bGUgfTtcbiJdfQ==
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW5uZWNlc3NhcnktdGVtcGxhdGUtc3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXVubmVjZXNzYXJ5LXRlbXBsYXRlLXN0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLDhHQUE4RztBQUM5RyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLElBQUksR0FBb0I7SUFDNUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUNULHFHQUFxRztTQUN4RztRQUNELFFBQVEsRUFBRTtZQUNSLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUNmLHFHQUFxRztTQUN4RztLQUNGO0lBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3hCLElBQ0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFDM0MsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7Q0FDSCxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgeyBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG4vLyBUT0RPIGRlcHJlY2F0ZSB0aGlzIHJ1bGUgaWYgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2xpbnQtcGx1Z2luLXVuaWNvcm4vaXNzdWVzLzcxIGlzIGltcGxlbWVudGVkLlxuY29uc3QgbmFtZSA9IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJEaXNhbGxvdyB1c2luZyB0ZW1wbGF0ZSBzdHJpbmcgd2hlbiBpdCdzIHVubmVjZXNzYXJ5LiBVc2Ugbm9ybWFsIGxpdGVyYWwgc3RyaW5nIGV4cHJlc3Npb24gaW5zdGVhZC5cIixcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbYCR7bmFtZX0vZXJyb3JgXTpcbiAgICAgICAgXCJEaXNhbGxvdyB1c2luZyB0ZW1wbGF0ZSBzdHJpbmcgd2hlbiBpdCdzIHVubmVjZXNzYXJ5LiBVc2Ugbm9ybWFsIGxpdGVyYWwgc3RyaW5nIGV4cHJlc3Npb24gaW5zdGVhZC5cIixcbiAgICB9LFxuICB9LFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiAoe1xuICAgIFRlbXBsYXRlTGl0ZXJhbDogKG5vZGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5xdWFzaXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIG5vZGUubG9jPy5zdGFydC5saW5lID09PSBub2RlLmxvYz8uZW5kLmxpbmVcbiAgICAgICkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7IG5vZGUsIG1lc3NhZ2VJZDogYCR7bmFtZX0vZXJyb3JgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0pLFxufTtcbmV4cG9ydCBjb25zdCBub1VubmVjZXNzYXJ5VGVtcGxhdGVTdHJpbmcgPSB7IG5hbWUsIHJ1bGUgfTtcbiJdfQ==
@@ -0,0 +1,52 @@
1
+ <!-- prettier-ignore-start -->
2
+ # call-arguments-length
3
+
4
+ Disallow calling a function with incorrect arguments length.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ [].push()
12
+ foo.push()
13
+ foo.reduce()
14
+ [].reduce(()=>123)
15
+ foo.reduce(()=>123)
16
+ foo.reduce(bar)
17
+ [].reduceRight(()=>123)
18
+ foo.reduceRight(()=>123)
19
+ foo.reduceRight(bar)
20
+ [].reduce(...foo)
21
+ [].reduce(...foo, ...bar)
22
+ Math.max()
23
+ Math.max(1)
24
+ Math.min(foo)
25
+ new Set(...foo)
26
+ new Set(foo,bar)
27
+ ```
28
+
29
+ ### Pass
30
+
31
+ ```ts
32
+ push()
33
+ [].push('')
34
+ foo.push('')
35
+ foo.push(bar)
36
+ [].push('', '', '')
37
+ [].push(...foo)
38
+ foo.push(...([]))
39
+ [].reduce(()=>123, 0)
40
+ foo.reduce(()=>123, 0)
41
+ foo.reduce(bar, baz)
42
+ [].reduceRight(()=>123, 0)
43
+ foo.reduceRight(()=>123, 0)
44
+ foo.reduceRight(bar, baz)
45
+ reduce(()=>123)
46
+ foo.reduceLeft(()=>123)
47
+ Math.max(...foo)
48
+ new foo.Set(...bar)
49
+ new Set(bar)
50
+ new Set()
51
+ ```
52
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,50 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-instanceof-builtin
3
+
4
+ Right hand of `instanceof` can't be a builtin class.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ const i = {} instanceof Number
12
+ const i = {} instanceof String
13
+ const i = {} instanceof Boolean
14
+ const i = {} instanceof Symbol
15
+ const i = {} instanceof BigInt
16
+ const i = {} instanceof Object
17
+ const i = {} instanceof Array
18
+ const i = {} instanceof Function
19
+ const i = {} instanceof ArrayBuffer
20
+ const i = {} instanceof BigInt64Array
21
+ const i = {} instanceof BigUint64Array
22
+ const i = {} instanceof DataView
23
+ const i = {} instanceof Date
24
+ const i = {} instanceof Float32Array
25
+ const i = {} instanceof Float64Array
26
+ const i = {} instanceof Int16Array
27
+ const i = {} instanceof Int32Array
28
+ const i = {} instanceof Int8Array
29
+ const i = {} instanceof Map
30
+ const i = {} instanceof Error
31
+ const i = {} instanceof Promise
32
+ const i = {} instanceof Proxy
33
+ const i = {} instanceof RegExp
34
+ const i = {} instanceof Set
35
+ const i = {} instanceof SharedArrayBuffer
36
+ const i = {} instanceof Uint16Array
37
+ const i = {} instanceof Uint32Array
38
+ const i = {} instanceof Uint8Array
39
+ const i = {} instanceof Uint8ClampedArray
40
+ const i = {} instanceof WeakMap
41
+ const i = {} instanceof WeakSet
42
+ ```
43
+
44
+ ### Pass
45
+
46
+ ```ts
47
+ const i = Math.random() > 0.5 ? true: false
48
+ const i = {} instanceof await import('http')
49
+ ```
50
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,37 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-jsx-in-non-jsx-file
3
+
4
+ Only allow JSX syntax in `.jsx` and `.tsx` file.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ const Foo = () => <div></div> // filename: foo.js
12
+ const Foo = () => <></> // filename: foo.js
13
+ function Foo(){const x = <div>foo</div>} // filename: foo.js
14
+ function Foo(){const x = <>foo</>} // filename: foo.js
15
+ const Foo = () => <div></div> // filename: foo.cjs
16
+ const Foo = () => <></> // filename: foo.cjs
17
+ function Foo(){const x = <div>foo</div>} // filename: foo.cjs
18
+ function Foo(){const x = <>foo</>} // filename: foo.cjs
19
+ const Foo = () => <div></div> // filename: foo.mjs
20
+ const Foo = () => <></> // filename: foo.mjs
21
+ function Foo(){const x = <div>foo</div>} // filename: foo.mjs
22
+ function Foo(){const x = <>foo</>} // filename: foo.mjs
23
+ ```
24
+
25
+ ### Pass
26
+
27
+ ```ts
28
+ const Foo = () => <div></div> // filename: foo.jsx
29
+ const Foo = () => <></> // filename: foo.jsx
30
+ function Foo(){const x = <div>foo</div>} // filename: foo.jsx
31
+ function Foo(){const x = <>foo</>} // filename: foo.jsx
32
+ const Foo = () => <div></div> // filename: foo.tsx
33
+ const Foo = () => <></> // filename: foo.tsx
34
+ function Foo(){const x = <div>foo</div>} // filename: foo.tsx
35
+ function Foo(){const x = <>foo</>} // filename: foo.tsx
36
+ ```
37
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,31 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-nested-class
3
+
4
+ Disallow nested class. Classes are expected to place at top level.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ if(true) class Foo{}
12
+ if(true) const foo = class {}
13
+ function foo(){class Foo{}}
14
+ function foo(){const foo = class {}}
15
+ function foo(){return class Foo{}}
16
+ function foo(){return class{}}
17
+ const Foo = class{}
18
+ let Foo = class Bar{}
19
+ let Foo; Foo = class{}
20
+ (class {})
21
+ ```
22
+
23
+ ### Pass
24
+
25
+ ```ts
26
+ class Foo{}
27
+ export class Foo{}
28
+ export default class Foo{}
29
+ export default class {}
30
+ ```
31
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,42 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-nested-function
3
+
4
+ Non top-level functions are expected to be arrow functions instead of function declarations.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ Foo.prototype.bar = function(){}
12
+ Foo.prototype.bar = function bar(){}
13
+ const foo = function(){}
14
+ const foo = function foo(){}
15
+ let foo; foo = function(){}
16
+ let foo; foo = function foo(){}
17
+ (function(){})
18
+ const foo = () => {function bar(){}}
19
+ function foo() {function bar(){}}
20
+ function foo() {let bar = function(){}}
21
+ function foo() {let bar = function bar(){}}
22
+ if(true) function foo(){}
23
+ class Foo{bar = function(){}}
24
+ class Foo{bar = function bar(){}}
25
+ const foo = {bar: function() {}}
26
+ const foo = {bar: function bar() {}}
27
+ const foo = {bar() {}}
28
+ setTimeout(function(){},100)
29
+ setTimeout(function callback(){},100)
30
+ ```
31
+
32
+ ### Pass
33
+
34
+ ```ts
35
+ function foo(){}
36
+ const foo = () => {}
37
+ export function foo() {}
38
+ export default function foo() {}
39
+ export default function() {}
40
+ class Foo{bar(){}}
41
+ ```
42
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,23 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-restricted-loops
3
+
4
+ Only allow `while` and `for-of` loops. `for`, `for-in`, `do-while` and `for-await-of` loops are disallowed.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ for(let i = 0; i < foo.length; i++) {}
12
+ for(const bar in foo) {}
13
+ do{}while(condition)
14
+ for await (const bar of foo()) {}
15
+ ```
16
+
17
+ ### Pass
18
+
19
+ ```ts
20
+ for(const bar of foo) {}
21
+ while(condition){}
22
+ ```
23
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,45 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-top-level-arrow-function
3
+
4
+ Top-level functions are expected to be function declarations instead of arrow functions.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ let foo = () => {}
12
+ const foo = () => {}
13
+ let foo = () => {
14
+ }
15
+ const foo = () => {
16
+ }
17
+ let foo; foo = () => {
18
+ }
19
+ export const foo = () => {
20
+ }
21
+ export let foo = () => {
22
+ }
23
+ export default () => {
24
+ }
25
+ ```
26
+
27
+ ### Pass
28
+
29
+ ```ts
30
+ function foo(){}
31
+ const foo = function(){}
32
+ const foo = function foo(){}
33
+ if(true) const foo = () => {
34
+ }
35
+ let foo = () => ''
36
+ let foo = () => [
37
+ ]
38
+ let foo = () => ({})
39
+ const foo = () => ({})
40
+ let foo; foo = () => ({})
41
+ export const foo = () => ({})
42
+ export let foo = () => ({})
43
+ export default () => ({})
44
+ ```
45
+ <!-- prettier-ignore-end -->
@@ -0,0 +1,34 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-unnecessary-template-string
3
+
4
+ Disallow using template string when it's unnecessary. Use normal literal string expression instead.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ outdent`foo`
12
+ ``
13
+ `abc`
14
+ `abc\n`
15
+ `\nabc`
16
+ `a\nbc`
17
+ ```
18
+
19
+ ### Pass
20
+
21
+ ```ts
22
+ 'abc'
23
+ "def"
24
+ `ab${cd}ef`
25
+ `
26
+ `
27
+ `abc
28
+ `
29
+ `
30
+ abc`
31
+ `a
32
+ bc`
33
+ ```
34
+ <!-- prettier-ignore-end -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenge/eslint-plugin",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "ESLint plugin for JavaScript.",
5
5
  "keywords": [
6
6
  "opinionated",
@@ -21,13 +21,11 @@
21
21
  "type": "module",
22
22
  "exports": "./dist/index.js",
23
23
  "devDependencies": {
24
- "@types/eslint": "8.56.11",
25
24
  "@types/estree": "1.0.6",
26
- "@types/json-schema": "7.0.15",
27
- "@types/node": "22.9.1",
28
- "@typescript-eslint/parser": "8.18.0",
29
- "eslint": "8.57.1",
30
- "tsx": "4.19.2"
25
+ "@types/node": "22.10.5",
26
+ "eslint": "9.18.0",
27
+ "tsx": "4.19.2",
28
+ "@fenge/dev-utils": "0.0.0"
31
29
  },
32
30
  "scripts": {
33
31
  "build": "tsc",
package/src/index.ts CHANGED
@@ -1,13 +1,19 @@
1
- import { callArgumentsLength } from "./rules/call-arguments-length.js";
2
- import { noInstanceofBuiltin } from "./rules/no-instanceof-builtin.js";
3
- import { noJsxInNonJsxFile } from "./rules/no-jsx-in-non-jsx-file.js";
4
- import { noRestrictedLoops } from "./rules/no-restricted-loops.js";
5
- import { noUnnecessaryTemplateString } from "./rules/no-unnecessary-template-string.js";
1
+ import { callArgumentsLength } from "./rules/call-arguments-length.ts";
2
+ import { noInstanceofBuiltin } from "./rules/no-instanceof-builtin.ts";
3
+ import { noJsxInNonJsxFile } from "./rules/no-jsx-in-non-jsx-file.ts";
4
+ import { noNestedClass } from "./rules/no-nested-class.ts";
5
+ import { noNestedFunction } from "./rules/no-nested-function.ts";
6
+ import { noRestrictedLoops } from "./rules/no-restricted-loops.ts";
7
+ import { noTopLevelArrowFunction } from "./rules/no-top-level-arrow-function.ts";
8
+ import { noUnnecessaryTemplateString } from "./rules/no-unnecessary-template-string.ts";
6
9
 
7
10
  export const rules = {
8
11
  [callArgumentsLength.name]: callArgumentsLength.rule,
9
12
  [noInstanceofBuiltin.name]: noInstanceofBuiltin.rule,
10
13
  [noJsxInNonJsxFile.name]: noJsxInNonJsxFile.rule,
14
+ [noNestedClass.name]: noNestedClass.rule,
15
+ [noNestedFunction.name]: noNestedFunction.rule,
11
16
  [noRestrictedLoops.name]: noRestrictedLoops.rule,
17
+ [noTopLevelArrowFunction.name]: noTopLevelArrowFunction.rule,
12
18
  [noUnnecessaryTemplateString.name]: noUnnecessaryTemplateString.rule,
13
19
  };
@@ -1,5 +1,5 @@
1
- import { test } from "../test.spec.js";
2
- import { callArgumentsLength } from "./call-arguments-length.js";
1
+ import { test } from "@fenge/dev-utils";
2
+ import { callArgumentsLength } from "./call-arguments-length.ts";
3
3
 
4
4
  const valid = [
5
5
  "push()",
@@ -1,6 +1,6 @@
1
1
  import type { Rule } from "eslint";
2
2
  import type { CallExpression, NewExpression } from "estree";
3
- import { getRuleName } from "../utils.js";
3
+ import { getRuleName } from "../utils.ts";
4
4
 
5
5
  // TODO: If https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1356 is implemented, migrate this rule to `eslint-plugin-unicorn`
6
6
  const name = getRuleName(import.meta.url);
@@ -1,5 +1,5 @@
1
- import { test } from "../test.spec.js";
2
- import { noInstanceofBuiltin } from "./no-instanceof-builtin.js";
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noInstanceofBuiltin } from "./no-instanceof-builtin.ts";
3
3
 
4
4
  const invalid = [
5
5
  // Primitive
@@ -1,5 +1,5 @@
1
1
  import type { Rule } from "eslint";
2
- import { getRuleName } from "../utils.js";
2
+ import { getRuleName } from "../utils.ts";
3
3
 
4
4
  // TODO: If https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2452 is accepted, migrate this rule to `eslint-plugin-unicorn`
5
5
  const name = getRuleName(import.meta.url);
@@ -15,6 +15,9 @@ const rule: Rule.RuleModule = {
15
15
  create: (context) => {
16
16
  let builtins: Set<string> | undefined = undefined;
17
17
  return {
18
+ // ESLint visit the Node from root to leaf. The Program Node is the root.
19
+ // Therefore, Program will be called before BinaryExpression.
20
+ // https://eslint.org/docs/latest/extend/code-path-analysis
18
21
  Program: (node) => {
19
22
  const scope = context.sourceCode.getScope(node);
20
23
  builtins = new Set([
@@ -1,5 +1,5 @@
1
- import { test } from "../test.spec.js";
2
- import { noJsxInNonJsxFile } from "./no-jsx-in-non-jsx-file.js";
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noJsxInNonJsxFile } from "./no-jsx-in-non-jsx-file.ts";
3
3
 
4
4
  const codes = [
5
5
  "const Foo = () => <div></div>",
@@ -1,6 +1,6 @@
1
1
  import type { Rule } from "eslint";
2
2
  import type { Node } from "estree";
3
- import { getRuleName } from "../utils.js";
3
+ import { getRuleName } from "../utils.ts";
4
4
 
5
5
  const name = getRuleName(import.meta.url);
6
6
  const rule: Rule.RuleModule = {
@@ -13,12 +13,8 @@ const rule: Rule.RuleModule = {
13
13
  },
14
14
  },
15
15
  create: (context) => {
16
- if (
17
- context.filename.endsWith(".jsx") ||
18
- context.filename.endsWith(".tsx")
19
- ) {
20
- return {};
21
- }
16
+ // ignore jsx files
17
+ if (/\.[tj]sx$/.test(context.filename)) return {};
22
18
  return {
23
19
  ":matches(JSXElement, JSXFragment)": (node: Node) => {
24
20
  context.report({ node, messageId: `${name}/error` });
@@ -0,0 +1,27 @@
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noNestedClass } from "./no-nested-class.ts";
3
+
4
+ const valid = [
5
+ "class Foo{}",
6
+ "export class Foo{}",
7
+ "export default class Foo{}",
8
+ "export default class {}",
9
+ ];
10
+
11
+ const invalid = [
12
+ // nested
13
+ "if(true) class Foo{}",
14
+ "if(true) const foo = class {}",
15
+ "function foo(){class Foo{}}",
16
+ "function foo(){const foo = class {}}",
17
+ "function foo(){return class Foo{}}",
18
+ "function foo(){return class{}}",
19
+
20
+ // normal
21
+ "const Foo = class{}",
22
+ "let Foo = class Bar{}",
23
+ "let Foo; Foo = class{}",
24
+ "(class {})",
25
+ ];
26
+
27
+ test({ valid, invalid, ...noNestedClass });
@@ -0,0 +1,31 @@
1
+ import type { Rule } from "eslint";
2
+ import type { Node } from "estree";
3
+ import { getRuleName } from "../utils.ts";
4
+
5
+ const name = getRuleName(import.meta.url);
6
+ const rule: Rule.RuleModule = {
7
+ meta: {
8
+ docs: {
9
+ description:
10
+ "Disallow nested class. Classes are expected to place at top level.",
11
+ },
12
+ messages: {
13
+ [`${name}/error`]:
14
+ "Disallow nested class. Classes are expected to place at top level.",
15
+ },
16
+ },
17
+ create: (context) => {
18
+ const handle = (node: Node) =>
19
+ context.report({ node, messageId: `${name}/error` });
20
+ return {
21
+ // ClassDeclaration is only allowed when parent is Program, or parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
22
+ "ClassDeclaration[parent.type!='Program'][parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']":
23
+ handle,
24
+ // ClassExpression is only allowed when parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
25
+ "ClassExpression[parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']":
26
+ handle,
27
+ };
28
+ },
29
+ };
30
+
31
+ export const noNestedClass = { name, rule };
@@ -0,0 +1,49 @@
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noNestedFunction } from "./no-nested-function.ts";
3
+
4
+ const valid = [
5
+ // normal
6
+ "function foo(){}",
7
+ "const foo = () => {}",
8
+
9
+ // export
10
+ "export function foo() {}",
11
+ "export default function foo() {}",
12
+ "export default function() {}",
13
+
14
+ // class
15
+ "class Foo{bar(){}}",
16
+ ];
17
+
18
+ const invalid = [
19
+ // normal
20
+ "Foo.prototype.bar = function(){}",
21
+ "Foo.prototype.bar = function bar(){}",
22
+ "const foo = function(){}",
23
+ "const foo = function foo(){}",
24
+ "let foo; foo = function(){}",
25
+ "let foo; foo = function foo(){}",
26
+ "(function(){})",
27
+
28
+ // nested
29
+ "const foo = () => {function bar(){}}",
30
+ "function foo() {function bar(){}}",
31
+ "function foo() {let bar = function(){}}",
32
+ "function foo() {let bar = function bar(){}}",
33
+ "if(true) function foo(){}",
34
+
35
+ // class
36
+ "class Foo{bar = function(){}}",
37
+ "class Foo{bar = function bar(){}}",
38
+
39
+ // object
40
+ "const foo = {bar: function() {}}",
41
+ "const foo = {bar: function bar() {}}",
42
+ "const foo = {bar() {}}", // disallow this case
43
+
44
+ // callback
45
+ "setTimeout(function(){},100)",
46
+ "setTimeout(function callback(){},100)",
47
+ ];
48
+
49
+ test({ valid, invalid, ...noNestedFunction });
@@ -0,0 +1,32 @@
1
+ import type { Rule } from "eslint";
2
+ import type { Node } from "estree";
3
+ import { getRuleName } from "../utils.ts";
4
+
5
+ const name = getRuleName(import.meta.url);
6
+ const rule: Rule.RuleModule = {
7
+ meta: {
8
+ docs: {
9
+ description:
10
+ "Non top-level functions are expected to be arrow functions instead of function declarations.",
11
+ },
12
+ messages: {
13
+ [`${name}/error`]:
14
+ "Non top-level functions are expected to be arrow functions instead of function declarations.",
15
+ },
16
+ },
17
+ create: (context) => {
18
+ const handle = (node: Node) =>
19
+ context.report({ node, messageId: `${name}/error` });
20
+ return {
21
+ // FunctionDeclaration is only allowed when parent is Program, or parent is ExportNamedDeclaration, or parent is ExportDefaultDeclaration
22
+ // function foo(){}
23
+ "FunctionDeclaration[parent.type!='Program'][parent.type!='ExportNamedDeclaration'][parent.type!='ExportDefaultDeclaration']":
24
+ handle,
25
+ // FunctionExpression is only allowed when parent is MethodDefinition
26
+ // function (){}
27
+ "FunctionExpression[parent.type!='MethodDefinition']": handle,
28
+ };
29
+ },
30
+ };
31
+
32
+ export const noNestedFunction = { name, rule };
@@ -1,5 +1,5 @@
1
- import { test } from "../test.spec.js";
2
- import { noRestrictedLoops } from "./no-restricted-loops.js";
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noRestrictedLoops } from "./no-restricted-loops.ts";
3
3
 
4
4
  const valid = ["for(const bar of foo) {}", "while(condition){}"];
5
5
 
@@ -1,6 +1,6 @@
1
1
  import type { Rule } from "eslint";
2
2
  import type { Node } from "estree";
3
- import { getRuleName } from "../utils.js";
3
+ import { getRuleName } from "../utils.ts";
4
4
 
5
5
  // TODO: If https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2453 is accepted, migrate this rule to `eslint-plugin-unicorn`
6
6
  const name = getRuleName(import.meta.url);
@@ -0,0 +1,32 @@
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noTopLevelArrowFunction } from "./no-top-level-arrow-function.ts";
3
+
4
+ const valid = [
5
+ "function foo(){}",
6
+ "const foo = function(){}",
7
+ "const foo = function foo(){}",
8
+ "if(true) const foo = () => {\n}",
9
+
10
+ // allow one-line function
11
+ "let foo = () => ''",
12
+ "let foo = () => [\n]",
13
+ "let foo = () => ({})",
14
+ "const foo = () => ({})",
15
+ "let foo; foo = () => ({})",
16
+ "export const foo = () => ({})",
17
+ "export let foo = () => ({})",
18
+ "export default () => ({})",
19
+ ];
20
+
21
+ const invalid = [
22
+ "let foo = () => {}",
23
+ "const foo = () => {}",
24
+ "let foo = () => {\n}",
25
+ "const foo = () => {\n}",
26
+ "let foo; foo = () => {\n}",
27
+ "export const foo = () => {\n}",
28
+ "export let foo = () => {\n}",
29
+ "export default () => {\n}",
30
+ ];
31
+
32
+ test({ valid, invalid, ...noTopLevelArrowFunction });
@@ -0,0 +1,35 @@
1
+ import type { Rule } from "eslint";
2
+ import type { ArrowFunctionExpression } from "estree";
3
+ import { getRuleName } from "../utils.ts";
4
+
5
+ const name = getRuleName(import.meta.url);
6
+ const rule: Rule.RuleModule = {
7
+ meta: {
8
+ docs: {
9
+ description:
10
+ "Top-level functions are expected to be function declarations instead of arrow functions.",
11
+ },
12
+ messages: {
13
+ [`${name}/error`]:
14
+ "Top-level functions are expected to be function declarations instead of arrow functions.",
15
+ },
16
+ },
17
+ create: (context) => {
18
+ const handle = (node: ArrowFunctionExpression) => {
19
+ if (node.body.type === "BlockStatement") {
20
+ context.report({ node, messageId: `${name}/error` });
21
+ }
22
+ };
23
+ return {
24
+ "VariableDeclaration[parent.type='Program'] > VariableDeclarator > ArrowFunctionExpression":
25
+ handle,
26
+ "ExpressionStatement[parent.type='Program'] > AssignmentExpression > ArrowFunctionExpression":
27
+ handle,
28
+ "ExportNamedDeclaration > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression":
29
+ handle,
30
+ "ExportDefaultDeclaration > ArrowFunctionExpression": handle,
31
+ };
32
+ },
33
+ };
34
+
35
+ export const noTopLevelArrowFunction = { name, rule };
@@ -1,5 +1,5 @@
1
- import { test } from "../test.spec.js";
2
- import { noUnnecessaryTemplateString } from "./no-unnecessary-template-string.js";
1
+ import { test } from "@fenge/dev-utils";
2
+ import { noUnnecessaryTemplateString } from "./no-unnecessary-template-string.ts";
3
3
 
4
4
  const valid = [
5
5
  "'abc'",
@@ -1,5 +1,5 @@
1
1
  import type { Rule } from "eslint";
2
- import { getRuleName } from "../utils.js";
2
+ import { getRuleName } from "../utils.ts";
3
3
 
4
4
  // TODO deprecate this rule if https://github.com/sindresorhus/eslint-plugin-unicorn/issues/71 is implemented.
5
5
  const name = getRuleName(import.meta.url);
package/src/test.spec.ts DELETED
@@ -1,51 +0,0 @@
1
- import { createRequire } from "node:module";
2
- import { describe, it } from "node:test";
3
- import { RuleTester, type Rule } from "eslint";
4
-
5
- export type TestCase = string | { code: string; filename?: string };
6
-
7
- const tester = new RuleTester({
8
- parser: createRequire(import.meta.url).resolve("@typescript-eslint/parser"),
9
- parserOptions: { ecmaVersion: "latest", sourceType: "module" },
10
- });
11
-
12
- export async function test({
13
- name,
14
- rule,
15
- valid,
16
- invalid,
17
- errors = 1,
18
- }: {
19
- name: string;
20
- rule: Rule.RuleModule;
21
- valid: TestCase[];
22
- invalid: TestCase[];
23
- errors?: number;
24
- }) {
25
- await describe(name, async () => {
26
- await Promise.all(
27
- valid.map(async (testCase) => {
28
- await it(JSON.stringify(testCase), () => {
29
- tester.run(name, rule, {
30
- valid: [testCase],
31
- invalid: [],
32
- });
33
- });
34
- }),
35
- );
36
-
37
- await Promise.all(
38
- invalid.map(async (testCase) => {
39
- await it(JSON.stringify(testCase), () => {
40
- const code = typeof testCase === "string" ? testCase : testCase.code;
41
- const filename =
42
- typeof testCase === "string" ? undefined : testCase.filename;
43
- tester.run(name, rule, {
44
- valid: [],
45
- invalid: [{ code, errors, filename }],
46
- });
47
- });
48
- }),
49
- );
50
- });
51
- }