diff --git a/packages/client/package.json b/packages/client/package.json index a63fa9171..71d39a6ec 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -51,6 +51,10 @@ "./editorApp": { "types": "./lib/editorApp/index.d.ts", "default": "./lib/editorApp/index.js" + }, + "./debugger": { + "types": "./lib/debugger/index.d.ts", + "default": "./lib/debugger/index.js" } }, "typesVersions": { @@ -78,6 +82,9 @@ ], "editorApp": [ "lib/editorApp/index" + ], + "debugger": [ + "lib/debugger/index" ] } }, diff --git a/packages/examples/src/debugger/client/debugger.ts b/packages/client/src/debugger/index.ts similarity index 71% rename from packages/examples/src/debugger/client/debugger.ts rename to packages/client/src/debugger/index.ts index 0d7a99959..11ece80a7 100644 --- a/packages/examples/src/debugger/client/debugger.ts +++ b/packages/client/src/debugger/index.ts @@ -3,14 +3,48 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import * as vscode from 'vscode'; +import { RegisteredMemoryFile } from '@codingame/monaco-vscode-files-service-override'; +import type { Logger } from 'monaco-languageclient/common'; import type { ExtensionConfig } from 'monaco-languageclient/vscodeApiWrapper'; -import type { ConfigParams, InitMessage } from '../common/definitions.js'; +import * as vscode from 'vscode'; +import { Uri } from 'vscode'; // This is derived from: // https://github.com/CodinGame/monaco-vscode-api/blob/main/demo/src/features/debugger.ts // The client configuration is generic and can be used for a another language +export type FileDefinition = { + path: string; + code: string; + uri: Uri; +} + +export type InitMessage = { + id: 'init', + files: Record + defaultFile: string; + debuggerExecCall: string; +}; + +export type ConfigParams = { + extensionName: string; + version: string; + publisher: string; + languageId: string; + documentSelector: string[]; + homeDir: string; + workspaceRoot: string; + workspaceFile: Uri; + htmlContainer: HTMLElement; + protocol: 'ws' | 'wss'; + hostname: string; + port: number; + files: Map; + defaultFile: string; + helpContainerCmd: string; + debuggerExecCall: string; +} + export const provideDebuggerExtensionConfig = (config: ConfigParams): ExtensionConfig => { const filesOrContents = new Map(); filesOrContents.set('./extension.js', '// nothing'); @@ -18,8 +52,8 @@ export const provideDebuggerExtensionConfig = (config: ConfigParams): ExtensionC return { config: { name: config.extensionName, - publisher: 'TypeFox', - version: '1.0.0', + publisher: config.publisher, + version: config.version, engines: { vscode: '*' }, @@ -47,7 +81,7 @@ export const provideDebuggerExtensionConfig = (config: ConfigParams): ExtensionC }; }; -export const configureDebugging = async (api: typeof vscode, config: ConfigParams) => { +export const configureDebugging = async (api: typeof vscode, config: ConfigParams, logger?: Logger) => { class WebsocketDebugAdapter implements vscode.DebugAdapter { private websocket: WebSocket; @@ -93,7 +127,7 @@ export const configureDebugging = async (api: typeof vscode, config: ConfigParam debuggerExecCall: config.debuggerExecCall }; for (const [name, fileDef] of config.files.entries()) { - console.log(`Found: ${name} Sending file: ${fileDef.path}`); + logger?.info(`Found: ${name} Sending file: ${fileDef.path}`); initMessage.files[name] = { path: fileDef.path, code: fileDef.code, @@ -105,10 +139,30 @@ export const configureDebugging = async (api: typeof vscode, config: ConfigParam // eslint-disable-next-line @typescript-eslint/no-explicit-any adapter.onDidSendMessage((message: any) => { if (message.type === 'event' && message.event === 'output') { - console.log('OUTPUT', message.body.output); + logger?.info('OUTPUT', message.body.output); } }); return new api.DebugAdapterInlineImplementation(adapter); } }); }; + +export const createDebugLaunchConfigFile = (workspacePath: string, type: string) => { + return new RegisteredMemoryFile( + Uri.file(`${workspacePath}/.vscode/launch.json`), + JSON.stringify( + { + version: '0.2.0', + configurations: [ + { + name: 'Debugger: Lauch', + type, + request: 'attach', + } + ] + }, + null, + 2 + ) + ); +}; diff --git a/packages/examples/resources/debugger/Dockerfile b/packages/examples/resources/debugger/Dockerfile index 465b8a348..0c6fa2178 100644 --- a/packages/examples/resources/debugger/Dockerfile +++ b/packages/examples/resources/debugger/Dockerfile @@ -2,8 +2,8 @@ FROM ghcr.io/graalvm/graalpy-community:24 RUN curl https://get.volta.sh | bash ENV VOLTA_FEATURE_PNPM=1 -ENV VOLTA_HOME "/root/.volta" -ENV PATH "$VOLTA_HOME/bin:$PATH" +ENV VOLTA_HOME="/root/.volta" +ENV PATH="$VOLTA_HOME/bin:$PATH" RUN volta install node@22 diff --git a/packages/examples/resources/debugger/package.json b/packages/examples/resources/debugger/package.json index 192920fd9..f0e5a36bd 100644 --- a/packages/examples/resources/debugger/package.json +++ b/packages/examples/resources/debugger/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "express": "~4.21.2", + "monaco-languageclient": "~10.1.0", "ws": "~8.18.0" }, "devDependencies": { diff --git a/packages/examples/src/debugger/common/definitions.ts b/packages/examples/src/debugger/common/definitions.ts deleted file mode 100644 index 03cb6a098..000000000 --- a/packages/examples/src/debugger/common/definitions.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) 2024 TypeFox and others. - * Licensed under the MIT License. See LICENSE in the package root for license information. - * ------------------------------------------------------------------------------------------ */ - -import { RegisteredMemoryFile } from '@codingame/monaco-vscode-files-service-override'; -import { Uri } from 'vscode'; - -export type FileDefinition = { - path: string; - code: string; - uri: Uri; -} - -export type InitMessage = { - id: 'init', - files: Record - defaultFile: string; - debuggerExecCall: string; -}; - -export type ConfigParams = { - extensionName: string; - languageId: string; - documentSelector: string[]; - homeDir: string; - workspaceRoot: string; - workspaceFile: Uri; - htmlContainer: HTMLElement; - protocol: 'ws' | 'wss'; - hostname: string; - port: number; - files: Map; - defaultFile: string; - helpContainerCmd: string; - debuggerExecCall: string; -} - -export const createDebugLaunchConfigFile = (workspacePath: string, type: string) => { - return new RegisteredMemoryFile( - Uri.file(`${workspacePath}/.vscode/launch.json`), - JSON.stringify( - { - version: '0.2.0', - configurations: [ - { - name: 'Debugger: Lauch', - type, - request: 'attach', - } - ] - }, - null, - 2 - ) - ); -}; - diff --git a/packages/examples/src/debugger/server/debugServer.ts b/packages/examples/src/debugger/server/debugServer.ts index a9770c334..91cedaf6b 100644 --- a/packages/examples/src/debugger/server/debugServer.ts +++ b/packages/examples/src/debugger/server/debugServer.ts @@ -8,7 +8,7 @@ import * as fs from 'node:fs'; import { exec } from 'node:child_process'; import express from 'express'; import { WebSocketServer } from 'ws'; -import type { InitMessage } from '../common/definitions.js'; +import type { InitMessage } from 'monaco-languageclient/debugger'; import { DAPSocket } from './DAPSocket.js'; // This is derived from: diff --git a/packages/examples/src/python/client/config.ts b/packages/examples/src/python/client/config.ts index 8859cff76..33c074d51 100644 --- a/packages/examples/src/python/client/config.ts +++ b/packages/examples/src/python/client/config.ts @@ -22,6 +22,7 @@ import getBannerServiceOverride from '@codingame/monaco-vscode-view-banner-servi import getStatusBarServiceOverride from '@codingame/monaco-vscode-view-status-bar-service-override'; import getTitleBarServiceOverride from '@codingame/monaco-vscode-view-title-bar-service-override'; import { createUrl } from 'monaco-languageclient/common'; +import { createDebugLaunchConfigFile, provideDebuggerExtensionConfig, type ConfigParams, type FileDefinition } from 'monaco-languageclient/debugger'; import type { EditorAppConfig } from 'monaco-languageclient/editorApp'; import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper'; import { createDefaultLocaleConfiguration } from 'monaco-languageclient/vscodeApiLocales'; @@ -34,14 +35,14 @@ import badPyCode from '../../../resources/python/bad.py?raw'; import helloPyCode from '../../../resources/python/hello.py?raw'; import hello2PyCode from '../../../resources/python/hello2.py?raw'; import { createDefaultWorkspaceContent } from '../../common/client/utils.js'; -import { provideDebuggerExtensionConfig } from '../../debugger/client/debugger.js'; -import { createDebugLaunchConfigFile, type ConfigParams, type FileDefinition } from '../../debugger/common/definitions.js'; export const createDefaultConfigParams = (homeDir: string, htmlContainer: HTMLElement): ConfigParams => { const files = new Map(); const workspaceRoot = `${homeDir}/workspace`; const configParams: ConfigParams = { extensionName: 'debugger-py-client', + publisher: 'TypeFox', + version: '1.0.0', languageId: 'python', documentSelector: ['python', 'py'], homeDir, diff --git a/packages/examples/src/python/client/main.ts b/packages/examples/src/python/client/main.ts index b4eabb6b2..6d59da50a 100644 --- a/packages/examples/src/python/client/main.ts +++ b/packages/examples/src/python/client/main.ts @@ -8,7 +8,7 @@ import { EditorApp } from 'monaco-languageclient/editorApp'; import { LanguageClientWrapper } from 'monaco-languageclient/lcwrapper'; import { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper'; import * as vscode from 'vscode'; -import { configureDebugging } from '../../debugger/client/debugger.js'; +import { configureDebugging } from 'monaco-languageclient/debugger'; import { createPythonAppConfig } from './config.js'; export const runPythonWrapper = async () => { diff --git a/packages/examples/src/python/client/reactPython.tsx b/packages/examples/src/python/client/reactPython.tsx index 4b9f78d4d..9b0905ab6 100644 --- a/packages/examples/src/python/client/reactPython.tsx +++ b/packages/examples/src/python/client/reactPython.tsx @@ -9,7 +9,7 @@ import type { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrap import React from 'react'; import ReactDOM from 'react-dom/client'; import * as vscode from 'vscode'; -import { configureDebugging } from '../../debugger/client/debugger.js'; +import { configureDebugging } from 'monaco-languageclient/debugger'; import { createPythonAppConfig } from './config.js'; export const runPythonReact = async () => {