@checkdigit/eslint-plugin 7.7.1-PR.101-95b3 → 7.8.0-PR.111-2284
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 -5
- 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 +1 -1
- package/src/index.ts +5 -5
- package/src/require-ts-extension-imports-exports.ts +84 -0
- package/dist-mjs/require-ts-extension-imports.mjs +0 -56
- package/dist-types/require-ts-extension-imports.d.ts +0 -5
- package/src/require-ts-extension-imports.ts +0 -62
package/dist-mjs/index.mjs
CHANGED
|
@@ -24,14 +24,14 @@ import objectLiteralResponse from "./object-literal-response.mjs";
|
|
|
24
24
|
import regexComment from "./regular-expression-comment.mjs";
|
|
25
25
|
import requireAssertPredicateRejectsThrows from "./require-assert-predicate-rejects-throws.mjs";
|
|
26
26
|
import requireStrictAssert from "./require-strict-assert.mjs";
|
|
27
|
-
import
|
|
27
|
+
import requireTsExtensionImportsExports from "./require-ts-extension-imports-exports.mjs";
|
|
28
28
|
var rules = {
|
|
29
29
|
"file-path-comment": filePathComment,
|
|
30
30
|
"no-card-numbers": noCardNumbers,
|
|
31
31
|
"no-random-v4-uuid": noRandomV4UUID,
|
|
32
32
|
"no-uuid": noUuid,
|
|
33
33
|
"require-strict-assert": requireStrictAssert,
|
|
34
|
-
"require-ts-extension-imports":
|
|
34
|
+
"require-ts-extension-imports-exports": requireTsExtensionImportsExports,
|
|
35
35
|
"no-test-import": noTestImport,
|
|
36
36
|
"no-wallaby-comment": noWallabyComment,
|
|
37
37
|
"no-side-effects": noSideEffects,
|
|
@@ -63,7 +63,7 @@ var configs = {
|
|
|
63
63
|
"@checkdigit/no-random-v4-uuid": "error",
|
|
64
64
|
"@checkdigit/no-uuid": "error",
|
|
65
65
|
"@checkdigit/require-strict-assert": "error",
|
|
66
|
-
"@checkdigit/require-ts-extension-imports": "error",
|
|
66
|
+
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
67
67
|
"@checkdigit/no-wallaby-comment": "error",
|
|
68
68
|
"@checkdigit/no-side-effects": [
|
|
69
69
|
"error",
|
|
@@ -96,7 +96,7 @@ var configs = {
|
|
|
96
96
|
"@checkdigit/no-random-v4-uuid": "error",
|
|
97
97
|
"@checkdigit/no-uuid": "error",
|
|
98
98
|
"@checkdigit/require-strict-assert": "error",
|
|
99
|
-
"@checkdigit/require-ts-extension-imports": "error",
|
|
99
|
+
"@checkdigit/require-ts-extension-imports-exports": "error",
|
|
100
100
|
"@checkdigit/no-wallaby-comment": "off",
|
|
101
101
|
"@checkdigit/no-side-effects": "error",
|
|
102
102
|
"@checkdigit/regular-expression-comment": "error",
|
|
@@ -123,4 +123,4 @@ var src_default = defaultToExport;
|
|
|
123
123
|
export {
|
|
124
124
|
src_default as default
|
|
125
125
|
};
|
|
126
|
-
//# 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 @@
|
|
|
1
|
-
{"name":"@checkdigit/eslint-plugin","version":"7.
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"7.8.0-PR.111-2284","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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// index.ts
|
|
2
2
|
|
|
3
3
|
/*
|
|
4
|
-
* Copyright (c) 2021-
|
|
4
|
+
* Copyright (c) 2021-2025 Check Digit, LLC
|
|
5
5
|
*
|
|
6
6
|
* This code is licensed under the MIT license (see LICENSE.txt for details).
|
|
7
7
|
*/
|
|
@@ -33,7 +33,7 @@ import objectLiteralResponse from './object-literal-response.ts';
|
|
|
33
33
|
import regexComment from './regular-expression-comment.ts';
|
|
34
34
|
import requireAssertPredicateRejectsThrows from './require-assert-predicate-rejects-throws.ts';
|
|
35
35
|
import requireStrictAssert from './require-strict-assert.ts';
|
|
36
|
-
import
|
|
36
|
+
import requireTsExtensionImportsExports from './require-ts-extension-imports-exports.ts';
|
|
37
37
|
|
|
38
38
|
const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
39
39
|
'file-path-comment': filePathComment,
|
|
@@ -41,7 +41,7 @@ const rules: Record<string, TSESLint.LooseRuleDefinition> = {
|
|
|
41
41
|
'no-random-v4-uuid': noRandomV4UUID,
|
|
42
42
|
'no-uuid': noUuid,
|
|
43
43
|
'require-strict-assert': requireStrictAssert,
|
|
44
|
-
'require-ts-extension-imports':
|
|
44
|
+
'require-ts-extension-imports-exports': requireTsExtensionImportsExports,
|
|
45
45
|
'no-test-import': noTestImport,
|
|
46
46
|
'no-wallaby-comment': noWallabyComment,
|
|
47
47
|
'no-side-effects': noSideEffects,
|
|
@@ -75,7 +75,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
75
75
|
'@checkdigit/no-random-v4-uuid': 'error',
|
|
76
76
|
'@checkdigit/no-uuid': 'error',
|
|
77
77
|
'@checkdigit/require-strict-assert': 'error',
|
|
78
|
-
'@checkdigit/require-ts-extension-imports': 'error',
|
|
78
|
+
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
79
79
|
'@checkdigit/no-wallaby-comment': 'error',
|
|
80
80
|
'@checkdigit/no-side-effects': [
|
|
81
81
|
'error',
|
|
@@ -108,7 +108,7 @@ const configs: Record<string, TSESLint.FlatConfig.Config[]> = {
|
|
|
108
108
|
'@checkdigit/no-random-v4-uuid': 'error',
|
|
109
109
|
'@checkdigit/no-uuid': 'error',
|
|
110
110
|
'@checkdigit/require-strict-assert': 'error',
|
|
111
|
-
'@checkdigit/require-ts-extension-imports': 'error',
|
|
111
|
+
'@checkdigit/require-ts-extension-imports-exports': 'error',
|
|
112
112
|
'@checkdigit/no-wallaby-comment': 'off',
|
|
113
113
|
'@checkdigit/no-side-effects': 'error',
|
|
114
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,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,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;
|