@checkdigit/eslint-plugin 7.13.0-PR.57-b371 → 7.13.0-PR.57-1728

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.
@@ -1,85 +1,89 @@
1
1
  // src/file-path-comment.ts
2
- import { ESLintUtils } from "@typescript-eslint/utils";
3
- var ruleId = "validate-first-line-path";
4
- var VALIDATE_FIRST_LINE_PATH = "VALIDATE_FIRST_LINE_PATH";
5
2
  var DISABLE_NEXT_LINE = "eslint-disable-next-line";
6
- var DISABLED_RULE = "no-util";
7
- var createRule = ESLintUtils.RuleCreator((name) => name);
8
- var rule = createRule({
9
- name: ruleId,
3
+ var file_path_comment_default = {
10
4
  meta: {
11
5
  type: "suggestion",
12
6
  docs: {
13
7
  description: "Validate that first line of file is a path to the file",
14
8
  url: "https://github.com/checkdigit/eslint-plugin"
15
9
  },
16
- fixable: "code",
17
- schema: [],
18
- messages: {
19
- [VALIDATE_FIRST_LINE_PATH]: "First line '{{firstLine}}' is not a valid path to the file."
20
- }
10
+ fixable: "code"
21
11
  },
22
- defaultOptions: [],
23
12
  create(context) {
24
- return {
25
- Program() {
26
- const firstLine = context.sourceCode.getLines()[0];
27
- const expectedPath = context.filename.split("src/")[1];
28
- if (firstLine === void 0 || expectedPath === void 0) {
29
- return;
30
- }
31
- if (!firstLine.startsWith("//")) {
32
- context.report({
33
- loc: {
34
- start: {
35
- line: 0,
36
- column: 0
37
- },
38
- end: {
39
- line: 0,
40
- column: 1
41
- }
13
+ const firstLine = context.sourceCode.getLines()[0];
14
+ const expectedPath = context.filename.split("src/")[1];
15
+ if (firstLine === void 0 || expectedPath === void 0) {
16
+ return {};
17
+ }
18
+ const firstComment = firstLine.split("// ")[1];
19
+ if (firstComment?.startsWith(DISABLE_NEXT_LINE) === true) {
20
+ return {};
21
+ }
22
+ if (!firstLine.startsWith("//")) {
23
+ if (firstLine.startsWith("/*")) {
24
+ context.report({
25
+ loc: {
26
+ start: {
27
+ line: 0,
28
+ column: 0
42
29
  },
43
- messageId: VALIDATE_FIRST_LINE_PATH,
44
- data: { firstLine },
45
- fix(fixer) {
46
- return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}
30
+ end: {
31
+ line: 0,
32
+ column: 1
33
+ }
34
+ },
35
+ message: "first line cannot be a block comment",
36
+ fix(fixer) {
37
+ return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}
47
38
 
48
39
  `);
40
+ }
41
+ });
42
+ } else {
43
+ context.report({
44
+ loc: {
45
+ start: {
46
+ line: 0,
47
+ column: 0
48
+ },
49
+ end: {
50
+ line: 0,
51
+ column: 1
49
52
  }
50
- });
51
- } else {
52
- const actualComment = firstLine.split("// ")[1];
53
- if (actualComment?.startsWith(DISABLE_NEXT_LINE) === true && actualComment.endsWith(DISABLED_RULE)) {
54
- return;
53
+ },
54
+ message: "first line is not a comment with the file path",
55
+ fix(fixer) {
56
+ return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}
57
+
58
+ `);
55
59
  }
56
- if (expectedPath !== actualComment) {
57
- context.report({
58
- loc: {
59
- start: {
60
- line: 0,
61
- column: 0
62
- },
63
- end: {
64
- line: 0,
65
- column: 1
66
- }
67
- },
68
- messageId: VALIDATE_FIRST_LINE_PATH,
69
- data: { firstLine },
70
- fix(fixer) {
71
- return fixer.replaceTextRange([0, firstLine.length], `// ${expectedPath}`);
72
- }
73
- });
60
+ });
61
+ }
62
+ } else {
63
+ const actualComment = firstLine.split("// ")[1];
64
+ if (expectedPath !== actualComment) {
65
+ context.report({
66
+ loc: {
67
+ start: {
68
+ line: 0,
69
+ column: 0
70
+ },
71
+ end: {
72
+ line: 0,
73
+ column: 1
74
+ }
75
+ },
76
+ message: "first line is a comment but is not a path to the file",
77
+ fix(fixer) {
78
+ return fixer.replaceTextRange([0, firstLine.length], `// ${expectedPath}`);
74
79
  }
75
- }
80
+ });
76
81
  }
77
- };
82
+ }
83
+ return {};
78
84
  }
79
- });
80
- var file_path_comment_default = rule;
85
+ };
81
86
  export {
82
- file_path_comment_default as default,
83
- ruleId
87
+ file_path_comment_default as default
84
88
  };
85
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZpbGUtcGF0aC1jb21tZW50LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLFNBQVMsbUJBQW1CO0FBRXJCLElBQU0sU0FBUztBQUN0QixJQUFNLDJCQUEyQjtBQUNqQyxJQUFNLG9CQUFvQjtBQUMxQixJQUFNLGdCQUFnQjtBQUV0QixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxJQUFJO0FBRXpELElBQU0sT0FBZ0UsV0FBVztBQUFBLEVBQy9FLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxNQUNiLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVCxRQUFRLENBQUM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLENBQUMsd0JBQXdCLEdBQUc7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsV0FBTztBQUFBLE1BQ0wsVUFBVTtBQUNSLGNBQU0sWUFBWSxRQUFRLFdBQVcsU0FBUyxFQUFFLENBQUM7QUFDakQsY0FBTSxlQUFlLFFBQVEsU0FBUyxNQUFNLE1BQU0sRUFBRSxDQUFDO0FBRXJELFlBQUksY0FBYyxVQUFhLGlCQUFpQixRQUFXO0FBQ3pEO0FBQUEsUUFDRjtBQUVBLFlBQUksQ0FBQyxVQUFVLFdBQVcsSUFBSSxHQUFHO0FBQy9CLGtCQUFRLE9BQU87QUFBQSxZQUNiLEtBQUs7QUFBQSxjQUNILE9BQU87QUFBQSxnQkFDTCxNQUFNO0FBQUEsZ0JBQ04sUUFBUTtBQUFBLGNBQ1Y7QUFBQSxjQUNBLEtBQUs7QUFBQSxnQkFDSCxNQUFNO0FBQUEsZ0JBQ04sUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBQUEsWUFDQSxXQUFXO0FBQUEsWUFDWCxNQUFNLEVBQUUsVUFBVTtBQUFBLFlBQ2xCLElBQUksT0FBTztBQUNULHFCQUFPLE1BQU0sc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxZQUFZO0FBQUE7QUFBQSxDQUFNO0FBQUEsWUFDckU7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILE9BQU87QUFDTCxnQkFBTSxnQkFBZ0IsVUFBVSxNQUFNLEtBQUssRUFBRSxDQUFDO0FBRTlDLGNBQUksZUFBZSxXQUFXLGlCQUFpQixNQUFNLFFBQVEsY0FBYyxTQUFTLGFBQWEsR0FBRztBQUNsRztBQUFBLFVBQ0Y7QUFFQSxjQUFJLGlCQUFpQixlQUFlO0FBQ2xDLG9CQUFRLE9BQU87QUFBQSxjQUNiLEtBQUs7QUFBQSxnQkFDSCxPQUFPO0FBQUEsa0JBQ0wsTUFBTTtBQUFBLGtCQUNOLFFBQVE7QUFBQSxnQkFDVjtBQUFBLGdCQUNBLEtBQUs7QUFBQSxrQkFDSCxNQUFNO0FBQUEsa0JBQ04sUUFBUTtBQUFBLGdCQUNWO0FBQUEsY0FDRjtBQUFBLGNBQ0EsV0FBVztBQUFBLGNBQ1gsTUFBTSxFQUFFLFVBQVU7QUFBQSxjQUNsQixJQUFJLE9BQU87QUFDVCx1QkFBTyxNQUFNLGlCQUFpQixDQUFDLEdBQUcsVUFBVSxNQUFNLEdBQUcsTUFBTSxZQUFZLEVBQUU7QUFBQSxjQUMzRTtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sNEJBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
89
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZpbGUtcGF0aC1jb21tZW50LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVVBLElBQU0sb0JBQW9CO0FBRTFCLElBQU8sNEJBQVE7QUFBQSxFQUNiLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxNQUNiLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFDQSxTQUFTO0FBQUEsRUFDWDtBQUFBLEVBQ0EsT0FBTyxTQUFTO0FBQ2QsVUFBTSxZQUFZLFFBQVEsV0FBVyxTQUFTLEVBQUUsQ0FBQztBQUNqRCxVQUFNLGVBQWUsUUFBUSxTQUFTLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFFckQsUUFBSSxjQUFjLFVBQWEsaUJBQWlCLFFBQVc7QUFDekQsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFVBQU0sZUFBZSxVQUFVLE1BQU0sS0FBSyxFQUFFLENBQUM7QUFDN0MsUUFBSSxjQUFjLFdBQVcsaUJBQWlCLE1BQU0sTUFBTTtBQUN4RCxhQUFPLENBQUM7QUFBQSxJQUNWO0FBRUEsUUFBSSxDQUFDLFVBQVUsV0FBVyxJQUFJLEdBQUc7QUFDL0IsVUFBSSxVQUFVLFdBQVcsSUFBSSxHQUFHO0FBQzlCLGdCQUFRLE9BQU87QUFBQSxVQUNiLEtBQUs7QUFBQSxZQUNILE9BQU87QUFBQSxjQUNMLE1BQU07QUFBQSxjQUNOLFFBQVE7QUFBQSxZQUNWO0FBQUEsWUFDQSxLQUFLO0FBQUEsY0FDSCxNQUFNO0FBQUEsY0FDTixRQUFRO0FBQUEsWUFDVjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLFNBQVM7QUFBQSxVQUNULElBQUksT0FBdUI7QUFDekIsbUJBQU8sTUFBTSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLFlBQVk7QUFBQTtBQUFBLENBQU07QUFBQSxVQUNyRTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0gsT0FBTztBQUNMLGdCQUFRLE9BQU87QUFBQSxVQUNiLEtBQUs7QUFBQSxZQUNILE9BQU87QUFBQSxjQUNMLE1BQU07QUFBQSxjQUNOLFFBQVE7QUFBQSxZQUNWO0FBQUEsWUFDQSxLQUFLO0FBQUEsY0FDSCxNQUFNO0FBQUEsY0FDTixRQUFRO0FBQUEsWUFDVjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLFNBQVM7QUFBQSxVQUNULElBQUksT0FBdUI7QUFDekIsbUJBQU8sTUFBTSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLFlBQVk7QUFBQTtBQUFBLENBQU07QUFBQSxVQUNyRTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGLE9BQU87QUFDTCxZQUFNLGdCQUFnQixVQUFVLE1BQU0sS0FBSyxFQUFFLENBQUM7QUFDOUMsVUFBSSxpQkFBaUIsZUFBZTtBQUNsQyxnQkFBUSxPQUFPO0FBQUEsVUFDYixLQUFLO0FBQUEsWUFDSCxPQUFPO0FBQUEsY0FDTCxNQUFNO0FBQUEsY0FDTixRQUFRO0FBQUEsWUFDVjtBQUFBLFlBQ0EsS0FBSztBQUFBLGNBQ0gsTUFBTTtBQUFBLGNBQ04sUUFBUTtBQUFBLFlBQ1Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxTQUFTO0FBQUEsVUFDVCxJQUFJLE9BQXVCO0FBQ3pCLG1CQUFPLE1BQU0saUJBQWlCLENBQUMsR0FBRyxVQUFVLE1BQU0sR0FBRyxNQUFNLFlBQVksRUFBRTtBQUFBLFVBQzNFO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFFQSxXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,7 +1,7 @@
1
1
  // src/no-util.ts
2
2
  import { ESLintUtils } from "@typescript-eslint/utils";
3
- var ruleId = "no-util-filename";
4
- var NO_UTIL_FILENAME = "NO_UTIL_FILENAME";
3
+ var ruleId = "no-util";
4
+ var NO_UTIL = "NO_UTIL";
5
5
  var createRule = ESLintUtils.RuleCreator((name) => name);
6
6
  var rule = createRule({
7
7
  name: ruleId,
@@ -12,7 +12,7 @@ var rule = createRule({
12
12
  },
13
13
  schema: [],
14
14
  messages: {
15
- [NO_UTIL_FILENAME]: "File name '{{filename}}' contains banned 'util' pattern."
15
+ [NO_UTIL]: "File name '{{filename}}' contains banned 'util' pattern."
16
16
  }
17
17
  },
18
18
  defaultOptions: [],
@@ -23,17 +23,11 @@ var rule = createRule({
23
23
  const utilRegex = /(?:^|[-_/])util(?=[-_./]|$)/iu;
24
24
  if (utilRegex.test(filename)) {
25
25
  context.report({
26
- messageId: NO_UTIL_FILENAME,
26
+ messageId: NO_UTIL,
27
27
  data: { filename },
28
28
  loc: {
29
- start: {
30
- line: 0,
31
- column: 0
32
- },
33
- end: {
34
- line: 0,
35
- column: 1
36
- }
29
+ start: { line: 0, column: 0 },
30
+ end: { line: 0, column: 1 }
37
31
  }
38
32
  });
39
33
  }
@@ -46,4 +40,4 @@ export {
46
40
  no_util_default as default,
47
41
  ruleId
48
42
  };
49
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLXV0aWwudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxtQkFBbUI7QUFFckIsSUFBTSxTQUFTO0FBQ3RCLElBQU0sbUJBQW1CO0FBRXpCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLElBQUk7QUFFekQsSUFBTSxPQUF3RCxXQUFXO0FBQUEsRUFDdkUsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLElBQ1QsVUFBVTtBQUFBLE1BQ1IsQ0FBQyxnQkFBZ0IsR0FBRztBQUFBLElBQ3RCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxVQUFVO0FBQ1IsY0FBTSxXQUFXLFFBQVE7QUFDekIsY0FBTSxZQUFZO0FBQ2xCLFlBQUksVUFBVSxLQUFLLFFBQVEsR0FBRztBQUM1QixrQkFBUSxPQUFPO0FBQUEsWUFDYixXQUFXO0FBQUEsWUFDWCxNQUFNLEVBQUUsU0FBUztBQUFBLFlBQ2pCLEtBQUs7QUFBQSxjQUNILE9BQU87QUFBQSxnQkFDTCxNQUFNO0FBQUEsZ0JBQ04sUUFBUTtBQUFBLGNBQ1Y7QUFBQSxjQUNBLEtBQUs7QUFBQSxnQkFDSCxNQUFNO0FBQUEsZ0JBQ04sUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFRCxJQUFPLGtCQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
43
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLXV0aWwudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxtQkFBbUI7QUFFckIsSUFBTSxTQUFTO0FBQ3RCLElBQU0sVUFBVTtBQUVoQixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxJQUFJO0FBRXpELElBQU0sT0FBK0MsV0FBVztBQUFBLEVBQzlELE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLENBQUMsT0FBTyxHQUFHO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsV0FBTztBQUFBLE1BQ0wsVUFBVTtBQUNSLGNBQU0sV0FBVyxRQUFRO0FBQ3pCLGNBQU0sWUFBWTtBQUNsQixZQUFJLFVBQVUsS0FBSyxRQUFRLEdBQUc7QUFDNUIsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTSxFQUFFLFNBQVM7QUFBQSxZQUNqQixLQUFLO0FBQUEsY0FDSCxPQUFPLEVBQUUsTUFBTSxHQUFHLFFBQVEsRUFBRTtBQUFBLGNBQzVCLEtBQUssRUFBRSxNQUFNLEdBQUcsUUFBUSxFQUFFO0FBQUEsWUFDNUI7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sa0JBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,5 +1,3 @@
1
- import { ESLintUtils } from '@typescript-eslint/utils';
2
- export declare const ruleId = "validate-first-line-path";
3
- declare const VALIDATE_FIRST_LINE_PATH = "VALIDATE_FIRST_LINE_PATH";
4
- declare const rule: ESLintUtils.RuleModule<typeof VALIDATE_FIRST_LINE_PATH>;
5
- export default rule;
1
+ import type { Rule } from 'eslint';
2
+ declare const _default: Rule.RuleModule;
3
+ export default _default;
@@ -1,5 +1,5 @@
1
1
  import { ESLintUtils } from '@typescript-eslint/utils';
2
- export declare const ruleId = "no-util-filename";
3
- declare const NO_UTIL_FILENAME = "NO_UTIL_FILENAME";
4
- declare const rule: ESLintUtils.RuleModule<typeof NO_UTIL_FILENAME>;
2
+ export declare const ruleId = "no-util";
3
+ declare const NO_UTIL = "NO_UTIL";
4
+ declare const rule: ESLintUtils.RuleModule<typeof NO_UTIL>;
5
5
  export default rule;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"7.13.0-PR.57-b371","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"^8.23.0","@typescript-eslint/utils":"^8.23.0","http-status-codes":"^2.3.0","ts-api-utils":"^2.0.1"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"^9.0.0","@eslint/js":"^9.19.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.23.0","@typescript-eslint/rule-tester":"^8.23.0","eslint":"^9.19.0","eslint-config-prettier":"^10.0.1","eslint-import-resolver-typescript":"^3.7.0","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.2.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","rimraf":"^6.0.1","typescript-eslint":"^8.23.0"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=20.17"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"7.13.0-PR.57-1728","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-mjs","!src/**/test/**","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/test/**","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-mjs/**/test/**","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 .","lint:fix":"eslint --max-warnings 0 --fix .","prepare":"","prepublishOnly":"npm run build:dist-types && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"dependencies":{"@typescript-eslint/type-utils":"^8.23.0","@typescript-eslint/utils":"^8.23.0","http-status-codes":"^2.3.0","ts-api-utils":"^2.0.1"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.1.0","@checkdigit/typescript-config":"^9.0.0","@eslint/js":"^9.19.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.23.0","@typescript-eslint/rule-tester":"^8.23.0","eslint":"^9.19.0","eslint-config-prettier":"^10.0.1","eslint-import-resolver-typescript":"^3.7.0","eslint-plugin-eslint-plugin":"^6.4.0","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.2.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","rimraf":"^6.0.1","typescript-eslint":"^8.23.0"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=22.11"}}
@@ -1,22 +1,16 @@
1
1
  // file-path-comment.ts
2
2
 
3
+ import type { Rule } from 'eslint';
4
+
3
5
  /*
4
6
  * Copyright (c) 2021-2025 Check Digit, LLC
5
7
  *
6
8
  * This code is licensed under the MIT license (see LICENSE.txt for details).
7
9
  */
8
10
 
9
- import { ESLintUtils } from '@typescript-eslint/utils';
10
-
11
- export const ruleId = 'validate-first-line-path';
12
- const VALIDATE_FIRST_LINE_PATH = 'VALIDATE_FIRST_LINE_PATH';
13
11
  const DISABLE_NEXT_LINE = 'eslint-disable-next-line';
14
- const DISABLED_RULE = 'no-util';
15
-
16
- const createRule = ESLintUtils.RuleCreator((name) => name);
17
12
 
18
- const rule: ESLintUtils.RuleModule<typeof VALIDATE_FIRST_LINE_PATH> = createRule({
19
- name: ruleId,
13
+ export default {
20
14
  meta: {
21
15
  type: 'suggestion',
22
16
  docs: {
@@ -24,70 +18,78 @@ const rule: ESLintUtils.RuleModule<typeof VALIDATE_FIRST_LINE_PATH> = createRule
24
18
  url: 'https://github.com/checkdigit/eslint-plugin',
25
19
  },
26
20
  fixable: 'code',
27
- schema: [],
28
- messages: {
29
- [VALIDATE_FIRST_LINE_PATH]: "First line '{{firstLine}}' is not a valid path to the file.",
30
- },
31
21
  },
32
- defaultOptions: [],
33
22
  create(context) {
34
- return {
35
- Program() {
36
- const firstLine = context.sourceCode.getLines()[0];
37
- const expectedPath = context.filename.split('src/')[1];
23
+ const firstLine = context.sourceCode.getLines()[0];
24
+ const expectedPath = context.filename.split('src/')[1];
25
+
26
+ if (firstLine === undefined || expectedPath === undefined) {
27
+ return {};
28
+ }
38
29
 
39
- if (firstLine === undefined || expectedPath === undefined) {
40
- return;
41
- }
30
+ const firstComment = firstLine.split('// ')[1];
31
+ if (firstComment?.startsWith(DISABLE_NEXT_LINE) === true) {
32
+ return {};
33
+ }
42
34
 
43
- if (!firstLine.startsWith('//')) {
44
- context.report({
45
- loc: {
46
- start: {
47
- line: 0,
48
- column: 0,
49
- },
50
- end: {
51
- line: 0,
52
- column: 1,
53
- },
35
+ if (!firstLine.startsWith('//')) {
36
+ if (firstLine.startsWith('/*')) {
37
+ context.report({
38
+ loc: {
39
+ start: {
40
+ line: 0,
41
+ column: 0,
54
42
  },
55
- messageId: VALIDATE_FIRST_LINE_PATH,
56
- data: { firstLine },
57
- fix(fixer) {
58
- return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}\n\n`);
43
+ end: {
44
+ line: 0,
45
+ column: 1,
59
46
  },
60
- });
61
- } else {
62
- const actualComment = firstLine.split('// ')[1];
63
-
64
- if (actualComment?.startsWith(DISABLE_NEXT_LINE) === true && actualComment.endsWith(DISABLED_RULE)) {
65
- return;
66
- }
47
+ },
48
+ message: 'first line cannot be a block comment',
49
+ fix(fixer: Rule.RuleFixer) {
50
+ return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}\n\n`);
51
+ },
52
+ });
53
+ } else {
54
+ context.report({
55
+ loc: {
56
+ start: {
57
+ line: 0,
58
+ column: 0,
59
+ },
60
+ end: {
61
+ line: 0,
62
+ column: 1,
63
+ },
64
+ },
65
+ message: 'first line is not a comment with the file path',
66
+ fix(fixer: Rule.RuleFixer) {
67
+ return fixer.insertTextBeforeRange([0, 0], `// ${expectedPath}\n\n`);
68
+ },
69
+ });
70
+ }
71
+ } else {
72
+ const actualComment = firstLine.split('// ')[1];
73
+ if (expectedPath !== actualComment) {
74
+ context.report({
75
+ loc: {
76
+ start: {
77
+ line: 0,
78
+ column: 0,
79
+ },
80
+ end: {
81
+ line: 0,
82
+ column: 1,
83
+ },
84
+ },
85
+ message: 'first line is a comment but is not a path to the file',
86
+ fix(fixer: Rule.RuleFixer) {
87
+ return fixer.replaceTextRange([0, firstLine.length], `// ${expectedPath}`);
88
+ },
89
+ });
90
+ }
91
+ }
67
92
 
68
- if (expectedPath !== actualComment) {
69
- context.report({
70
- loc: {
71
- start: {
72
- line: 0,
73
- column: 0,
74
- },
75
- end: {
76
- line: 0,
77
- column: 1,
78
- },
79
- },
80
- messageId: VALIDATE_FIRST_LINE_PATH,
81
- data: { firstLine },
82
- fix(fixer) {
83
- return fixer.replaceTextRange([0, firstLine.length], `// ${expectedPath}`);
84
- },
85
- });
86
- }
87
- }
88
- },
89
- };
93
+ return {};
90
94
  },
91
- });
92
-
93
- export default rule;
95
+ } as Rule.RuleModule;
package/src/index.ts CHANGED
@@ -32,7 +32,7 @@ import noEnum from './no-enum.ts';
32
32
  import noSideEffects from './no-side-effects.ts';
33
33
  import noRandomV4UUID from './no-random-v4-uuid.ts';
34
34
  import noTestImport from './no-test-import.ts';
35
- import noUtil from './no-util';
35
+ import noUtil from './no-util.ts';
36
36
  import noUuid from './no-uuid.ts';
37
37
  import noWallabyComment from './no-wallaby-comment.ts';
38
38
  import objectLiteralResponse from './object-literal-response.ts';
package/src/no-util.ts CHANGED
@@ -8,12 +8,12 @@
8
8
 
9
9
  import { ESLintUtils } from '@typescript-eslint/utils';
10
10
 
11
- export const ruleId = 'no-util-filename';
12
- const NO_UTIL_FILENAME = 'NO_UTIL_FILENAME';
11
+ export const ruleId = 'no-util';
12
+ const NO_UTIL = 'NO_UTIL';
13
13
 
14
14
  const createRule = ESLintUtils.RuleCreator((name) => name);
15
15
 
16
- const rule: ESLintUtils.RuleModule<typeof NO_UTIL_FILENAME> = createRule({
16
+ const rule: ESLintUtils.RuleModule<typeof NO_UTIL> = createRule({
17
17
  name: ruleId,
18
18
  meta: {
19
19
  type: 'problem',
@@ -22,7 +22,7 @@ const rule: ESLintUtils.RuleModule<typeof NO_UTIL_FILENAME> = createRule({
22
22
  },
23
23
  schema: [],
24
24
  messages: {
25
- [NO_UTIL_FILENAME]: "File name '{{filename}}' contains banned 'util' pattern.",
25
+ [NO_UTIL]: "File name '{{filename}}' contains banned 'util' pattern.",
26
26
  },
27
27
  },
28
28
  defaultOptions: [],
@@ -33,17 +33,11 @@ const rule: ESLintUtils.RuleModule<typeof NO_UTIL_FILENAME> = createRule({
33
33
  const utilRegex = /(?:^|[-_/])util(?=[-_./]|$)/iu;
34
34
  if (utilRegex.test(filename)) {
35
35
  context.report({
36
- messageId: NO_UTIL_FILENAME,
36
+ messageId: NO_UTIL,
37
37
  data: { filename },
38
38
  loc: {
39
- start: {
40
- line: 0,
41
- column: 0,
42
- },
43
- end: {
44
- line: 0,
45
- column: 1,
46
- },
39
+ start: { line: 0, column: 0 },
40
+ end: { line: 0, column: 1 },
47
41
  },
48
42
  });
49
43
  }