@checkdigit/eslint-plugin 7.8.0-PR.97-6514 → 7.8.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.
@@ -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";
@@ -25,15 +24,14 @@ import objectLiteralResponse from "./object-literal-response.mjs";
25
24
  import regexComment from "./regular-expression-comment.mjs";
26
25
  import requireAssertPredicateRejectsThrows from "./require-assert-predicate-rejects-throws.mjs";
27
26
  import requireStrictAssert from "./require-strict-assert.mjs";
28
- import requireTsExtensionImports from "./require-ts-extension-imports.mjs";
27
+ import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
29
28
  var rules = {
30
29
  "file-path-comment": filePathComment,
31
30
  "no-card-numbers": noCardNumbers,
32
31
  "no-random-v4-uuid": noRandomV4UUID,
33
- "no-status-code-assert": noStatusCodeAssert,
34
32
  "no-uuid": noUuid,
35
33
  "require-strict-assert": requireStrictAssert,
36
- "require-ts-extension-imports": requireTsExtensionImports,
34
+ "require-ts-extension-imports-exports": requireTsExtensionImportsExports,
37
35
  "no-test-import": noTestImport,
38
36
  "no-wallaby-comment": noWallabyComment,
39
37
  "no-side-effects": noSideEffects,
@@ -63,10 +61,9 @@ var configs = {
63
61
  "@checkdigit/no-card-numbers": "error",
64
62
  "@checkdigit/file-path-comment": "error",
65
63
  "@checkdigit/no-random-v4-uuid": "error",
66
- "@checkdigit/no-status-code-assert": "error",
67
64
  "@checkdigit/no-uuid": "error",
68
65
  "@checkdigit/require-strict-assert": "error",
69
- "@checkdigit/require-ts-extension-imports": "error",
66
+ "@checkdigit/require-ts-extension-imports-exports": "error",
70
67
  "@checkdigit/no-wallaby-comment": "error",
71
68
  "@checkdigit/no-side-effects": [
72
69
  "error",
@@ -97,10 +94,9 @@ var configs = {
97
94
  "@checkdigit/no-card-numbers": "error",
98
95
  "@checkdigit/file-path-comment": "off",
99
96
  "@checkdigit/no-random-v4-uuid": "error",
100
- "@checkdigit/no-status-code-assert": "error",
101
97
  "@checkdigit/no-uuid": "error",
102
98
  "@checkdigit/require-strict-assert": "error",
103
- "@checkdigit/require-ts-extension-imports": "error",
99
+ "@checkdigit/require-ts-extension-imports-exports": "error",
104
100
  "@checkdigit/no-wallaby-comment": "off",
105
101
  "@checkdigit/no-side-effects": "error",
106
102
  "@checkdigit/regular-expression-comment": "error",
@@ -127,4 +123,4 @@ var src_default = defaultToExport;
127
123
  export {
128
124
  src_default as default
129
125
  };
130
- //# sourceMappingURL=data:application/json;base64,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
126
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVVBLE9BQU8sd0JBQXdCLFVBQVUsa0NBQWtDO0FBQzNFLE9BQU8sdUJBQXVCLFVBQVUsaUNBQWlDO0FBQ3pFLE9BQU8seUJBQXlCLFVBQVUsbUNBQW1DO0FBQzdFLE9BQU8sMkJBQTJCLFVBQVUscUNBQXFDO0FBQ2pGLE9BQU87QUFBQSxFQUNMLFVBQVU7QUFBQSxPQUNMO0FBQ1AsT0FBTztBQUFBLEVBQ0wsVUFBVTtBQUFBLE9BQ0w7QUFDUCxPQUFPO0FBQUEsRUFDTCxVQUFVO0FBQUEsT0FDTDtBQUNQLE9BQU8sa0JBQWtCLFVBQVUsNEJBQTRCO0FBQy9ELE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sbUJBQW1CO0FBQzFCLE9BQU8sbUJBQW1CO0FBQzFCLE9BQU8sb0JBQW9CO0FBQzNCLE9BQU8sa0JBQWtCO0FBQ3pCLE9BQU8sWUFBWTtBQUNuQixPQUFPLHNCQUFzQjtBQUM3QixPQUFPLDJCQUEyQjtBQUNsQyxPQUFPLGtCQUFrQjtBQUN6QixPQUFPLHlDQUF5QztBQUNoRCxPQUFPLHlCQUF5QjtBQUNoQyxPQUFPLHNDQUFzQztBQUU3QyxJQUFNLFFBQXNEO0FBQUEsRUFDMUQscUJBQXFCO0FBQUEsRUFDckIsbUJBQW1CO0FBQUEsRUFDbkIscUJBQXFCO0FBQUEsRUFDckIsV0FBVztBQUFBLEVBQ1gseUJBQXlCO0FBQUEsRUFDekIsd0NBQXdDO0FBQUEsRUFDeEMsa0JBQWtCO0FBQUEsRUFDbEIsc0JBQXNCO0FBQUEsRUFDdEIsbUJBQW1CO0FBQUEsRUFDbkIsOEJBQThCO0FBQUEsRUFDOUIsMkNBQTJDO0FBQUEsRUFDM0MsMkJBQTJCO0FBQUEsRUFDM0IsQ0FBQywwQkFBMEIsR0FBRztBQUFBLEVBQzlCLENBQUMsNkJBQTZCLEdBQUc7QUFBQSxFQUNqQyxDQUFDLDJCQUEyQixHQUFHO0FBQUEsRUFDL0IsQ0FBQyxnQ0FBZ0MsR0FBRztBQUFBLEVBQ3BDLENBQUMseUJBQXlCLEdBQUc7QUFBQSxFQUM3QixDQUFDLG9CQUFvQixHQUFHO0FBQUEsRUFDeEIsQ0FBQyxnQ0FBZ0MsR0FBRztBQUFBLEVBQ3BDLENBQUMscUNBQXFDLEdBQUc7QUFDM0M7QUFFQSxJQUFNLFNBQXFDO0FBQUEsRUFDekM7QUFDRjtBQUVBLElBQU0sVUFBd0Q7QUFBQSxFQUM1RCxLQUFLO0FBQUEsSUFDSDtBQUFBLE1BQ0UsT0FBTyxDQUFDLFNBQVM7QUFBQSxNQUNqQixTQUFTO0FBQUEsUUFDUCxlQUFlO0FBQUEsTUFDakI7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLG9EQUFvRDtBQUFBLFFBQ3BELGtDQUFrQztBQUFBLFFBQ2xDLCtCQUErQjtBQUFBLFVBQzdCO0FBQUEsVUFDQSxFQUFFLHFCQUFxQixDQUFDLFVBQVUsU0FBUyxPQUFPLGFBQWEsWUFBWSxFQUFFO0FBQUEsUUFDL0U7QUFBQSxRQUNBLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxRQUNsRCxDQUFDLGVBQWUsMkJBQTJCLEVBQUUsR0FBRztBQUFBLFFBQ2hELENBQUMsZUFBZSxnQ0FBZ0MsRUFBRSxHQUFHO0FBQUEsUUFDckQsQ0FBQyxlQUFlLHlCQUF5QixFQUFFLEdBQUc7QUFBQSxRQUM5QyxDQUFDLGVBQWUsZ0NBQWdDLEVBQUUsR0FBRztBQUFBLFFBQ3JELENBQUMsZUFBZSxxQ0FBcUMsRUFBRSxHQUFHO0FBQUEsUUFDMUQsQ0FBQyxlQUFlLG9CQUFvQixFQUFFLEdBQUc7QUFBQSxNQUMzQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxhQUFhO0FBQUEsSUFDWDtBQUFBLE1BQ0UsT0FBTyxDQUFDLFNBQVM7QUFBQSxNQUNqQixTQUFTO0FBQUEsUUFDUCxlQUFlO0FBQUEsTUFDakI7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMLCtCQUErQjtBQUFBLFFBQy9CLGlDQUFpQztBQUFBLFFBQ2pDLGlDQUFpQztBQUFBLFFBQ2pDLHVCQUF1QjtBQUFBLFFBQ3ZCLHFDQUFxQztBQUFBLFFBQ3JDLG9EQUFvRDtBQUFBLFFBQ3BELGtDQUFrQztBQUFBLFFBQ2xDLCtCQUErQjtBQUFBLFFBQy9CLDBDQUEwQztBQUFBLFFBQzFDLHVEQUF1RDtBQUFBLFFBQ3ZELHVDQUF1QztBQUFBLFFBQ3ZDLDhCQUE4QjtBQUFBLFFBQzlCLENBQUMsZUFBZSwwQkFBMEIsRUFBRSxHQUFHO0FBQUEsUUFDL0MsQ0FBQyxlQUFlLDZCQUE2QixFQUFFLEdBQUc7QUFBQSxRQUNsRCxDQUFDLGVBQWUsMkJBQTJCLEVBQUUsR0FBRztBQUFBLFFBQ2hELENBQUMsZUFBZSxnQ0FBZ0MsRUFBRSxHQUFHO0FBQUEsUUFDckQsQ0FBQyxlQUFlLHlCQUF5QixFQUFFLEdBQUc7QUFBQSxRQUM5QyxDQUFDLGVBQWUsZ0NBQWdDLEVBQUUsR0FBRztBQUFBLFFBQ3JELENBQUMsZUFBZSxxQ0FBcUMsRUFBRSxHQUFHO0FBQUEsUUFDMUQsQ0FBQyxlQUFlLG9CQUFvQixFQUFFLEdBQUc7QUFBQSxNQUMzQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNLGtCQUVGO0FBQUEsRUFDRixHQUFHO0FBQUEsRUFDSDtBQUNGO0FBQ0EsSUFBTyxjQUFROyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -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,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,96 @@
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
+ {
2
+ "name": "@checkdigit/eslint-plugin",
3
+ "version": "7.8.0",
4
+ "description": "Check Digit eslint plugins",
5
+ "keywords": [
6
+ "eslint",
7
+ "eslintplugin"
8
+ ],
9
+ "homepage": "https://github.com/checkdigit/eslint-plugin#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/checkdigit/eslint-plugin/issues"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/checkdigit/eslint-plugin"
16
+ },
17
+ "license": "MIT",
18
+ "author": "Check Digit, LLC",
19
+ "sideEffects": false,
20
+ "type": "module",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist-types/index.d.ts",
24
+ "import": "./dist-mjs/index.mjs",
25
+ "default": "./dist-mjs/index.mjs"
26
+ }
27
+ },
28
+ "files": [
29
+ "src",
30
+ "dist-types",
31
+ "dist-mjs",
32
+ "!src/**/test/**",
33
+ "!src/**/*.test.ts",
34
+ "!src/**/*.spec.ts",
35
+ "!dist-types/**/test/**",
36
+ "!dist-types/**/*.test.d.ts",
37
+ "!dist-types/**/*.spec.d.ts",
38
+ "!dist-mjs/**/test/**",
39
+ "!dist-mjs/**/*.test.mjs",
40
+ "!dist-mjs/**/*.spec.mjs",
41
+ "SECURITY.md"
42
+ ],
43
+ "scripts": {
44
+ "build:dist-mjs": "rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs",
45
+ "build:dist-types": "rimraf dist-types && npx builder --type=types --outDir=dist-types",
46
+ "ci:compile": "tsc --noEmit",
47
+ "ci:coverage": "NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true",
48
+ "ci:lint": "npm run lint",
49
+ "ci:style": "npm run prettier",
50
+ "ci:test": "NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false",
51
+ "lint": "eslint --max-warnings 0 .",
52
+ "lint:fix": "eslint --max-warnings 0 --fix .",
53
+ "prepare": "",
54
+ "prepublishOnly": "npm run build:dist-types && npm run build:dist-mjs",
55
+ "prettier": "prettier --ignore-path .gitignore --list-different .",
56
+ "prettier:fix": "prettier --ignore-path .gitignore --write .",
57
+ "test": "npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"
58
+ },
59
+ "prettier": "@checkdigit/prettier-config",
60
+ "jest": {
61
+ "preset": "@checkdigit/jest-config"
62
+ },
63
+ "dependencies": {
64
+ "@typescript-eslint/type-utils": "^8.18.1",
65
+ "@typescript-eslint/utils": "^8.18.1",
66
+ "ts-api-utils": "^2.0.0"
67
+ },
68
+ "devDependencies": {
69
+ "@checkdigit/jest-config": "^6.0.2",
70
+ "@checkdigit/prettier-config": "^6.0.0",
71
+ "@checkdigit/typescript-config": "^9.0.0",
72
+ "@eslint/js": "^9.17.0",
73
+ "@types/eslint": "^9.6.1",
74
+ "@types/eslint-config-prettier": "^6.11.3",
75
+ "@typescript-eslint/parser": "^8.18.1",
76
+ "@typescript-eslint/rule-tester": "^8.18.1",
77
+ "eslint": "^9.17.0",
78
+ "eslint-config-prettier": "^9.1.0",
79
+ "eslint-import-resolver-typescript": "^3.7.0",
80
+ "eslint-plugin-eslint-plugin": "^6.3.2",
81
+ "eslint-plugin-import": "^2.31.0",
82
+ "eslint-plugin-no-only-tests": "^3.3.0",
83
+ "eslint-plugin-no-secrets": "^2.1.1",
84
+ "eslint-plugin-node": "^11.1.0",
85
+ "eslint-plugin-sonarjs": "1.0.4",
86
+ "http-status-codes": "^2.3.0",
87
+ "rimraf": "^6.0.1",
88
+ "typescript-eslint": "^8.18.1"
89
+ },
90
+ "peerDependencies": {
91
+ "eslint": ">=9 <10"
92
+ },
93
+ "engines": {
94
+ "node": ">=20.17"
95
+ }
96
+ }
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';
@@ -34,16 +33,15 @@ import objectLiteralResponse from './object-literal-response.ts';
34
33
  import regexComment from './regular-expression-comment.ts';
35
34
  import requireAssertPredicateRejectsThrows from './require-assert-predicate-rejects-throws.ts';
36
35
  import requireStrictAssert from './require-strict-assert.ts';
37
- import requireTsExtensionImports from './require-ts-extension-imports';
36
+ import requireTsExtensionImportsExports from './require-ts-extension-imports-exports.ts';
38
37
 
39
38
  const rules: Record<string, TSESLint.LooseRuleDefinition> = {
40
39
  'file-path-comment': filePathComment,
41
40
  'no-card-numbers': noCardNumbers,
42
41
  'no-random-v4-uuid': noRandomV4UUID,
43
- 'no-status-code-assert': noStatusCodeAssert,
44
42
  'no-uuid': noUuid,
45
43
  'require-strict-assert': requireStrictAssert,
46
- 'require-ts-extension-imports': requireTsExtensionImports,
44
+ 'require-ts-extension-imports-exports': requireTsExtensionImportsExports,
47
45
  'no-test-import': noTestImport,
48
46
  'no-wallaby-comment': noWallabyComment,
49
47
  'no-side-effects': noSideEffects,
@@ -75,10 +73,9 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
75
73
  '@checkdigit/no-card-numbers': 'error',
76
74
  '@checkdigit/file-path-comment': 'error',
77
75
  '@checkdigit/no-random-v4-uuid': 'error',
78
- '@checkdigit/no-status-code-assert': 'error',
79
76
  '@checkdigit/no-uuid': 'error',
80
77
  '@checkdigit/require-strict-assert': 'error',
81
- '@checkdigit/require-ts-extension-imports': 'error',
78
+ '@checkdigit/require-ts-extension-imports-exports': 'error',
82
79
  '@checkdigit/no-wallaby-comment': 'error',
83
80
  '@checkdigit/no-side-effects': [
84
81
  'error',
@@ -109,10 +106,9 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
109
106
  '@checkdigit/no-card-numbers': 'error',
110
107
  '@checkdigit/file-path-comment': 'off',
111
108
  '@checkdigit/no-random-v4-uuid': 'error',
112
- '@checkdigit/no-status-code-assert': 'error',
113
109
  '@checkdigit/no-uuid': 'error',
114
110
  '@checkdigit/require-strict-assert': 'error',
115
- '@checkdigit/require-ts-extension-imports': 'error',
111
+ '@checkdigit/require-ts-extension-imports-exports': 'error',
116
112
  '@checkdigit/no-wallaby-comment': 'off',
117
113
  '@checkdigit/no-side-effects': 'error',
118
114
  '@checkdigit/regular-expression-comment': 'error',
@@ -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;