@checkdigit/eslint-plugin 7.8.0-PR.97-7207 → 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.
- package/dist-mjs/index.mjs +5 -9
- package/dist-mjs/require-ts-extension-imports-exports.mjs +72 -0
- package/dist-types/require-ts-extension-imports-exports.d.ts +4 -0
- package/package.json +96 -1
- package/src/index.ts +4 -8
- package/src/require-ts-extension-imports-exports.ts +84 -0
- package/dist-mjs/no-status-code-assert.mjs +0 -63
- package/dist-mjs/require-ts-extension-imports.mjs +0 -56
- package/dist-types/no-status-code-assert.d.ts +0 -5
- package/dist-types/require-ts-extension-imports.d.ts +0 -5
- package/src/no-status-code-assert.ts +0 -86
- package/src/require-ts-extension-imports.ts +0 -62
package/dist-mjs/index.mjs
CHANGED
|
@@ -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
|
|
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":
|
|
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,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,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
|
|
@@ -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==
|
package/package.json
CHANGED
|
@@ -1 +1,96 @@
|
|
|
1
|
-
{
|
|
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
|
|
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':
|
|
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,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;
|