@itcode-dev/ts-plugin-fix-import-suggestion 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 itcode.dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.ko.md ADDED
@@ -0,0 +1,117 @@
1
+ # ts-plugin-fix-import-suggestion
2
+
3
+ [English](README.md) | **한국어**
4
+
5
+ [Turborepo](https://turborepo.com/)의 [JIT(Just-In-Time) 패키지](https://turborepo.com/docs/core-concepts/internal-packages#just-in-time-packages) 방식을 쓸 때 에디터(VS Code 등)의 자동 import 제안이 잘못된 파일 확장자를 표시하는 버그를 우회하는 TypeScript Language Service Plugin입니다.
6
+
7
+ ## 문제 상황
8
+
9
+ Turborepo의 JIT 패키지 방식을 쓰면, 내부 패키지가 `.ts`/`.tsx` 소스 파일을 빌드 과정 없이 그대로 export합니다. 예를 들어 `@your-org/utils` 패키지가 `src/formatDate.ts`를 그대로 내보낸다고 해봐요:
10
+
11
+ ```
12
+ your-monorepo/
13
+ ├── apps/
14
+ │ └── web/
15
+ │ └── src/
16
+ │ └── App.ts -- 여기서 타이핑하는 중
17
+ └── packages/
18
+ └── utils/
19
+ ├── package.json -- "exports": { "./*": "./src/*" }
20
+ └── src/
21
+ └── formatDate.ts -- 실제 파일 (소스 그대로 배포, 컴파일 안 됨)
22
+ ```
23
+
24
+ `App.ts`에서 `formatDate(`를 입력하고 에디터가 제안하는 자동 import를 그대로 선택하면 이렇게 되길 기대하죠:
25
+
26
+ ```ts
27
+ import { formatDate } from '@your-org/utils/formatDate.ts';
28
+ ```
29
+
30
+ 하지만 실제로 VS Code는 이렇게 삽입합니다:
31
+
32
+ ```ts
33
+ import { formatDate } from '@your-org/utils/formatDate.js';
34
+ ```
35
+
36
+ `formatDate.js`라는 파일은 존재하지 않아요 — 있는 건 `formatDate.ts`뿐입니다. TypeScript는 `.js` specifier를 같은 이름의 `.ts`/`.tsx` 파일로 되돌려주는 특수 규칙이 있어서 컴파일과 타입 체크는 문제없이 되지만(그래서 실제로 뭔가 깨지진 않아요), import 코드 자체는 보기에 이상하고 헷갈리며, import specifier가 실제 파일을 가리킨다고 가정하는 다른 툴에서 문제가 될 수 있습니다.
37
+
38
+ 이 플러그인은 정확히 이 불일치 — 제안된 specifier는 `.js`/`.jsx`로 끝나는데 TypeScript가 실제로 resolve한 파일은 `.ts`/`.tsx`로 끝나는 경우 — 를 감지해서, 제안을 실제 확장자로 고쳐줍니다. `tsc`는 language service plugin을 로드하지 않으므로 빌드나 타입 체크에는 아무 영향이 없습니다 — 오직 에디터의 IntelliSense가 보여주고 삽입하는 내용만 바꿉니다.
39
+
40
+ 실제로 `.js`/`.jsx` 파일을 배포하는 서드파티 패키지는 영향을 받지 않습니다 — 겉보기 specifier의 확장자와 실제 resolve된 파일의 확장자가 다를 때만 동작합니다.
41
+
42
+ ## 계속 필요한 디펜던시인가요?
43
+
44
+ 이 패키지는 VS Code의 TypeScript 통합이 JIT 패키지에 대해 자동 import specifier를 생성하는 현재 방식을 우회하기 위해서만 존재합니다. VS Code(또는 그 기반이 되는 TypeScript language service)가 이 문제를 근본적으로 고치면, 이 플러그인은 더 이상 필요 없어집니다 — 그때는 `tsconfig.json`에서 제거하고 의존성에서 삭제하시면 됩니다.
45
+
46
+ ## 설치
47
+
48
+ ```sh
49
+ npm install --save-dev @itcode-dev/ts-plugin-fix-import-suggestion
50
+ ```
51
+
52
+ ```sh
53
+ yarn add --dev @itcode-dev/ts-plugin-fix-import-suggestion
54
+ ```
55
+
56
+ ```sh
57
+ pnpm add --save-dev @itcode-dev/ts-plugin-fix-import-suggestion
58
+ ```
59
+
60
+ ## 전제조건: `allowImportingTsExtensions`
61
+
62
+ 이 플러그인의 핵심은 제안을 실제 확장자인 `.ts`/`.tsx`로 끝나게 만드는 거예요. 그런데 TypeScript는 기본적으로 `.ts`/`.tsx`로 끝나는 import specifier를 거부합니다(`An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled`). JIT 패키지 구성이라면 대부분 이미 이 옵션이 켜져 있을 거예요(JIT 패키지는 애초에 `tsc`로 결과물을 emit하지 않으므로, 이 옵션과 함께 `noEmit`/`emitDeclarationOnly`가 필요하거든요). 혹시 저 에러가 보인다면 `tsconfig.json`에 추가해주세요:
63
+
64
+ ```jsonc
65
+ {
66
+ "compilerOptions": {
67
+ "allowImportingTsExtensions": true,
68
+ "noEmit": true
69
+ }
70
+ }
71
+ ```
72
+
73
+ ## 사용법
74
+
75
+ `tsconfig.json`의 `compilerOptions.plugins` 배열에 플러그인을 추가합니다:
76
+
77
+ ```jsonc
78
+ {
79
+ "compilerOptions": {
80
+ "plugins": [
81
+ { "name": "@itcode-dev/ts-plugin-fix-import-suggestion" }
82
+ ]
83
+ }
84
+ }
85
+ ```
86
+
87
+ 이후 에디터에서 TypeScript 서버를 재시작합니다 (VS Code: **TypeScript: Restart TS Server**).
88
+
89
+ ## 옵션
90
+
91
+ | 옵션 | 타입 | 기본값 | 설명 |
92
+ | ----------- | --------- | ------- | ------------------------------------------------------------------------------------------------------ |
93
+ | `debug` | `boolean` | `false` | 플러그인 동작을 TS 서버 로그에 기록합니다. |
94
+ | `overwrite` | `boolean` | `false` | `false`(기본값)이면 원본 제안은 그대로 두고 고쳐진 제안을 하나 더 추가합니다. `true`면 원본 제안 자체를 고쳐진 것으로 덮어씁니다. |
95
+
96
+ ```jsonc
97
+ {
98
+ "compilerOptions": {
99
+ "plugins": [
100
+ {
101
+ "name": "@itcode-dev/ts-plugin-fix-import-suggestion",
102
+ "debug": false,
103
+ "overwrite": true
104
+ }
105
+ ]
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## 주의사항
111
+
112
+ - 이 플러그인은 **VS Code**의 제한적인 셋업에서만 동작을 확인했습니다. WebStorm, Neovim 등 다른 tsserver 기반 에디터에서는 테스트되지 않았어요.
113
+ - TypeScript 플러그인은 여러 개가 체이닝될 수 있습니다 — `tsconfig.json`의 `plugins` 배열에 여러 항목이 있으면 각각이 앞선 플러그인의 `LanguageService`를 감싸는 구조예요. **이 플러그인과 함께 체이닝되는 다른 플러그인이 무엇이냐**에 따라(예: Next.js의 TS 플러그인, `@mdx-js/typescript-plugin` 같은 Volar 기반 플러그인) 이 플러그인이 의존하는 데이터의 형태가 항상 보장되지는 않습니다. 실제로 어떤 체이닝 조합에서는 `getCodeFixesAtPosition`의 `fixId` 필드가 비어 있는 걸 발견해서, `fixName`도 함께 확인하도록 우회해뒀어요. 이 외에도 특정 플러그인 조합에서 예상대로 동작하지 않는 경우가 있을 수 있습니다 — 그런 경우를 만나면 `"debug": true`를 켜고 TS 서버 로그를 확인하는 게 원인을 가장 빠르게 파악하는 방법이에요.
114
+
115
+ ## 라이선스
116
+
117
+ MIT
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # ts-plugin-fix-import-suggestion
2
+
3
+ **English** | [한국어](README.ko.md)
4
+
5
+ A TypeScript Language Service Plugin that works around a wrong-file-extension bug in your editor's (VS Code, etc.) auto-import suggestions when working with [Turborepo](https://turborepo.com/)'s [JIT (Just-In-Time) packages](https://turborepo.com/docs/core-concepts/internal-packages#just-in-time-packages).
6
+
7
+ ## The problem
8
+
9
+ With a Turborepo JIT package, an internal package ships `.ts`/`.tsx` source files directly — there's no build step turning them into `.js`. For example, `@your-org/utils` might export `src/formatDate.ts` as-is:
10
+
11
+ ```
12
+ your-monorepo/
13
+ ├── apps/
14
+ │ └── web/
15
+ │ └── src/
16
+ │ └── App.ts -- you're typing here
17
+ └── packages/
18
+ └── utils/
19
+ ├── package.json -- "exports": { "./*": "./src/*" }
20
+ └── src/
21
+ └── formatDate.ts -- the real file (shipped as source, never compiled)
22
+ ```
23
+
24
+ Say you type `formatDate(` in `App.ts` and accept your editor's auto-import suggestion. You'd expect:
25
+
26
+ ```ts
27
+ import { formatDate } from '@your-org/utils/formatDate.ts';
28
+ ```
29
+
30
+ But VS Code actually inserts this instead:
31
+
32
+ ```ts
33
+ import { formatDate } from '@your-org/utils/formatDate.js';
34
+ ```
35
+
36
+ There is no `formatDate.js` file — only `formatDate.ts` exists. TypeScript still compiles and type-checks this fine (it has a special rule that maps a `.js` specifier back to a same-named `.ts`/`.tsx` file), so nothing is actually broken. But the import looks wrong, is confusing to read, and can trip up other tooling that expects import specifiers to point at real files.
37
+
38
+ This plugin detects exactly this mismatch — a suggested specifier ending in `.js`/`.jsx` where the file TypeScript actually resolved ends in `.ts`/`.tsx` — and rewrites the suggestion to use the real extension. It has no effect on `tsc` builds or type-checking, since `tsc` never loads language service plugins — it only changes what your editor's IntelliSense shows and inserts.
39
+
40
+ Third-party packages that genuinely ship `.js`/`.jsx` files are unaffected — the fix only kicks in when the apparent specifier extension and the real resolved file extension disagree.
41
+
42
+ ## Is this still needed?
43
+
44
+ This package exists purely to work around how VS Code's TypeScript integration currently generates auto-import specifiers for JIT packages. If/once VS Code (or the underlying TypeScript language service) fixes this upstream, this plugin will no longer be necessary — you should be able to remove it from your `tsconfig.json` and uninstall it.
45
+
46
+ ## Installation
47
+
48
+ ```sh
49
+ npm install --save-dev @itcode-dev/ts-plugin-fix-import-suggestion
50
+ ```
51
+
52
+ ```sh
53
+ yarn add --dev @itcode-dev/ts-plugin-fix-import-suggestion
54
+ ```
55
+
56
+ ```sh
57
+ pnpm add --save-dev @itcode-dev/ts-plugin-fix-import-suggestion
58
+ ```
59
+
60
+ ## Prerequisite: `allowImportingTsExtensions`
61
+
62
+ The whole point of this plugin is to make suggestions end in a real `.ts`/`.tsx` extension. By default, TypeScript rejects import specifiers that literally end in `.ts`/`.tsx` (`An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled`). JIT-package setups almost always already have this enabled (since `tsc` never emits output for them — `noEmit`/`emitDeclarationOnly` is required alongside it), but if you see that error, add it to your `tsconfig.json`:
63
+
64
+ ```jsonc
65
+ {
66
+ "compilerOptions": {
67
+ "allowImportingTsExtensions": true,
68
+ "noEmit": true
69
+ }
70
+ }
71
+ ```
72
+
73
+ ## Usage
74
+
75
+ Add the plugin to the `compilerOptions.plugins` array in your `tsconfig.json`:
76
+
77
+ ```jsonc
78
+ {
79
+ "compilerOptions": {
80
+ "plugins": [
81
+ { "name": "@itcode-dev/ts-plugin-fix-import-suggestion" }
82
+ ]
83
+ }
84
+ }
85
+ ```
86
+
87
+ Then restart the TypeScript server in your editor (in VS Code: **TypeScript: Restart TS Server**).
88
+
89
+ ## Options
90
+
91
+ | Option | Type | Default | Description |
92
+ | ----------- | --------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
93
+ | `debug` | `boolean` | `false` | Logs plugin activity to the TS server log. |
94
+ | `overwrite` | `boolean` | `false` | When `false` (default), the original suggestion is kept and a corrected one is added alongside it. When `true`, the original suggestion is replaced in place. |
95
+
96
+ ```jsonc
97
+ {
98
+ "compilerOptions": {
99
+ "plugins": [
100
+ {
101
+ "name": "@itcode-dev/ts-plugin-fix-import-suggestion",
102
+ "debug": false,
103
+ "overwrite": true
104
+ }
105
+ ]
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## Caveats
111
+
112
+ - This plugin has only been verified in **VS Code**, in a limited set of setups. Other tsserver-based editors (WebStorm, Neovim, etc.) aren't tested.
113
+ - TypeScript plugins can be chained — multiple `plugins` entries in `tsconfig.json` each wrap the previous one's `LanguageService`. Depending on **which other plugins are chained alongside this one** (e.g. Next.js's TS plugin, Volar-based plugins like `@mdx-js/typescript-plugin`), the shape of the data this plugin depends on isn't always guaranteed. For example, `getCodeFixesAtPosition`'s `fixId` field was found to be missing in one such chained setup, so this plugin also falls back to checking `fixName`. There may be other chaining combinations where this plugin doesn't work as expected — if you hit one, enabling `"debug": true` and checking the TS server log is the fastest way to see what's actually happening.
114
+
115
+ ## License
116
+
117
+ MIT
@@ -0,0 +1,3 @@
1
+ export type Extension = '.tsx' | '.ts' | '.jsx' | '.js';
2
+ export declare function getExtension(fileName?: string): Extension | undefined;
3
+ export declare function fixExtension(specifier: string, fileName?: string): string;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExtension = getExtension;
4
+ exports.fixExtension = fixExtension;
5
+ function getExtension(fileName) {
6
+ if (fileName === undefined) {
7
+ return;
8
+ }
9
+ if (fileName.endsWith('.tsx')) {
10
+ return '.tsx';
11
+ }
12
+ if (fileName.endsWith('.ts')) {
13
+ return '.ts';
14
+ }
15
+ if (fileName.endsWith('.jsx')) {
16
+ return '.jsx';
17
+ }
18
+ if (fileName.endsWith('.js')) {
19
+ return '.js';
20
+ }
21
+ }
22
+ function fixExtension(specifier, fileName) {
23
+ const displayExt = getExtension(specifier);
24
+ const fileExt = getExtension(fileName);
25
+ if (!(displayExt && fileExt)) {
26
+ return specifier;
27
+ }
28
+ return `${specifier.slice(0, -displayExt.length)}${fileExt}`;
29
+ }
@@ -0,0 +1,6 @@
1
+ import type * as ts from 'typescript';
2
+ import type { server } from 'typescript';
3
+ declare function init({ typescript }: {
4
+ typescript: typeof ts;
5
+ }): Partial<server.PluginModule>;
6
+ export = init;
package/dist/index.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ const extension_js_1 = require("./extension.js");
3
+ const IMPORT_FIX_ID = 'fixMissingImport';
4
+ const IMPORT_FIX_NAME = 'import';
5
+ function patchMissingImportChanges(changes, typescript, info) {
6
+ const program = info.languageService.getProgram();
7
+ if (!program) {
8
+ return [];
9
+ }
10
+ const compilerOptions = program.getCompilerOptions();
11
+ const moduleResolutionHost = info.languageServiceHost;
12
+ const fixes = [];
13
+ for (const change of changes) {
14
+ for (const textChange of change.textChanges) {
15
+ textChange.newText = textChange.newText.replace(/\bfrom\s+(['"])([^'"]+)\1/gu, (whole, quote, specifier) => {
16
+ const resolved = typescript.resolveModuleName(specifier, change.fileName, compilerOptions, moduleResolutionHost);
17
+ const fixed = (0, extension_js_1.fixExtension)(specifier, resolved.resolvedModule?.resolvedFileName);
18
+ if (fixed === specifier) {
19
+ return whole;
20
+ }
21
+ fixes.push({ fixed, specifier });
22
+ return `from ${quote}${fixed}${quote}`;
23
+ });
24
+ }
25
+ }
26
+ return fixes;
27
+ }
28
+ function init({ typescript }) {
29
+ return {
30
+ create(info) {
31
+ const config = info.config;
32
+ const isDebug = config.debug === true;
33
+ const isOverwrite = config.overwrite === true;
34
+ const log = (message) => {
35
+ if (isDebug) {
36
+ info.project.projectService.logger.info(`[ts-plugin-fix-import-extension] ${message}`);
37
+ }
38
+ };
39
+ log(`create() called (overwrite: ${isOverwrite})`);
40
+ const getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
41
+ const result = info.languageService.getCompletionsAtPosition(fileName, position, options, formattingSettings);
42
+ if (!result) {
43
+ return result;
44
+ }
45
+ if (isOverwrite) {
46
+ let fixedCount = 0;
47
+ for (const entry of result.entries) {
48
+ if (!(entry.source && entry.data?.fileName)) {
49
+ continue;
50
+ }
51
+ const fixed = (0, extension_js_1.fixExtension)(entry.source, entry.data.fileName);
52
+ if (fixed === entry.source) {
53
+ continue;
54
+ }
55
+ entry.source = fixed;
56
+ entry.sourceDisplay = [{ kind: 'text', text: fixed }];
57
+ fixedCount++;
58
+ }
59
+ log(`getCompletionsAtPosition: ${result.entries.length} entries, ${fixedCount} overwritten`);
60
+ return result;
61
+ }
62
+ const addedEntries = [];
63
+ for (const entry of result.entries) {
64
+ if (!(entry.source && entry.data?.fileName)) {
65
+ continue;
66
+ }
67
+ const fixed = (0, extension_js_1.fixExtension)(entry.source, entry.data.fileName);
68
+ if (fixed === entry.source) {
69
+ continue;
70
+ }
71
+ addedEntries.push({
72
+ ...entry,
73
+ source: fixed,
74
+ sourceDisplay: [{ kind: 'text', text: fixed }]
75
+ });
76
+ }
77
+ result.entries.push(...addedEntries);
78
+ log(`getCompletionsAtPosition: ${result.entries.length} entries, ${addedEntries.length} variants added`);
79
+ return result;
80
+ };
81
+ const getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
82
+ const result = info.languageService.getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
83
+ if (!result?.codeActions) {
84
+ return result;
85
+ }
86
+ const realExt = (0, extension_js_1.getExtension)(data?.fileName);
87
+ const pickedAddedEntry = realExt && source?.endsWith(realExt);
88
+ const fakeSpecifier = data?.moduleSpecifier;
89
+ const fixedSpecifier = pickedAddedEntry && fakeSpecifier ? (0, extension_js_1.fixExtension)(fakeSpecifier, data.fileName) : undefined;
90
+ let patchedCount = 0;
91
+ if (fixedSpecifier && fakeSpecifier && fixedSpecifier !== fakeSpecifier) {
92
+ for (const codeAction of result.codeActions) {
93
+ for (const change of codeAction.changes) {
94
+ for (const textChange of change.textChanges) {
95
+ if (textChange.newText.includes(fakeSpecifier)) {
96
+ textChange.newText = textChange.newText.split(fakeSpecifier).join(fixedSpecifier);
97
+ patchedCount++;
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ log(`getCompletionEntryDetails: ${patchedCount} textChanges patched`);
104
+ return result;
105
+ };
106
+ const getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
107
+ const result = info.languageService.getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
108
+ let patchedCount = 0;
109
+ for (const action of result) {
110
+ if (action.fixId !== IMPORT_FIX_ID && action.fixName !== IMPORT_FIX_NAME) {
111
+ continue;
112
+ }
113
+ const fixes = patchMissingImportChanges(action.changes, typescript, info);
114
+ for (const { fixed, specifier } of fixes) {
115
+ action.description = action.description.split(specifier).join(fixed);
116
+ }
117
+ patchedCount += fixes.length;
118
+ }
119
+ log(`getCodeFixesAtPosition: ${result.length} actions, ${patchedCount} specifiers patched`);
120
+ return result;
121
+ };
122
+ const getCombinedCodeFix = (scope, fixId, formatOptions, preferences) => {
123
+ const result = info.languageService.getCombinedCodeFix(scope, fixId, formatOptions, preferences);
124
+ if (fixId !== IMPORT_FIX_ID) {
125
+ return result;
126
+ }
127
+ const patchedCount = patchMissingImportChanges(result.changes, typescript, info).length;
128
+ log(`getCombinedCodeFix: ${patchedCount} specifiers patched`);
129
+ return result;
130
+ };
131
+ const overrides = {
132
+ getCodeFixesAtPosition,
133
+ getCombinedCodeFix,
134
+ getCompletionEntryDetails,
135
+ getCompletionsAtPosition
136
+ };
137
+ return new Proxy(info.languageService, {
138
+ get(target, prop, receiver) {
139
+ if (prop in overrides) {
140
+ return overrides[prop];
141
+ }
142
+ const value = Reflect.get(target, prop, receiver);
143
+ return typeof value === 'function' ? value.bind(target) : value;
144
+ }
145
+ });
146
+ }
147
+ };
148
+ }
149
+ module.exports = init;
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "author": "RWB <psj2716@gmail.com>",
3
+ "description": "A TypeScript Language Service Plugin that fixes wrong .js/.jsx auto-import suggestions for Turborepo JIT packages in editors like VS Code.",
4
+ "devDependencies": {
5
+ "@biomejs/biome": "^2.4.16",
6
+ "@itcode-dev/biome-config": "^1.0.1",
7
+ "typescript": "^6.0.3"
8
+ },
9
+ "devEngines": {
10
+ "packageManager": {
11
+ "name": "pnpm",
12
+ "onFail": "download",
13
+ "version": "^11.1.1"
14
+ }
15
+ },
16
+ "keywords": [
17
+ "typescript",
18
+ "typescript-plugin",
19
+ "tsserver-plugin",
20
+ "language-service-plugin",
21
+ "turborepo",
22
+ "jit-packages",
23
+ "monorepo",
24
+ "auto-import",
25
+ "vscode",
26
+ "intellisense"
27
+ ],
28
+ "license": "MIT",
29
+ "main": "dist/index.js",
30
+ "name": "@itcode-dev/ts-plugin-fix-import-suggestion",
31
+ "type": "commonjs",
32
+ "types": "dist/index.d.ts",
33
+ "version": "1.0.0",
34
+ "scripts": {
35
+ "build": "tsc"
36
+ }
37
+ }