@checkdigit/eslint-plugin 7.8.0-PR.97-6514 → 7.9.0-PR.79-6752

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,6 +21,7 @@ Copyright (c) 2021-2024 [Check Digit, LLC](https://checkdigit.com)
21
21
  - `@checkdigit/require-resolve-full-response`
22
22
  - `@checkdigit/require-type-out-of-type-only-imports`
23
23
  - `@checkdigit/require-ts-extension-imports`
24
+ - `@checkdigit/no-enum`
24
25
 
25
26
  ## Configurations
26
27
 
@@ -3,7 +3,6 @@ import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from "./in
3
3
  import noDuplicatedImports, { ruleId as noDuplicatedImportsRuleId } from "./no-duplicated-imports.mjs";
4
4
  import noLegacyServiceTyping, { ruleId as noLegacyServiceTypingRuleId } from "./no-legacy-service-typing.mjs";
5
5
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from "./no-promise-instance-method.mjs";
6
- import noStatusCodeAssert from "./no-status-code-assert.mjs";
7
6
  import requireFixedServicesImport, {
8
7
  ruleId as requireFixedServicesImportRuleId
9
8
  } from "./require-fixed-services-import.mjs";
@@ -16,6 +15,7 @@ import requireTypeOutOfTypeOnlyImports, {
16
15
  import noServeRuntime, { ruleId as noServeRuntimeRuleId } from "./no-serve-runtime.mjs";
17
16
  import filePathComment from "./file-path-comment.mjs";
18
17
  import noCardNumbers from "./no-card-numbers.mjs";
18
+ import noEnum from "./no-enum.mjs";
19
19
  import noSideEffects from "./no-side-effects.mjs";
20
20
  import noRandomV4UUID from "./no-random-v4-uuid.mjs";
21
21
  import noTestImport from "./no-test-import.mjs";
@@ -25,15 +25,15 @@ import objectLiteralResponse from "./object-literal-response.mjs";
25
25
  import regexComment from "./regular-expression-comment.mjs";
26
26
  import requireAssertPredicateRejectsThrows from "./require-assert-predicate-rejects-throws.mjs";
27
27
  import requireStrictAssert from "./require-strict-assert.mjs";
28
- import requireTsExtensionImports from "./require-ts-extension-imports.mjs";
28
+ import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
29
29
  var rules = {
30
30
  "file-path-comment": filePathComment,
31
31
  "no-card-numbers": noCardNumbers,
32
+ "no-enum": noEnum,
32
33
  "no-random-v4-uuid": noRandomV4UUID,
33
- "no-status-code-assert": noStatusCodeAssert,
34
34
  "no-uuid": noUuid,
35
35
  "require-strict-assert": requireStrictAssert,
36
- "require-ts-extension-imports": requireTsExtensionImports,
36
+ "require-ts-extension-imports-exports": requireTsExtensionImportsExports,
37
37
  "no-test-import": noTestImport,
38
38
  "no-wallaby-comment": noWallabyComment,
39
39
  "no-side-effects": noSideEffects,
@@ -61,12 +61,12 @@ var configs = {
61
61
  },
62
62
  rules: {
63
63
  "@checkdigit/no-card-numbers": "error",
64
+ "@checkdigit/no-enum": "error",
64
65
  "@checkdigit/file-path-comment": "error",
65
66
  "@checkdigit/no-random-v4-uuid": "error",
66
- "@checkdigit/no-status-code-assert": "error",
67
67
  "@checkdigit/no-uuid": "error",
68
68
  "@checkdigit/require-strict-assert": "error",
69
- "@checkdigit/require-ts-extension-imports": "error",
69
+ "@checkdigit/require-ts-extension-imports-exports": "error",
70
70
  "@checkdigit/no-wallaby-comment": "error",
71
71
  "@checkdigit/no-side-effects": [
72
72
  "error",
@@ -95,12 +95,12 @@ var configs = {
95
95
  },
96
96
  rules: {
97
97
  "@checkdigit/no-card-numbers": "error",
98
+ "@checkdigit/no-enum": "error",
98
99
  "@checkdigit/file-path-comment": "off",
99
100
  "@checkdigit/no-random-v4-uuid": "error",
100
- "@checkdigit/no-status-code-assert": "error",
101
101
  "@checkdigit/no-uuid": "error",
102
102
  "@checkdigit/require-strict-assert": "error",
103
- "@checkdigit/require-ts-extension-imports": "error",
103
+ "@checkdigit/require-ts-extension-imports-exports": "error",
104
104
  "@checkdigit/no-wallaby-comment": "off",
105
105
  "@checkdigit/no-side-effects": "error",
106
106
  "@checkdigit/regular-expression-comment": "error",
@@ -127,4 +127,4 @@ var src_default = defaultToExport;
127
127
  export {
128
128
  src_default as default
129
129
  };
130
- //# sourceMappingURL=data:application/json;base64,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
130
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVVBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sdUJBQXVCLFVBQVUsaUNBQWlDO0FBQ3pFLE9BQU8seUJBQXlCLFVBQVUsbUNBQW1DO0FBQzdFLE9BQU8sMkJBQTJCLFVBQVUscUNBQXFDO0FBQ2pGLE9BQU87QUFBQSxFQUNMLFVBQVU7QUFBQSxPQUNMO0FBQ1AsT0FBTztBQUFBLEVBQ0wsVUFBVTtBQUFBLE9BQ0w7QUFDUCxPQUFPO0FBQUEsRUFDTCxVQUFVO0FBQUEsT0FDTDtBQUNQLE9BQU8sa0JBQWtCLFVBQVUsNEJBQTRCO0FBQy9ELE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sbUJBQW1CO0FBQzFCLE9BQU8sWUFBWTtBQUNuQixPQUFPLG1CQUFtQjtBQUMxQixPQUFPLG9CQUFvQjtBQUMzQixPQUFPLGtCQUFrQjtBQUN6QixPQUFPLFlBQVk7QUFDbkIsT0FBTyxzQkFBc0I7QUFDN0IsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyxrQkFBa0I7QUFDekIsT0FBTyx5Q0FBeUM7QUFDaEQsT0FBTyx5QkFBeUI7QUFDaEMsT0FBTyxzQ0FBc0M7QUFFN0MsSUFBTSxRQUFzRDtBQUFBLEVBQzFELHFCQUFxQjtBQUFBLEVBQ3JCLG1CQUFtQjtBQUFBLEVBQ25CLFdBQVc7QUFBQSxFQUNYLHFCQUFxQjtBQUFBLEVBQ3JCLFdBQVc7QUFBQSxFQUNYLHlCQUF5QjtBQUFBLEVBQ3pCLHdDQUF3QztBQUFBLEVBQ3hDLGtCQUFrQjtBQUFBLEVBQ2xCLHNCQUFzQjtBQUFBLEVBQ3RCLG1CQUFtQjtBQUFBLEVBQ25CLDhCQUE4QjtBQUFBLEVBQzlCLDJDQUEyQztBQUFBLEVBQzNDLDJCQUEyQjtBQUFBLEVBQzNCLENBQUMsMEJBQTBCLEdBQUc7QUFBQSxFQUM5QixDQUFDLDZCQUE2QixHQUFHO0FBQUEsRUFDakMsQ0FBQywyQkFBMkIsR0FBRztBQUFBLEVBQy9CLENBQUMsZ0NBQWdDLEdBQUc7QUFBQSxFQUNwQyxDQUFDLHlCQUF5QixHQUFHO0FBQUEsRUFDN0IsQ0FBQyxvQkFBb0IsR0FBRztBQUFBLEVBQ3hCLENBQUMsZ0NBQWdDLEdBQUc7QUFBQSxFQUNwQyxDQUFDLHFDQUFxQyxHQUFHO0FBQzNDO0FBRUEsSUFBTSxTQUFxQztBQUFBLEVBQ3pDO0FBQ0Y7QUFFQSxJQUFNLFVBQXdEO0FBQUEsRUFDNUQsS0FBSztBQUFBLElBQ0g7QUFBQSxNQUNFLE9BQU8sQ0FBQyxTQUFTO0FBQUEsTUFDakIsU0FBUztBQUFBLFFBQ1AsZUFBZTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCwrQkFBK0I7QUFBQSxRQUMvQix1QkFBdUI7QUFBQSxRQUN2QixpQ0FBaUM7QUFBQSxRQUNqQyxpQ0FBaUM7QUFBQSxRQUNqQyx1QkFBdUI7QUFBQSxRQUN2QixxQ0FBcUM7QUFBQSxRQUNyQyxvREFBb0Q7QUFBQSxRQUNwRCxrQ0FBa0M7QUFBQSxRQUNsQywrQkFBK0I7QUFBQSxVQUM3QjtBQUFBLFVBQ0EsRUFBRSxxQkFBcUIsQ0FBQyxVQUFVLFNBQVMsT0FBTyxhQUFhLFlBQVksRUFBRTtBQUFBLFFBQy9FO0FBQUEsUUFDQSwwQ0FBMEM7QUFBQSxRQUMxQyx1REFBdUQ7QUFBQSxRQUN2RCx1Q0FBdUM7QUFBQSxRQUN2Qyw4QkFBOEI7QUFBQSxRQUM5QixDQUFDLGVBQWUsMEJBQTBCLEVBQUUsR0FBRztBQUFBLFFBQy9DLENBQUMsZUFBZSw2QkFBNkIsRUFBRSxHQUFHO0FBQUEsUUFDbEQsQ0FBQyxlQUFlLDJCQUEyQixFQUFFLEdBQUc7QUFBQSxRQUNoRCxDQUFDLGVBQWUsZ0NBQWdDLEVBQUUsR0FBRztBQUFBLFFBQ3JELENBQUMsZUFBZSx5QkFBeUIsRUFBRSxHQUFHO0FBQUEsUUFDOUMsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxRQUNyRCxDQUFDLGVBQWUscUNBQXFDLEVBQUUsR0FBRztBQUFBLFFBQzFELENBQUMsZUFBZSxvQkFBb0IsRUFBRSxHQUFHO0FBQUEsTUFDM0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsYUFBYTtBQUFBLElBQ1g7QUFBQSxNQUNFLE9BQU8sQ0FBQyxTQUFTO0FBQUEsTUFDakIsU0FBUztBQUFBLFFBQ1AsZUFBZTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCwrQkFBK0I7QUFBQSxRQUMvQix1QkFBdUI7QUFBQSxRQUN2QixpQ0FBaUM7QUFBQSxRQUNqQyxpQ0FBaUM7QUFBQSxRQUNqQyx1QkFBdUI7QUFBQSxRQUN2QixxQ0FBcUM7QUFBQSxRQUNyQyxvREFBb0Q7QUFBQSxRQUNwRCxrQ0FBa0M7QUFBQSxRQUNsQywrQkFBK0I7QUFBQSxRQUMvQiwwQ0FBMEM7QUFBQSxRQUMxQyx1REFBdUQ7QUFBQSxRQUN2RCx1Q0FBdUM7QUFBQSxRQUN2Qyw4QkFBOEI7QUFBQSxRQUM5QixDQUFDLGVBQWUsMEJBQTBCLEVBQUUsR0FBRztBQUFBLFFBQy9DLENBQUMsZUFBZSw2QkFBNkIsRUFBRSxHQUFHO0FBQUEsUUFDbEQsQ0FBQyxlQUFlLDJCQUEyQixFQUFFLEdBQUc7QUFBQSxRQUNoRCxDQUFDLGVBQWUsZ0NBQWdDLEVBQUUsR0FBRztBQUFBLFFBQ3JELENBQUMsZUFBZSx5QkFBeUIsRUFBRSxHQUFHO0FBQUEsUUFDOUMsQ0FBQyxlQUFlLGdDQUFnQyxFQUFFLEdBQUc7QUFBQSxRQUNyRCxDQUFDLGVBQWUscUNBQXFDLEVBQUUsR0FBRztBQUFBLFFBQzFELENBQUMsZUFBZSxvQkFBb0IsRUFBRSxHQUFHO0FBQUEsTUFDM0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxrQkFFRjtBQUFBLEVBQ0YsR0FBRztBQUFBLEVBQ0g7QUFDRjtBQUNBLElBQU8sY0FBUTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,35 @@
1
+ // src/no-enum.ts
2
+ import { ESLintUtils } from "@typescript-eslint/utils";
3
+ var ruleId = "no-enum";
4
+ var NO_ENUM = "NO_ENUM";
5
+ var createRule = ESLintUtils.RuleCreator((name) => name);
6
+ var rule = createRule({
7
+ name: ruleId,
8
+ meta: {
9
+ type: "problem",
10
+ docs: {
11
+ description: "Disallow the use of `enum` in TypeScript"
12
+ },
13
+ schema: [],
14
+ messages: {
15
+ [NO_ENUM]: "Avoid using `enum` in TypeScript."
16
+ }
17
+ },
18
+ defaultOptions: [],
19
+ create(context) {
20
+ return {
21
+ TSEnumDeclaration(node) {
22
+ context.report({
23
+ node,
24
+ messageId: NO_ENUM
25
+ });
26
+ }
27
+ };
28
+ }
29
+ });
30
+ var no_enum_default = rule;
31
+ export {
32
+ no_enum_default as default,
33
+ ruleId
34
+ };
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLWVudW0udHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsU0FBUyxtQkFBNkI7QUFFL0IsSUFBTSxTQUFTO0FBQ3RCLElBQU0sVUFBVTtBQUVoQixJQUFNLGFBQWEsWUFBWSxZQUFZLENBQUMsU0FBUyxJQUFJO0FBRXpELElBQU0sT0FBK0MsV0FBVztBQUFBLEVBQzlELE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLENBQUMsT0FBTyxHQUFHO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGdCQUFnQixDQUFDO0FBQUEsRUFDakIsT0FBTyxTQUFTO0FBQ2QsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLE1BQWtDO0FBQ2xELGdCQUFRLE9BQU87QUFBQSxVQUNiO0FBQUEsVUFDQSxXQUFXO0FBQUEsUUFDYixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sa0JBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,72 @@
1
+ // src/require-ts-extension-imports-exports.ts
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { ESLintUtils } from "@typescript-eslint/utils";
5
+ import { TSESTree } from "@typescript-eslint/types";
6
+ import getDocumentationUrl from "./get-documentation-url.mjs";
7
+ var ruleId = "require-ts-extension-imports-exports";
8
+ var REQUIRE_TS_EXTENSION_IMPORTS = "REQUIRE-TS-EXTENSION-IMPORTS";
9
+ var REQUIRE_TS_EXTENSION_EXPORTS = "REQUIRE-TS-EXTENSION-EXPORTS";
10
+ var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
11
+ var checkPath = (filename, filePath) => {
12
+ if (filePath.startsWith(".") && !filePath.endsWith(".ts") && !filePath.endsWith(".json")) {
13
+ const absolutePath = path.resolve(path.dirname(filename), filePath);
14
+ const tsPath = `${absolutePath}.ts`;
15
+ const existsPath = [absolutePath, tsPath].find(fs.existsSync);
16
+ if (existsPath !== void 0) {
17
+ const stats = fs.statSync(existsPath);
18
+ const isDirectory = stats.isDirectory();
19
+ const fixedPath = isDirectory ? `${filePath}/index.ts` : `${filePath}.ts`;
20
+ return { fixedPath, isFixNeeded: true };
21
+ }
22
+ }
23
+ return { fixedPath: null, isFixNeeded: false };
24
+ };
25
+ var rule = createRule({
26
+ name: ruleId,
27
+ meta: {
28
+ type: "suggestion",
29
+ docs: {
30
+ description: "Ensure .ts extension is at the end of all imports and exports"
31
+ },
32
+ fixable: "code",
33
+ schema: [],
34
+ messages: {
35
+ [REQUIRE_TS_EXTENSION_IMPORTS]: "Import paths should end with .ts extension",
36
+ [REQUIRE_TS_EXTENSION_EXPORTS]: "Export paths should end with .ts extension"
37
+ }
38
+ },
39
+ defaultOptions: [],
40
+ create(context) {
41
+ const filename = context.filename;
42
+ const handleDeclaration = (node) => {
43
+ if (node.source !== null) {
44
+ const importPath = node.source.value;
45
+ const { fixedPath, isFixNeeded } = checkPath(filename, importPath);
46
+ if (isFixNeeded && fixedPath !== null) {
47
+ context.report({
48
+ loc: node.source.loc,
49
+ messageId: node.type === TSESTree.AST_NODE_TYPES.ImportDeclaration ? REQUIRE_TS_EXTENSION_IMPORTS : REQUIRE_TS_EXTENSION_EXPORTS,
50
+ *fix(fixer) {
51
+ yield fixer.replaceText(node.source, `'${fixedPath}'`);
52
+ }
53
+ });
54
+ }
55
+ }
56
+ };
57
+ return {
58
+ ImportDeclaration(node) {
59
+ handleDeclaration(node);
60
+ },
61
+ ExportNamedDeclaration(node) {
62
+ handleDeclaration(node);
63
+ }
64
+ };
65
+ }
66
+ });
67
+ var require_ts_extension_imports_exports_default = rule;
68
+ export {
69
+ require_ts_extension_imports_exports_default as default,
70
+ ruleId
71
+ };
72
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtdHMtZXh0ZW5zaW9uLWltcG9ydHMtZXhwb3J0cy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxPQUFPLFVBQVU7QUFDakIsT0FBTyxRQUFRO0FBQ2YsU0FBUyxtQkFBNkI7QUFDdEMsU0FBUyxnQkFBZ0I7QUFDekIsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBQ3RCLElBQU0sK0JBQStCO0FBQ3JDLElBQU0sK0JBQStCO0FBRXJDLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFFOUUsSUFBTSxZQUFZLENBQUMsVUFBa0IsYUFBeUU7QUFDNUcsTUFBSSxTQUFTLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxTQUFTLEtBQUssS0FBSyxDQUFDLFNBQVMsU0FBUyxPQUFPLEdBQUc7QUFDeEYsVUFBTSxlQUFlLEtBQUssUUFBUSxLQUFLLFFBQVEsUUFBUSxHQUFHLFFBQVE7QUFDbEUsVUFBTSxTQUFTLEdBQUcsWUFBWTtBQUM5QixVQUFNLGFBQWEsQ0FBQyxjQUFjLE1BQU0sRUFBRSxLQUFLLEdBQUcsVUFBVTtBQUM1RCxRQUFJLGVBQWUsUUFBVztBQUM1QixZQUFNLFFBQVEsR0FBRyxTQUFTLFVBQVU7QUFDcEMsWUFBTSxjQUFjLE1BQU0sWUFBWTtBQUN0QyxZQUFNLFlBQVksY0FBYyxHQUFHLFFBQVEsY0FBYyxHQUFHLFFBQVE7QUFDcEUsYUFBTyxFQUFFLFdBQVcsYUFBYSxLQUFLO0FBQUEsSUFDeEM7QUFBQSxFQUNGO0FBQ0EsU0FBTyxFQUFFLFdBQVcsTUFBTSxhQUFhLE1BQU07QUFDL0M7QUFFQSxJQUFNLE9BQStDLFdBQVc7QUFBQSxFQUM5RCxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixDQUFDLDRCQUE0QixHQUFHO0FBQUEsTUFDaEMsQ0FBQyw0QkFBNEIsR0FBRztBQUFBLElBQ2xDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxVQUFNLFdBQVcsUUFBUTtBQUV6QixVQUFNLG9CQUFvQixDQUFDLFNBQXVFO0FBQ2hHLFVBQUksS0FBSyxXQUFXLE1BQU07QUFDeEIsY0FBTSxhQUFhLEtBQUssT0FBTztBQUMvQixjQUFNLEVBQUUsV0FBVyxZQUFZLElBQUksVUFBVSxVQUFVLFVBQVU7QUFDakUsWUFBSSxlQUFlLGNBQWMsTUFBTTtBQUNyQyxrQkFBUSxPQUFPO0FBQUEsWUFDYixLQUFLLEtBQUssT0FBTztBQUFBLFlBQ2pCLFdBQ0UsS0FBSyxTQUFTLFNBQVMsZUFBZSxvQkFDbEMsK0JBQ0E7QUFBQSxZQUNOLENBQUMsSUFBSSxPQUFPO0FBQ1Ysb0JBQU0sTUFBTSxZQUFZLEtBQUssUUFBUSxJQUFJLFNBQVMsR0FBRztBQUFBLFlBQ3ZEO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLE1BQU07QUFDdEIsMEJBQWtCLElBQUk7QUFBQSxNQUN4QjtBQUFBLE1BQ0EsdUJBQXVCLE1BQU07QUFDM0IsMEJBQWtCLElBQUk7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sK0NBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const ruleId = "no-enum";
3
+ declare const NO_ENUM = "NO_ENUM";
4
+ declare const rule: ESLintUtils.RuleModule<typeof NO_ENUM>;
5
+ export default rule;
@@ -0,0 +1,4 @@
1
+ import { TSESLint } from '@typescript-eslint/utils';
2
+ export declare const ruleId = "require-ts-extension-imports-exports";
3
+ declare const rule: TSESLint.RuleModule<string, unknown[]>;
4
+ export default rule;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/eslint-plugin","version":"7.8.0-PR.97-6514","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.18.1","@typescript-eslint/utils":"^8.18.1","http-status-codes":"^2.3.0","ts-api-utils":"^2.0.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.0.0","@checkdigit/typescript-config":"^9.0.0","@eslint/js":"^9.17.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/rule-tester":"^8.18.1","eslint":"^9.17.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.7.0","eslint-plugin-eslint-plugin":"^6.3.2","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.1.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","rimraf":"^6.0.1","typescript-eslint":"^8.18.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=20.17"}}
1
+ {"name":"@checkdigit/eslint-plugin","version":"7.9.0-PR.79-6752","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.18.1","@typescript-eslint/utils":"^8.18.1","ts-api-utils":"^2.0.0"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^6.0.0","@checkdigit/typescript-config":"^9.0.0","@eslint/js":"^9.17.0","@types/eslint":"^9.6.1","@types/eslint-config-prettier":"^6.11.3","@typescript-eslint/parser":"^8.18.1","@typescript-eslint/rule-tester":"^8.18.1","eslint":"^9.17.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.7.0","eslint-plugin-eslint-plugin":"^6.3.2","eslint-plugin-import":"^2.31.0","eslint-plugin-no-only-tests":"^3.3.0","eslint-plugin-no-secrets":"^2.1.1","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"1.0.4","http-status-codes":"^2.3.0","rimraf":"^6.0.1","typescript-eslint":"^8.18.1"},"peerDependencies":{"eslint":">=9 <10"},"engines":{"node":">=20.17"}}
package/src/index.ts CHANGED
@@ -12,7 +12,6 @@ import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './in
12
12
  import noDuplicatedImports, { ruleId as noDuplicatedImportsRuleId } from './no-duplicated-imports.ts';
13
13
  import noLegacyServiceTyping, { ruleId as noLegacyServiceTypingRuleId } from './no-legacy-service-typing.ts';
14
14
  import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method.ts';
15
- import noStatusCodeAssert from './no-status-code-assert.ts';
16
15
  import requireFixedServicesImport, {
17
16
  ruleId as requireFixedServicesImportRuleId,
18
17
  } from './require-fixed-services-import.ts';
@@ -25,6 +24,7 @@ import requireTypeOutOfTypeOnlyImports, {
25
24
  import noServeRuntime, { ruleId as noServeRuntimeRuleId } from './no-serve-runtime.ts';
26
25
  import filePathComment from './file-path-comment.ts';
27
26
  import noCardNumbers from './no-card-numbers.ts';
27
+ import noEnum from './no-enum.ts';
28
28
  import noSideEffects from './no-side-effects.ts';
29
29
  import noRandomV4UUID from './no-random-v4-uuid.ts';
30
30
  import noTestImport from './no-test-import.ts';
@@ -34,16 +34,16 @@ import objectLiteralResponse from './object-literal-response.ts';
34
34
  import regexComment from './regular-expression-comment.ts';
35
35
  import requireAssertPredicateRejectsThrows from './require-assert-predicate-rejects-throws.ts';
36
36
  import requireStrictAssert from './require-strict-assert.ts';
37
- import requireTsExtensionImports from './require-ts-extension-imports';
37
+ import requireTsExtensionImportsExports from './require-ts-extension-imports-exports.ts';
38
38
 
39
39
  const rules: Record<string, TSESLint.LooseRuleDefinition> = {
40
40
  'file-path-comment': filePathComment,
41
41
  'no-card-numbers': noCardNumbers,
42
+ 'no-enum': noEnum,
42
43
  'no-random-v4-uuid': noRandomV4UUID,
43
- 'no-status-code-assert': noStatusCodeAssert,
44
44
  'no-uuid': noUuid,
45
45
  'require-strict-assert': requireStrictAssert,
46
- 'require-ts-extension-imports': requireTsExtensionImports,
46
+ 'require-ts-extension-imports-exports': requireTsExtensionImportsExports,
47
47
  'no-test-import': noTestImport,
48
48
  'no-wallaby-comment': noWallabyComment,
49
49
  'no-side-effects': noSideEffects,
@@ -73,12 +73,12 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
73
73
  },
74
74
  rules: {
75
75
  '@checkdigit/no-card-numbers': 'error',
76
+ '@checkdigit/no-enum': 'error',
76
77
  '@checkdigit/file-path-comment': 'error',
77
78
  '@checkdigit/no-random-v4-uuid': 'error',
78
- '@checkdigit/no-status-code-assert': 'error',
79
79
  '@checkdigit/no-uuid': 'error',
80
80
  '@checkdigit/require-strict-assert': 'error',
81
- '@checkdigit/require-ts-extension-imports': 'error',
81
+ '@checkdigit/require-ts-extension-imports-exports': 'error',
82
82
  '@checkdigit/no-wallaby-comment': 'error',
83
83
  '@checkdigit/no-side-effects': [
84
84
  'error',
@@ -107,12 +107,12 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
107
107
  },
108
108
  rules: {
109
109
  '@checkdigit/no-card-numbers': 'error',
110
+ '@checkdigit/no-enum': 'error',
110
111
  '@checkdigit/file-path-comment': 'off',
111
112
  '@checkdigit/no-random-v4-uuid': 'error',
112
- '@checkdigit/no-status-code-assert': 'error',
113
113
  '@checkdigit/no-uuid': 'error',
114
114
  '@checkdigit/require-strict-assert': 'error',
115
- '@checkdigit/require-ts-extension-imports': 'error',
115
+ '@checkdigit/require-ts-extension-imports-exports': 'error',
116
116
  '@checkdigit/no-wallaby-comment': 'off',
117
117
  '@checkdigit/no-side-effects': 'error',
118
118
  '@checkdigit/regular-expression-comment': 'error',
package/src/no-enum.ts ADDED
@@ -0,0 +1,41 @@
1
+ // no-enum.ts
2
+
3
+ /*
4
+ * Copyright (c) 2021-2025 Check Digit, LLC
5
+ *
6
+ * This code is licensed under the MIT license (see LICENSE.txt for details).
7
+ */
8
+
9
+ import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
10
+
11
+ export const ruleId = 'no-enum';
12
+ const NO_ENUM = 'NO_ENUM';
13
+
14
+ const createRule = ESLintUtils.RuleCreator((name) => name);
15
+
16
+ const rule: ESLintUtils.RuleModule<typeof NO_ENUM> = createRule({
17
+ name: ruleId,
18
+ meta: {
19
+ type: 'problem',
20
+ docs: {
21
+ description: 'Disallow the use of `enum` in TypeScript',
22
+ },
23
+ schema: [],
24
+ messages: {
25
+ [NO_ENUM]: 'Avoid using `enum` in TypeScript.',
26
+ },
27
+ },
28
+ defaultOptions: [],
29
+ create(context) {
30
+ return {
31
+ TSEnumDeclaration(node: TSESTree.TSEnumDeclaration) {
32
+ context.report({
33
+ node,
34
+ messageId: NO_ENUM,
35
+ });
36
+ },
37
+ };
38
+ },
39
+ });
40
+
41
+ export default rule;
@@ -0,0 +1,84 @@
1
+ // require-ts-extension-imports-exports.ts
2
+
3
+ /*
4
+ * Copyright (c) 2022-2025 Check Digit, LLC
5
+ *
6
+ * This code is licensed under the MIT license (see LICENSE.txt for details).
7
+ */
8
+
9
+ import path from 'path';
10
+ import fs from 'fs';
11
+ import { ESLintUtils, TSESLint } from '@typescript-eslint/utils';
12
+ import { TSESTree } from '@typescript-eslint/types';
13
+ import getDocumentationUrl from './get-documentation-url.ts';
14
+
15
+ export const ruleId = 'require-ts-extension-imports-exports';
16
+ const REQUIRE_TS_EXTENSION_IMPORTS = 'REQUIRE-TS-EXTENSION-IMPORTS';
17
+ const REQUIRE_TS_EXTENSION_EXPORTS = 'REQUIRE-TS-EXTENSION-EXPORTS';
18
+
19
+ const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
20
+
21
+ const checkPath = (filename: string, filePath: string): { fixedPath: string | null; isFixNeeded: boolean } => {
22
+ if (filePath.startsWith('.') && !filePath.endsWith('.ts') && !filePath.endsWith('.json')) {
23
+ const absolutePath = path.resolve(path.dirname(filename), filePath);
24
+ const tsPath = `${absolutePath}.ts`;
25
+ const existsPath = [absolutePath, tsPath].find(fs.existsSync);
26
+ if (existsPath !== undefined) {
27
+ const stats = fs.statSync(existsPath);
28
+ const isDirectory = stats.isDirectory();
29
+ const fixedPath = isDirectory ? `${filePath}/index.ts` : `${filePath}.ts`;
30
+ return { fixedPath, isFixNeeded: true };
31
+ }
32
+ }
33
+ return { fixedPath: null, isFixNeeded: false };
34
+ };
35
+
36
+ const rule: TSESLint.RuleModule<string, unknown[]> = createRule({
37
+ name: ruleId,
38
+ meta: {
39
+ type: 'suggestion',
40
+ docs: {
41
+ description: 'Ensure .ts extension is at the end of all imports and exports',
42
+ },
43
+ fixable: 'code',
44
+ schema: [],
45
+ messages: {
46
+ [REQUIRE_TS_EXTENSION_IMPORTS]: 'Import paths should end with .ts extension',
47
+ [REQUIRE_TS_EXTENSION_EXPORTS]: 'Export paths should end with .ts extension',
48
+ },
49
+ },
50
+ defaultOptions: [],
51
+ create(context) {
52
+ const filename = context.filename;
53
+
54
+ const handleDeclaration = (node: TSESTree.ImportDeclaration | TSESTree.ExportNamedDeclaration) => {
55
+ if (node.source !== null) {
56
+ const importPath = node.source.value;
57
+ const { fixedPath, isFixNeeded } = checkPath(filename, importPath);
58
+ if (isFixNeeded && fixedPath !== null) {
59
+ context.report({
60
+ loc: node.source.loc,
61
+ messageId:
62
+ node.type === TSESTree.AST_NODE_TYPES.ImportDeclaration
63
+ ? REQUIRE_TS_EXTENSION_IMPORTS
64
+ : REQUIRE_TS_EXTENSION_EXPORTS,
65
+ *fix(fixer) {
66
+ yield fixer.replaceText(node.source, `'${fixedPath}'`);
67
+ },
68
+ });
69
+ }
70
+ }
71
+ };
72
+
73
+ return {
74
+ ImportDeclaration(node) {
75
+ handleDeclaration(node);
76
+ },
77
+ ExportNamedDeclaration(node) {
78
+ handleDeclaration(node);
79
+ },
80
+ };
81
+ },
82
+ });
83
+
84
+ export default rule;
@@ -1,63 +0,0 @@
1
- // src/no-status-code-assert.ts
2
- import { StatusCodes } from "http-status-codes";
3
- import { AST_NODE_TYPES, ESLintUtils } from "@typescript-eslint/utils";
4
- import getDocumentationUrl from "./get-documentation-url.mjs";
5
- var ruleId = "no-status-code-assert";
6
- var NO_STATUS_CODE_ASSERT = "NO_STATUS_CODE_ASSERT";
7
- var createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
8
- var hasStatusCodeOrValue = (arg) => {
9
- switch (arg.type) {
10
- case AST_NODE_TYPES.MemberExpression: {
11
- const object = arg.object;
12
- const property = arg.property;
13
- if (object.type === AST_NODE_TYPES.Identifier && object.name === "StatusCodes" && property.type === AST_NODE_TYPES.Identifier) {
14
- return true;
15
- }
16
- break;
17
- }
18
- case AST_NODE_TYPES.Literal:
19
- if (typeof arg.value === "number" && Object.values(StatusCodes).includes(arg.value)) {
20
- return true;
21
- }
22
- break;
23
- case AST_NODE_TYPES.BinaryExpression:
24
- return hasStatusCodeOrValue(arg.left) || hasStatusCodeOrValue(arg.right);
25
- }
26
- return false;
27
- };
28
- var isAssertIdentifier = (node) => node.type === AST_NODE_TYPES.Identifier && node.name === "assert";
29
- var isAssertMemberExpression = (node) => node.type === AST_NODE_TYPES.MemberExpression && node.object.type === AST_NODE_TYPES.Identifier && node.object.name === "assert" && node.property.type === AST_NODE_TYPES.Identifier;
30
- var isAssertCallWithStatusCode = (callee, args) => (isAssertIdentifier(callee) || isAssertMemberExpression(callee)) && args.some((arg) => hasStatusCodeOrValue(arg));
31
- var rule = createRule({
32
- name: ruleId,
33
- meta: {
34
- type: "problem",
35
- docs: {
36
- description: "Disallow using status codes in assertions; use error handling instead"
37
- },
38
- schema: [],
39
- messages: {
40
- [NO_STATUS_CODE_ASSERT]: "Do not use status codes in assertions; use error handling instead"
41
- }
42
- },
43
- defaultOptions: [],
44
- create(context) {
45
- return {
46
- CallExpression(node) {
47
- const callee = node.callee;
48
- if (isAssertCallWithStatusCode(callee, node.arguments)) {
49
- context.report({
50
- node,
51
- messageId: NO_STATUS_CODE_ASSERT
52
- });
53
- }
54
- }
55
- };
56
- }
57
- });
58
- var no_status_code_assert_default = rule;
59
- export {
60
- no_status_code_assert_default as default,
61
- ruleId
62
- };
63
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLXN0YXR1cy1jb2RlLWFzc2VydC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGdCQUFnQixtQkFBdUM7QUFDaEUsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBQ3RCLElBQU0sd0JBQXdCO0FBRTlCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFHOUUsSUFBTSx1QkFBdUIsQ0FBQyxRQUFnQztBQUM1RCxVQUFRLElBQUksTUFBTTtBQUFBLElBQ2hCLEtBQUssZUFBZSxrQkFBa0I7QUFDcEMsWUFBTSxTQUFTLElBQUk7QUFDbkIsWUFBTSxXQUFXLElBQUk7QUFDckIsVUFDRSxPQUFPLFNBQVMsZUFBZSxjQUMvQixPQUFPLFNBQVMsaUJBQ2hCLFNBQVMsU0FBUyxlQUFlLFlBQ2pDO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssZUFBZTtBQUNsQixVQUFJLE9BQU8sSUFBSSxVQUFVLFlBQVksT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLElBQUksS0FBSyxHQUFHO0FBQ25GLGVBQU87QUFBQSxNQUNUO0FBQ0E7QUFBQSxJQUNGLEtBQUssZUFBZTtBQUNsQixhQUFPLHFCQUFxQixJQUFJLElBQUksS0FBSyxxQkFBcUIsSUFBSSxLQUFLO0FBQUEsRUFDM0U7QUFDQSxTQUFPO0FBQ1Q7QUFHQSxJQUFNLHFCQUFxQixDQUFDLFNBQzFCLEtBQUssU0FBUyxlQUFlLGNBQWMsS0FBSyxTQUFTO0FBRzNELElBQU0sMkJBQTJCLENBQUMsU0FDaEMsS0FBSyxTQUFTLGVBQWUsb0JBQzdCLEtBQUssT0FBTyxTQUFTLGVBQWUsY0FDcEMsS0FBSyxPQUFPLFNBQVMsWUFDckIsS0FBSyxTQUFTLFNBQVMsZUFBZTtBQUV4QyxJQUFNLDZCQUE2QixDQUFDLFFBQXVCLFVBQ3hELG1CQUFtQixNQUFNLEtBQUsseUJBQXlCLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQyxRQUFRLHFCQUFxQixHQUFHLENBQUM7QUFFbEgsSUFBTSxPQUEwRCxXQUFXO0FBQUEsRUFDekUsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLElBQ1QsVUFBVTtBQUFBLE1BQ1IsQ0FBQyxxQkFBcUIsR0FBRztBQUFBLElBQzNCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxlQUFlLE1BQStCO0FBQzVDLGNBQU0sU0FBUyxLQUFLO0FBQ3BCLFlBQUksMkJBQTJCLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDdEQsa0JBQVEsT0FBTztBQUFBLFlBQ2I7QUFBQSxZQUNBLFdBQVc7QUFBQSxVQUNiLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sZ0NBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,56 +0,0 @@
1
- // src/require-ts-extension-imports.ts
2
- import path from "path";
3
- import fs from "fs";
4
- import { ESLintUtils } from "@typescript-eslint/utils";
5
- import getDocumentationUrl from "./get-documentation-url.mjs";
6
- var ruleId = "require-ts-extension-imports";
7
- var REQUIRE_TS_EXTENSION_IMPORTS = "REQUIRE-TS-EXTENSION-IMPORTS";
8
- var createRule = ESLintUtils.RuleCreator(
9
- (name) => getDocumentationUrl(name)
10
- );
11
- var rule = createRule({
12
- name: ruleId,
13
- meta: {
14
- type: "suggestion",
15
- docs: {
16
- description: "Ensure .ts extension is at the end of all imports"
17
- },
18
- fixable: "code",
19
- schema: [],
20
- messages: {
21
- [REQUIRE_TS_EXTENSION_IMPORTS]: "Import paths should end with .ts extension"
22
- }
23
- },
24
- defaultOptions: [],
25
- create(context) {
26
- const filename = context.filename;
27
- return {
28
- ImportDeclaration(node) {
29
- const importPath = node.source.value;
30
- if (importPath.startsWith(".") && !importPath.endsWith(".ts") && !importPath.endsWith(".json")) {
31
- const absoluteImportPath = path.resolve(path.dirname(filename), importPath);
32
- const tsImportPath = `${absoluteImportPath}.ts`;
33
- const existsPath = [absoluteImportPath, tsImportPath].find(fs.existsSync);
34
- if (existsPath !== void 0) {
35
- const stats = fs.statSync(existsPath);
36
- const isDirectory = stats.isDirectory();
37
- const fixedPath = isDirectory ? `${importPath}/index.ts` : `${importPath}.ts`;
38
- context.report({
39
- loc: node.source.loc,
40
- messageId: REQUIRE_TS_EXTENSION_IMPORTS,
41
- *fix(fixer) {
42
- yield fixer.replaceText(node.source, `'${fixedPath}'`);
43
- }
44
- });
45
- }
46
- }
47
- }
48
- };
49
- }
50
- });
51
- var require_ts_extension_imports_default = rule;
52
- export {
53
- require_ts_extension_imports_default as default,
54
- ruleId
55
- };
56
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlcXVpcmUtdHMtZXh0ZW5zaW9uLWltcG9ydHMudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sUUFBUTtBQUNmLFNBQVMsbUJBQW1CO0FBQzVCLE9BQU8seUJBQXlCO0FBRXpCLElBQU0sU0FBUztBQUN0QixJQUFNLCtCQUErQjtBQUVyQyxJQUFNLGFBQXlELFlBQVk7QUFBQSxFQUFZLENBQUMsU0FDdEYsb0JBQW9CLElBQUk7QUFDMUI7QUFFQSxJQUFNLE9BQXNDLFdBQVc7QUFBQSxFQUNyRCxNQUFNO0FBQUEsRUFDTixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1QsUUFBUSxDQUFDO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixDQUFDLDRCQUE0QixHQUFHO0FBQUEsSUFDbEM7QUFBQSxFQUNGO0FBQUEsRUFDQSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ2pCLE9BQU8sU0FBUztBQUNkLFVBQU0sV0FBVyxRQUFRO0FBQ3pCLFdBQU87QUFBQSxNQUNMLGtCQUFrQixNQUFNO0FBQ3RCLGNBQU0sYUFBYSxLQUFLLE9BQU87QUFDL0IsWUFBSSxXQUFXLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxTQUFTLEtBQUssS0FBSyxDQUFDLFdBQVcsU0FBUyxPQUFPLEdBQUc7QUFDOUYsZ0JBQU0scUJBQXFCLEtBQUssUUFBUSxLQUFLLFFBQVEsUUFBUSxHQUFHLFVBQVU7QUFDMUUsZ0JBQU0sZUFBZSxHQUFHLGtCQUFrQjtBQUMxQyxnQkFBTSxhQUFhLENBQUMsb0JBQW9CLFlBQVksRUFBRSxLQUFLLEdBQUcsVUFBVTtBQUN4RSxjQUFJLGVBQWUsUUFBVztBQUM1QixrQkFBTSxRQUFRLEdBQUcsU0FBUyxVQUFVO0FBQ3BDLGtCQUFNLGNBQWMsTUFBTSxZQUFZO0FBQ3RDLGtCQUFNLFlBQVksY0FBYyxHQUFHLFVBQVUsY0FBYyxHQUFHLFVBQVU7QUFDeEUsb0JBQVEsT0FBTztBQUFBLGNBQ2IsS0FBSyxLQUFLLE9BQU87QUFBQSxjQUNqQixXQUFXO0FBQUEsY0FDWCxDQUFDLElBQUksT0FBTztBQUNWLHNCQUFNLE1BQU0sWUFBWSxLQUFLLFFBQVEsSUFBSSxTQUFTLEdBQUc7QUFBQSxjQUN2RDtBQUFBLFlBQ0YsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sdUNBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,5 +0,0 @@
1
- import { TSESLint } from '@typescript-eslint/utils';
2
- export declare const ruleId = "no-status-code-assert";
3
- declare const NO_STATUS_CODE_ASSERT = "NO_STATUS_CODE_ASSERT";
4
- declare const rule: TSESLint.RuleModule<typeof NO_STATUS_CODE_ASSERT>;
5
- export default rule;
@@ -1,5 +0,0 @@
1
- import { ESLintUtils } from '@typescript-eslint/utils';
2
- export declare const ruleId = "require-ts-extension-imports";
3
- declare const createRule: ReturnType<typeof ESLintUtils.RuleCreator>;
4
- declare const rule: ReturnType<typeof createRule>;
5
- export default rule;
@@ -1,86 +0,0 @@
1
- // no-status-code-assert.ts
2
-
3
- /*
4
- * Copyright (c) 2022-2025 Check Digit, LLC
5
- *
6
- * This code is licensed under the MIT license (see LICENSE.txt for details).
7
- */
8
-
9
- import { StatusCodes } from 'http-status-codes';
10
- import { AST_NODE_TYPES, ESLintUtils, TSESLint, TSESTree } from '@typescript-eslint/utils';
11
- import getDocumentationUrl from './get-documentation-url';
12
-
13
- export const ruleId = 'no-status-code-assert';
14
- const NO_STATUS_CODE_ASSERT = 'NO_STATUS_CODE_ASSERT';
15
-
16
- const createRule = ESLintUtils.RuleCreator((name) => getDocumentationUrl(name));
17
-
18
- // Checks if a given AST node contains any status code value.
19
- const hasStatusCodeOrValue = (arg: TSESTree.Node): boolean => {
20
- switch (arg.type) {
21
- case AST_NODE_TYPES.MemberExpression: {
22
- const object = arg.object;
23
- const property = arg.property;
24
- if (
25
- object.type === AST_NODE_TYPES.Identifier &&
26
- object.name === 'StatusCodes' &&
27
- property.type === AST_NODE_TYPES.Identifier
28
- ) {
29
- return true;
30
- }
31
- break;
32
- }
33
- case AST_NODE_TYPES.Literal:
34
- if (typeof arg.value === 'number' && Object.values(StatusCodes).includes(arg.value)) {
35
- return true;
36
- }
37
- break;
38
- case AST_NODE_TYPES.BinaryExpression:
39
- return hasStatusCodeOrValue(arg.left) || hasStatusCodeOrValue(arg.right);
40
- }
41
- return false;
42
- };
43
-
44
- // Checks if a given AST node is an identifier with the name 'assert'.
45
- const isAssertIdentifier = (node: TSESTree.Node): boolean =>
46
- node.type === AST_NODE_TYPES.Identifier && node.name === 'assert';
47
-
48
- // Checks if a given AST node is a member expression with the object named 'assert'.
49
- const isAssertMemberExpression = (node: TSESTree.Node): boolean =>
50
- node.type === AST_NODE_TYPES.MemberExpression &&
51
- node.object.type === AST_NODE_TYPES.Identifier &&
52
- node.object.name === 'assert' &&
53
- node.property.type === AST_NODE_TYPES.Identifier;
54
-
55
- const isAssertCallWithStatusCode = (callee: TSESTree.Node, args: TSESTree.Node[]): boolean =>
56
- (isAssertIdentifier(callee) || isAssertMemberExpression(callee)) && args.some((arg) => hasStatusCodeOrValue(arg));
57
-
58
- const rule: TSESLint.RuleModule<typeof NO_STATUS_CODE_ASSERT> = createRule({
59
- name: ruleId,
60
- meta: {
61
- type: 'problem',
62
- docs: {
63
- description: 'Disallow using status codes in assertions; use error handling instead',
64
- },
65
- schema: [],
66
- messages: {
67
- [NO_STATUS_CODE_ASSERT]: 'Do not use status codes in assertions; use error handling instead',
68
- },
69
- },
70
- defaultOptions: [],
71
- create(context) {
72
- return {
73
- CallExpression(node: TSESTree.CallExpression) {
74
- const callee = node.callee;
75
- if (isAssertCallWithStatusCode(callee, node.arguments)) {
76
- context.report({
77
- node,
78
- messageId: NO_STATUS_CODE_ASSERT,
79
- });
80
- }
81
- },
82
- };
83
- },
84
- });
85
-
86
- export default rule;
@@ -1,62 +0,0 @@
1
- // require-ts-extension-imports.ts
2
-
3
- /*
4
- * Copyright (c) 2022-2024 Check Digit, LLC
5
- *
6
- * This code is licensed under the MIT license (see LICENSE.txt for details).
7
- */
8
-
9
- import path from 'path';
10
- import fs from 'fs';
11
- import { ESLintUtils } from '@typescript-eslint/utils';
12
- import getDocumentationUrl from './get-documentation-url.ts';
13
-
14
- export const ruleId = 'require-ts-extension-imports';
15
- const REQUIRE_TS_EXTENSION_IMPORTS = 'REQUIRE-TS-EXTENSION-IMPORTS';
16
-
17
- const createRule: ReturnType<typeof ESLintUtils.RuleCreator> = ESLintUtils.RuleCreator((name) =>
18
- getDocumentationUrl(name),
19
- );
20
-
21
- const rule: ReturnType<typeof createRule> = createRule({
22
- name: ruleId,
23
- meta: {
24
- type: 'suggestion',
25
- docs: {
26
- description: 'Ensure .ts extension is at the end of all imports',
27
- },
28
- fixable: 'code',
29
- schema: [],
30
- messages: {
31
- [REQUIRE_TS_EXTENSION_IMPORTS]: 'Import paths should end with .ts extension',
32
- },
33
- },
34
- defaultOptions: [],
35
- create(context) {
36
- const filename = context.filename;
37
- return {
38
- ImportDeclaration(node) {
39
- const importPath = node.source.value;
40
- if (importPath.startsWith('.') && !importPath.endsWith('.ts') && !importPath.endsWith('.json')) {
41
- const absoluteImportPath = path.resolve(path.dirname(filename), importPath);
42
- const tsImportPath = `${absoluteImportPath}.ts`;
43
- const existsPath = [absoluteImportPath, tsImportPath].find(fs.existsSync);
44
- if (existsPath !== undefined) {
45
- const stats = fs.statSync(existsPath);
46
- const isDirectory = stats.isDirectory();
47
- const fixedPath = isDirectory ? `${importPath}/index.ts` : `${importPath}.ts`;
48
- context.report({
49
- loc: node.source.loc,
50
- messageId: REQUIRE_TS_EXTENSION_IMPORTS,
51
- *fix(fixer) {
52
- yield fixer.replaceText(node.source, `'${fixedPath}'`);
53
- },
54
- });
55
- }
56
- }
57
- },
58
- };
59
- },
60
- });
61
-
62
- export default rule;