diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ba038c8..a93247b 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "ZixuanChen.vitest-explorer"] + "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "vitest.explorer"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index dc30acb..e93afe4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "typescript.preferences.importModuleSpecifier": "relative", "javascript.preferences.importModuleSpecifier": "relative", diff --git a/examples/nextjs/package-lock.json b/examples/nextjs/package-lock.json index 26d9055..2364896 100644 --- a/examples/nextjs/package-lock.json +++ b/examples/nextjs/package-lock.json @@ -15,16 +15,16 @@ "next": "13.4.1", "react": "18.2.0", "react-dom": "18.2.0", - "typescript": "^5.3.0" + "typescript": "^5.7.2" } }, "../..": { "name": "@mizdra/typescript-plugin-asset", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { - "@volar/language-core": "~2.0.1", - "@volar/typescript": "~2.0.1-patch.1", + "@volar/language-core": "~2.4.10", + "@volar/typescript": "~2.4.10", "change-case": "^4.1.2" }, "devDependencies": { @@ -32,12 +32,12 @@ "@mizdra/prettier-config-mizdra": "^1.0.0", "@tsconfig/node18": "^18.2.2", "@tsconfig/strictest": "^2.0.2", - "@types/eslint": "^8.37.0", + "@types/eslint": "^9.6.0", "@types/node": "^18.18.8", "eslint": "^8.38.0", - "minimatch": "^9.0.3", + "minimatch": "^10.0.1", "npm-run-all": "^4.1.5", - "prettier": "^2.8.8", + "prettier": "^3.2.5", "typescript": "^5.0.4", "vitest": "^0.30.1", "vitest-github-actions-reporter": "^0.10.0" @@ -463,9 +463,10 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -491,15 +492,15 @@ "@mizdra/prettier-config-mizdra": "^1.0.0", "@tsconfig/node18": "^18.2.2", "@tsconfig/strictest": "^2.0.2", - "@types/eslint": "^8.37.0", + "@types/eslint": "^9.6.0", "@types/node": "^18.18.8", - "@volar/language-core": "~2.0.1", - "@volar/typescript": "~2.0.1-patch.1", + "@volar/language-core": "~2.4.10", + "@volar/typescript": "~2.4.10", "change-case": "^4.1.2", "eslint": "^8.38.0", - "minimatch": "^9.0.3", + "minimatch": "^10.0.1", "npm-run-all": "^4.1.5", - "prettier": "^2.8.8", + "prettier": "^3.2.5", "typescript": "^5.0.4", "vitest": "^0.30.1", "vitest-github-actions-reporter": "^0.10.0" @@ -733,9 +734,9 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" }, "zod": { "version": "3.21.4", diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 96519b7..5856f83 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -18,6 +18,6 @@ "next": "13.4.1", "react": "18.2.0", "react-dom": "18.2.0", - "typescript": "^5.3.0" + "typescript": "^5.7.2" } } diff --git a/package-lock.json b/package-lock.json index 9bd7901..38d4d7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.1.2", "license": "MIT", "dependencies": { - "@volar/language-core": "~2.0.2", - "@volar/typescript": "~2.0.2", + "@volar/language-core": "~2.4.10", + "@volar/typescript": "~2.4.10", "change-case": "^4.1.2" }, "devDependencies": { @@ -1075,28 +1075,29 @@ } }, "node_modules/@volar/language-core": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.0.2.tgz", - "integrity": "sha512-sFtXrTDu59wNrUodrOzf62XpVpLAj47vT9P5dbcLxv3YfmbbW8Ssk9aLdqTksKDMhIe+hJVKrQm4UqBJ8iXaig==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz", + "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==", + "license": "MIT", "dependencies": { - "@volar/source-map": "2.0.2" + "@volar/source-map": "2.4.10" } }, "node_modules/@volar/source-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.0.2.tgz", - "integrity": "sha512-jzEQwaAXIq7YJUCU6kvJ0aCfesu/cXT0YrSLxdGa+zxeMa8Q0DtWJE4RlIrvaEtowf9MpcNV7wBXKu4i3R9oTw==", - "dependencies": { - "muggle-string": "^0.4.0" - } + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz", + "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==", + "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.0.2.tgz", - "integrity": "sha512-lcCrYdg1ZgKZVm0mnk7pOxBGrojZk/YaeFJdxLH0gd/Kd13Go7uNvfotlYSGQshwHKcbJ0zaqY0et9w9oW1yyA==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz", + "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==", + "license": "MIT", "dependencies": { - "@volar/language-core": "2.0.2", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.4.10", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "node_modules/acorn": { @@ -3473,11 +3474,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" - }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -5308,6 +5304,12 @@ "vitest": ">=0.28.5" } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, "node_modules/well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", @@ -6075,28 +6077,26 @@ } }, "@volar/language-core": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.0.2.tgz", - "integrity": "sha512-sFtXrTDu59wNrUodrOzf62XpVpLAj47vT9P5dbcLxv3YfmbbW8Ssk9aLdqTksKDMhIe+hJVKrQm4UqBJ8iXaig==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz", + "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==", "requires": { - "@volar/source-map": "2.0.2" + "@volar/source-map": "2.4.10" } }, "@volar/source-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.0.2.tgz", - "integrity": "sha512-jzEQwaAXIq7YJUCU6kvJ0aCfesu/cXT0YrSLxdGa+zxeMa8Q0DtWJE4RlIrvaEtowf9MpcNV7wBXKu4i3R9oTw==", - "requires": { - "muggle-string": "^0.4.0" - } + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz", + "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==" }, "@volar/typescript": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.0.2.tgz", - "integrity": "sha512-lcCrYdg1ZgKZVm0mnk7pOxBGrojZk/YaeFJdxLH0gd/Kd13Go7uNvfotlYSGQshwHKcbJ0zaqY0et9w9oW1yyA==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz", + "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==", "requires": { - "@volar/language-core": "2.0.2", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.4.10", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "acorn": { @@ -7907,11 +7907,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" - }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -9238,6 +9233,11 @@ "@actions/core": "^1.10.0" } }, + "vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + }, "well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", diff --git a/package.json b/package.json index d4bd32a..3b1b42f 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "dist" ], "dependencies": { - "@volar/language-core": "~2.0.2", - "@volar/typescript": "~2.0.2", + "@volar/language-core": "~2.4.10", + "@volar/typescript": "~2.4.10", "change-case": "^4.1.2" }, "peerDependencies": { diff --git a/src/index.ts b/src/index.ts index 74dbc76..773ec97 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,10 +7,10 @@ export = createLanguageServicePlugin((ts, info) => { if (!info.project.fileExists(assetPluginOptions.tsConfigPath)) { // project name not a tsconfig path, this is a inferred project - return []; + return { languagePlugins: [] }; } const assetLanguage = createAssetLanguage(ts.sys, assetPluginOptions); - return [assetLanguage]; + return { languagePlugins: [assetLanguage] }; }); diff --git a/src/language-service/language.ts b/src/language-service/language.ts index 0f8a176..7714a61 100644 --- a/src/language-service/language.ts +++ b/src/language-service/language.ts @@ -1,56 +1,62 @@ import path from 'node:path'; import type { LanguagePlugin } from '@volar/language-core'; -import type * as ts from 'typescript/lib/tsserverlibrary'; +import type {} from '@volar/typescript'; +import ts from 'typescript/lib/tsserverlibrary'; import { getDtsContent } from '../dts'; import { AssetPluginOptions } from '../option'; -export function createAssetLanguage(sys: ts.System, assetPluginOptions: AssetPluginOptions): LanguagePlugin { +export function createAssetLanguage(sys: ts.System, assetPluginOptions: AssetPluginOptions): LanguagePlugin { return { - createVirtualCode(fileId) { - const fileName = fileId.includes('://') ? fileId.split('://')[1] ?? '' : fileId; - if ( - isMatchFile(fileName, assetPluginOptions.extensions, assetPluginOptions.exclude, assetPluginOptions.include) - ) { - const dtsContent = getDtsContent( - fileName, - assetPluginOptions.exportedNameCase, - assetPluginOptions.exportedNamePrefix, - ); - return { - id: 'main', - mappings: [], - embeddedCodes: [], - languageId: 'typescript', - snapshot: { - getText: (start, end) => dtsContent.substring(start, end), - getLength: () => dtsContent.length, - getChangeRange: () => undefined, - }, - }; - } + getLanguageId(scriptId) { + if (isMatchFile(scriptId)) return 'asset'; return undefined; }, - updateVirtualCode(_fileId, virtualCode) { - return virtualCode; // asset file content update does not affect virtual code + createVirtualCode(scriptId, languageId) { + if (languageId !== 'asset') return undefined; + const dtsContent = getDtsContent( + scriptId, + assetPluginOptions.exportedNameCase, + assetPluginOptions.exportedNamePrefix, + ); + return { + id: 'main', + languageId: 'asset', + snapshot: { + getText: (start, end) => dtsContent.substring(start, end), + getLength: () => dtsContent.length, + getChangeRange: () => undefined, + }, + mappings: [], + }; }, typescript: { - extraFileExtensions: assetPluginOptions.extensions.map((ext) => ({ - extension: ext.slice(1), - isMixedContent: true, - scriptKind: 7, - })), - getScript(virtualCode) { + extraFileExtensions: assetPluginOptions.extensions.map((ext) => { + return { + extension: ext.slice(1), + isMixedContent: true, + scriptKind: ts.ScriptKind.TS, + }; + }), + getServiceScript(root) { return { - code: virtualCode, - extension: '.ts', - scriptKind: 3, + code: root, + extension: ts.Extension.Ts, + scriptKind: ts.ScriptKind.TS, }; }, }, }; - function isMatchFile(fileName: string, extensions: string[], exclude: string[], include: string[]): boolean { - if (!extensions.includes(path.extname(fileName))) return false; - return sys.readDirectory(path.dirname(fileName), extensions, exclude, include, 1).includes(fileName); + function isMatchFile(fileName: string): boolean { + if (!assetPluginOptions.extensions.includes(path.extname(fileName))) return false; + return sys + .readDirectory( + path.dirname(fileName), + assetPluginOptions.extensions, + assetPluginOptions.exclude, + assetPluginOptions.include, + 1, + ) + .includes(fileName); } }