From 73bf0c3782f75ec1c5e70b83951a28bb93e062e8 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Mon, 6 Oct 2025 12:13:22 +0200 Subject: [PATCH] fix: allow TS `.svelte.ts` modules --- .changeset/ready-lines-remain.md | 5 +++++ packages/mcp-server/package.json | 5 +++-- .../src/mcp/autofixers/add-compile-issues.ts | 19 ++++++++++++++++++- .../src/mcp/autofixers/add-eslint-issues.ts | 2 +- pnpm-lock.yaml | 11 +++++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 .changeset/ready-lines-remain.md diff --git a/.changeset/ready-lines-remain.md b/.changeset/ready-lines-remain.md new file mode 100644 index 0000000..5317b0d --- /dev/null +++ b/.changeset/ready-lines-remain.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/mcp': patch +--- + +fix: allow TS `.svelte.ts` modules diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index 093d6a8..6c2125a 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -28,6 +28,7 @@ "svelte": "^5.39.2", "svelte-eslint-parser": "^1.3.2", "tmcp": "^1.13.0", + "ts-blank-space": "^0.6.2", "typescript-eslint": "^8.44.0", "valibot": "^1.1.0", "vitest": "^3.2.4", @@ -35,10 +36,10 @@ }, "devDependencies": { "@anthropic-ai/sdk": "^0.65.0", - "dotenv": "^17.2.3", "@sveltejs/kit": "^2.42.2", "@types/eslint-scope": "^8.3.2", "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.44.0" + "@typescript-eslint/types": "^8.44.0", + "dotenv": "^17.2.3" } } diff --git a/packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts b/packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts index 2eb9efb..92c6891 100644 --- a/packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts +++ b/packages/mcp-server/src/mcp/autofixers/add-compile-issues.ts @@ -1,4 +1,6 @@ -import { compile } from 'svelte/compiler'; +import { compile as compile_component, compileModule } from 'svelte/compiler'; +import { extname } from 'path'; +import ts from 'ts-blank-space'; export function add_compile_issues( content: { issues: string[]; suggestions: string[] }, @@ -6,6 +8,21 @@ export function add_compile_issues( desired_svelte_version: number, filename = 'Component.svelte', ) { + let compile = compile_component; + const extension = extname(filename); + if (extension !== '.svelte') { + compile = compileModule; + // compile module doesn't accept .ts files so we need to transpile them first with ts-blank-space + // a fast and lightweight typescript transpiler that can strips types replacing them with white spaces + // so the code positions are not affected + if (extension === '.ts') { + code = ts(code, (node) => { + content.issues.push( + `The provided file is a module but it contains invalid TypeScript code: ${node.getText()} at ${node.getStart()}`, + ); + }); + } + } const compilation_result = compile(code, { filename: filename || 'Component.svelte', generate: false, diff --git a/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts b/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts index 6b21ff4..63d28e5 100644 --- a/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts +++ b/packages/mcp-server/src/mcp/autofixers/add-eslint-issues.ts @@ -12,7 +12,7 @@ function base_config(svelte_config: Config): ESLint.Options['baseConfig'] { return [ ...svelte.configs.recommended, { - files: ['*.svelte'], + files: ['*.svelte', '*.svelte.ts', '*.svelte.js'], rules: { 'no-self-assign': 'warn', 'svelte/infinite-reactive-loop': 'warn', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea686c4..ba011e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,6 +177,9 @@ importers: tmcp: specifier: ^1.13.0 version: 1.14.0(typescript@5.9.2) + ts-blank-space: + specifier: ^0.6.2 + version: 0.6.2 typescript-eslint: specifier: ^8.44.0 version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) @@ -3719,6 +3722,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-blank-space@0.6.2: + resolution: {integrity: sha512-hZjcHdHrveEKI67v8OzI90a1bizgoDkY7ekE4fH89qJhZgxvmjfBOv98aibCU7OpKbvV3R9p/qd3DrzZqT1cFQ==} + engines: {node: '>=18.0.0'} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -7586,6 +7593,10 @@ snapshots: dependencies: typescript: 5.9.2 + ts-blank-space@0.6.2: + dependencies: + typescript: 5.9.2 + ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1