Skip to content

Commit 3d2ef46

Browse files
committed
Add better eslint rules for importing
1 parent 56b8f14 commit 3d2ef46

37 files changed

+191
-123
lines changed

.eslintrc.json

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@
2020
"files": ["*.ts"],
2121
"rules": {
2222
"require-await": "off",
23-
"@typescript-eslint/require-await": "error"
23+
"@typescript-eslint/require-await": "error",
24+
"@typescript-eslint/consistent-type-imports": [
25+
"error",
26+
{
27+
"disallowTypeAnnotations": false, // Used in tests
28+
"prefer": "type-imports",
29+
"fixStyle": "inline-type-imports"
30+
}
31+
]
2432
}
2533
},
2634
{
@@ -42,12 +50,25 @@
4250
"import/order": [
4351
"error",
4452
{
45-
"alphabetize": {
46-
"order": "asc"
47-
},
48-
"groups": [["builtin", "external", "internal"], "parent", "sibling"]
53+
"groups": [
54+
["builtin", "external"],
55+
"internal",
56+
["parent", "sibling", "index"],
57+
"type"
58+
],
59+
"pathGroups": [
60+
{ "pattern": "@/**", "group": "internal", "position": "after" }
61+
],
62+
// Don't reclassify real externals like @babel/* into the alias group
63+
"pathGroupsExcludedImportTypes": ["builtin", "external"],
64+
"newlines-between": "always",
65+
"alphabetize": { "order": "asc", "caseInsensitive": true },
66+
"distinctGroup": true // separates type imports into the "type" group
4967
}
5068
],
69+
// Prevent duplicates and prefer merging into a single import
70+
"no-duplicate-imports": "off",
71+
"import/no-duplicates": ["error", { "prefer-inline": true }],
5172
"import/no-unresolved": [
5273
"error",
5374
{
@@ -72,7 +93,8 @@
7293
"ignorePatterns": ["out", "dist", "**/*.d.ts"],
7394
"settings": {
7495
"import/resolver": {
75-
"typescript": {}
76-
}
96+
"typescript": { "project": "./tsconfig.json" }
97+
},
98+
"import/internal-regex": "^@/"
7799
}
78100
}

src/agentMetadataHelper.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { WorkspaceAgent } from "coder/site/src/api/typesGenerated";
1+
import { type WorkspaceAgent } from "coder/site/src/api/typesGenerated";
22
import * as vscode from "vscode";
3+
34
import {
4-
AgentMetadataEvent,
5+
type AgentMetadataEvent,
56
AgentMetadataEventSchemaArray,
67
errToStr,
78
} from "./api/api-helper";
8-
import { CoderApi } from "./api/coderApi";
9+
import { type CoderApi } from "./api/coderApi";
910

1011
export type AgentMetadataWatcher = {
1112
onChange: vscode.EventEmitter<null>["event"];

src/api/api-helper.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { isApiError, isApiErrorResponse } from "coder/site/src/api/errors";
22
import {
3-
Workspace,
4-
WorkspaceAgent,
5-
WorkspaceResource,
3+
type Workspace,
4+
type WorkspaceAgent,
5+
type WorkspaceResource,
66
} from "coder/site/src/api/typesGenerated";
77
import { ErrorEvent } from "eventsource";
88
import { z } from "zod";

src/api/coderApi.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
1-
import { AxiosInstance } from "axios";
1+
import { type AxiosInstance } from "axios";
22
import { Api } from "coder/site/src/api/api";
33
import {
4-
GetInboxNotificationResponse,
5-
ProvisionerJobLog,
6-
ServerSentEvent,
7-
Workspace,
8-
WorkspaceAgent,
4+
type GetInboxNotificationResponse,
5+
type ProvisionerJobLog,
6+
type ServerSentEvent,
7+
type Workspace,
8+
type WorkspaceAgent,
99
} from "coder/site/src/api/typesGenerated";
1010
import { type WorkspaceConfiguration } from "vscode";
11-
import { ClientOptions } from "ws";
11+
import { type ClientOptions } from "ws";
12+
1213
import { CertificateError } from "../error";
1314
import { getHeaderCommand, getHeaders } from "../headers";
15+
import { createHttpAgent } from "./utils";
1416
import {
1517
createRequestMeta,
1618
logRequest,
1719
logError,
1820
logResponse,
1921
} from "../logging/httpLogger";
20-
import { Logger } from "../logging/logger";
21-
import { RequestConfigWithMeta, HttpClientLogLevel } from "../logging/types";
22+
import { type Logger } from "../logging/logger";
23+
import {
24+
type RequestConfigWithMeta,
25+
HttpClientLogLevel,
26+
} from "../logging/types";
2227
import { WsLogger } from "../logging/wsLogger";
2328
import {
2429
OneWayWebSocket,
25-
OneWayWebSocketInit,
30+
type OneWayWebSocketInit,
2631
} from "../websocket/oneWayWebSocket";
27-
import { createHttpAgent } from "./utils";
2832

2933
const coderSessionTokenHeader = "Coder-Session-Token";
3034

src/api/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import fs from "fs";
22
import { ProxyAgent } from "proxy-agent";
33
import { type WorkspaceConfiguration } from "vscode";
4+
45
import { getProxyForUrl } from "../proxy";
56
import { expandPath } from "../util";
67

src/api/workspace.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { spawn } from "child_process";
2-
import { Api } from "coder/site/src/api/api";
3-
import { Workspace } from "coder/site/src/api/typesGenerated";
2+
import { type Api } from "coder/site/src/api/api";
3+
import { type Workspace } from "coder/site/src/api/typesGenerated";
44
import * as vscode from "vscode";
5-
import { FeatureSet } from "../featureSet";
5+
6+
import { type FeatureSet } from "../featureSet";
67
import { getGlobalFlags } from "../globalFlags";
78
import { escapeCommandArg } from "../util";
89
import { errToStr, createWorkspaceIdentifier } from "./api-helper";
9-
import { CoderApi } from "./coderApi";
10+
import { type CoderApi } from "./coderApi";
1011

1112
/**
1213
* Start or update a workspace and return the updated workspace.

src/cliUtils.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import * as cli from "@/cliUtils";
21
import fs from "fs/promises";
32
import os from "os";
43
import path from "path";
54
import { beforeAll, describe, expect, it } from "vitest";
65

6+
import * as cli from "@/cliUtils";
7+
78
describe("cliUtils", () => {
89
const tmp = path.join(os.tmpdir(), "vscode-coder-tests");
910

src/commands.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
1-
import { Api } from "coder/site/src/api/api";
1+
import { type Api } from "coder/site/src/api/api";
22
import { getErrorMessage } from "coder/site/src/api/errors";
33
import {
4-
User,
5-
Workspace,
6-
WorkspaceAgent,
4+
type User,
5+
type Workspace,
6+
type WorkspaceAgent,
77
} from "coder/site/src/api/typesGenerated";
88
import * as vscode from "vscode";
9+
910
import { createWorkspaceIdentifier, extractAgents } from "./api/api-helper";
1011
import { CoderApi } from "./api/coderApi";
1112
import { needToken } from "./api/utils";
12-
import { CliManager } from "./core/cliManager";
13-
import { MementoManager } from "./core/mementoManager";
14-
import { PathResolver } from "./core/pathResolver";
15-
import { SecretsManager } from "./core/secretsManager";
13+
import { type CliManager } from "./core/cliManager";
14+
import { type MementoManager } from "./core/mementoManager";
15+
import { type PathResolver } from "./core/pathResolver";
16+
import { type SecretsManager } from "./core/secretsManager";
1617
import { CertificateError } from "./error";
1718
import { getGlobalFlags } from "./globalFlags";
18-
import { Logger } from "./logging/logger";
19+
import { type Logger } from "./logging/logger";
1920
import { escapeCommandArg, toRemoteAuthority, toSafeHost } from "./util";
2021
import {
2122
AgentTreeItem,
22-
OpenableTreeItem,
23+
type OpenableTreeItem,
2324
WorkspaceTreeItem,
2425
} from "./workspacesProvider";
2526

src/core/cliManager.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ import globalAxios, {
22
type AxiosInstance,
33
type AxiosRequestConfig,
44
} from "axios";
5-
import { Api } from "coder/site/src/api/api";
6-
import { createWriteStream, WriteStream } from "fs";
5+
import { type Api } from "coder/site/src/api/api";
6+
import { createWriteStream, type WriteStream } from "fs";
77
import fs from "fs/promises";
8-
import { IncomingMessage } from "http";
8+
import { type IncomingMessage } from "http";
99
import path from "path";
1010
import prettyBytes from "pretty-bytes";
1111
import * as semver from "semver";
12-
1312
import * as vscode from "vscode";
13+
1414
import { errToStr } from "../api/api-helper";
1515
import * as cli from "../cliUtils";
16-
import { Logger } from "../logging/logger";
16+
import { type Logger } from "../logging/logger";
1717
import * as pgp from "../pgp";
18-
import { PathResolver } from "./pathResolver";
18+
import { type PathResolver } from "./pathResolver";
1919

2020
export class CliManager {
2121
constructor(

src/error.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { isApiError, isApiErrorResponse } from "coder/site/src/api/errors";
33
import * as forge from "node-forge";
44
import * as tls from "tls";
55
import * as vscode from "vscode";
6-
import { Logger } from "./logging/logger";
6+
7+
import { type Logger } from "./logging/logger";
78

89
// X509_ERR_CODE represents error codes as returned from BoringSSL/OpenSSL.
910
export enum X509_ERR_CODE {

0 commit comments

Comments
 (0)