diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000000..a9fd8c5cb4 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,29 @@ +name: Copilot Setup Steps + +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +permissions: + contents: read + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - run: pnpm install diff --git a/.vscode/settings.json b/.vscode/settings.json index 28d945c5b2..f64fd89dc2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,11 +13,6 @@ "editor.defaultFormatter": "dprint.dprint" }, "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": "always" - }, - "editor.detectIndentation": false, - "editor.insertSpaces": false, "files.exclude": { "packages/*/*.d.ts": true, "packages/*/*.js": true, @@ -26,7 +21,5 @@ "packages/*/lib/**/*.js": true, "packages/*/lib/**/*.map": true }, - "json.format.keepLines": true, - "typescript.format.semicolons": "insert", "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/extensions/vscode/index.ts b/extensions/vscode/index.ts index 2a2c8aee63..c1aadde72c 100644 --- a/extensions/vscode/index.ts +++ b/extensions/vscode/index.ts @@ -16,7 +16,7 @@ import { } from 'reactive-vscode'; import * as vscode from 'vscode'; import { config } from './lib/config'; -import { activate as activateWelcome } from './lib/welcome'; +import * as welcome from './lib/welcome'; let client: lsp.BaseLanguageClient | undefined; let needRestart = false; @@ -40,7 +40,7 @@ for ( } } -export const { activate, deactivate } = defineExtension(() => { +export = defineExtension(() => { const context = extensionContext.value!; const volarLabs = createLabsInfo(); const activeTextEditor = useActiveTextEditor(); @@ -98,9 +98,10 @@ export const { activate, deactivate } = defineExtension(() => { activateAutoInsertion(selectors, client); activateDocumentDropEdit(selectors, client); + welcome.activate(context); }, { immediate: true }); - activateWelcome(context); + useCommand('vue.welcome', () => welcome.execute(context)); useCommand('vue.action.restartServer', async () => { await executeCommand('typescript.restartTsServer'); await client?.stop(); @@ -161,11 +162,10 @@ function launch(context: vscode.ExtensionContext) { command, args, { isAsync: true, lowPriority: true }, - ).then(res => { - client.sendNotification('tsserver/response', [seq, res?.body]); - }, () => { - client.sendNotification('tsserver/response', [seq, undefined]); - }); + ).then( + res => client.sendNotification('tsserver/response', [seq, res?.body]), + () => client.sendNotification('tsserver/response', [seq, undefined]), + ); }); client.start(); @@ -182,9 +182,9 @@ else { const extensionJsPath = require.resolve('./dist/extension.js', { paths: [tsExtension.extensionPath], }); + const vuePluginName = require('./package.json').contributes.typescriptServerPlugins[0].name; - // @ts-expect-error - fs.readFileSync = (...args) => { + fs.readFileSync = (...args: any[]) => { if (args[0] === extensionJsPath) { let text = readFileSync(...args) as string; @@ -193,7 +193,7 @@ else { 'languages:Array.isArray(e.languages)', [ 'languages:', - `e.name==='vue-typescript-plugin-pack'?[${ + `e.name==='${vuePluginName}'?[${ config.server.includeLanguages .map(lang => `'${lang}'`) .join(',') @@ -214,7 +214,6 @@ else { ); // sort plugins for johnsoncodehk.tsslint, zardoy.ts-essential-plugins - const vuePluginName = require('./package.json').contributes.typescriptServerPlugins[0].name; text = text.replace( '"--globalPlugins",i.plugins', s => s + `.sort((a,b)=>(b.name==="${vuePluginName}"?-1:0)-(a.name==="${vuePluginName}"?-1:0))`, diff --git a/extensions/vscode/lib/generated-meta.ts b/extensions/vscode/lib/generated-meta.ts index 9b070f905b..15a5674918 100644 --- a/extensions/vscode/lib/generated-meta.ts +++ b/extensions/vscode/lib/generated-meta.ts @@ -4,8 +4,8 @@ // Meta info export const publisher = 'Vue'; export const name = 'volar'; -export const version = '3.0.5'; -export const displayName = 'Vue.js'; +export const version = '3.0.6'; +export const displayName = 'Vue (Official)'; export const description = 'Language Support for Vue'; export const extensionId = `${publisher}.${name}`; diff --git a/extensions/vscode/lib/welcome.ts b/extensions/vscode/lib/welcome.ts index 782a6ef45c..71e9ba8d80 100644 --- a/extensions/vscode/lib/welcome.ts +++ b/extensions/vscode/lib/welcome.ts @@ -1,4 +1,3 @@ -import { useCommand } from 'reactive-vscode'; import * as vscode from 'vscode'; const welcomeVersion = '3.0.6'; @@ -6,47 +5,42 @@ const welcomeVersion = '3.0.6'; let panel: vscode.WebviewPanel | undefined; export function activate(context: vscode.ExtensionContext) { - useCommand('vue.welcome', () => { - if (panel) { - panel.reveal(vscode.ViewColumn.One); - return; - } - - panel = vscode.window.createWebviewPanel( - 'vue.welcome', - 'Welcome to Vue', - vscode.ViewColumn.One, - { enableScripts: true }, - ); - - panel.webview.html = getWelcomeHtml(context); - panel.webview.onDidReceiveMessage(message => { - switch (message.command) { - case 'verifySponsor': - vscode.commands.executeCommand('vue.action.verify'); - break; - case 'toggleShowUpdates': - context.globalState.update('vue.showUpdates', message.value); - break; - } - }); - - panel.onDidDispose(() => { - panel = undefined; - }); - }); - if ( - context.globalState.get('vue.showUpdates', true) + context.globalState.get('vue.showUpdates', true) && context.globalState.get('vue-welcome') !== welcomeVersion ) { context.globalState.update('vue-welcome', welcomeVersion); - vscode.commands.executeCommand('vue.welcome'); + execute(context); } } +export function execute(context: vscode.ExtensionContext) { + if (panel) { + panel.reveal(vscode.ViewColumn.One); + return; + } + panel = vscode.window.createWebviewPanel( + 'vue.welcome', + 'Welcome to Vue', + vscode.ViewColumn.One, + { enableScripts: true }, + ); + panel.webview.html = getWelcomeHtml(context); + panel.webview.onDidReceiveMessage(message => { + switch (message.command) { + case 'verifySponsor': + vscode.commands.executeCommand('vue.action.verify'); + break; + case 'toggleShowUpdates': + context.globalState.update('vue.showUpdates', message.value); + break; + } + }); + panel.onDidDispose(() => panel = undefined); +} + function getWelcomeHtml(context: vscode.ExtensionContext) { - const version = context.extension.packageJSON.version; + const { version, displayName } = context.extension.packageJSON; return /* HTML */ ` @@ -54,7 +48,7 @@ function getWelcomeHtml(context: vscode.ExtensionContext) { - Vue.js + ${displayName} + + diff --git a/tsconfig.base.json b/tsconfig.base.json index 0112fa39f7..8e7bf27af5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -10,7 +10,8 @@ "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": false, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "noUncheckedIndexedAccess": true }, "include": [] } diff --git a/tsslint.config.ts b/tsslint.config.ts index 39ef54c370..68e4570936 100644 --- a/tsslint.config.ts +++ b/tsslint.config.ts @@ -95,6 +95,7 @@ export default defineConfig({ fixStyle: 'inline-type-imports', }], '@typescript-eslint/no-unnecessary-type-assertion': true, + '@typescript-eslint/no-unnecessary-condition': true, }), 'missing-dependency'({ typescript: ts, file, program, report }) { const { noEmit } = program.getCompilerOptions(); @@ -125,7 +126,7 @@ export default defineConfig({ && !node.moduleSpecifier.text.startsWith('./') && !node.moduleSpecifier.text.startsWith('../') ) { - let moduleName = node.moduleSpecifier.text.split('/')[0]; + let moduleName = node.moduleSpecifier.text.split('/')[0]!; if (moduleName.startsWith('@')) { moduleName += '/' + node.moduleSpecifier.text.split('/')[1]; }