@eclipse-docks/extension-python-runtime 0.7.136 → 0.7.137

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/dist/index.js CHANGED
@@ -9,7 +9,7 @@ extensionRegistry.registerExtension({
9
9
  id: pkg.name,
10
10
  name: t.EXT_PYTHONRUNTIME_NAME,
11
11
  description: t.EXT_PYTHONRUNTIME_DESC,
12
- loader: () => Promise.all([import("./python-runtime-extension-CtuvYHGh.js"), import("./commands-DGgiRbdx.js")]),
12
+ loader: () => Promise.all([import("./python-runtime-extension-CS8X5GzU.js"), import("./commands-DGgiRbdx.js")]),
13
13
  icon: "docks python",
14
14
  dependencies: ["@eclipse-docks/extension-terminal", "@eclipse-docks/extension-monaco-editor"]
15
15
  });
@@ -8,6 +8,7 @@ import { customElement, property, state } from "lit/decorators.js";
8
8
  import { createRef, ref } from "lit/directives/ref.js";
9
9
  import _decorate from "@oxc-project/runtime/helpers/decorate";
10
10
  import { styleMap } from "lit/directives/style-map.js";
11
+ import "@eclipse-docks/extension-monaco-editor/widget";
11
12
  //#region src/python-editor.ts
12
13
  var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
13
14
  constructor(..._args) {
@@ -215,4 +216,4 @@ _decorate([state()], DocksPythonEditor.prototype, "pyVersion", void 0);
215
216
  DocksPythonEditor = _decorate([customElement("docks-python-editor")], DocksPythonEditor);
216
217
  //#endregion
217
218
 
218
- //# sourceMappingURL=python-editor-DB7fB_L7.js.map
219
+ //# sourceMappingURL=python-editor-CcnC1W3P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-editor-CcnC1W3P.js","names":[],"sources":["../src/python-editor.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { DocksPart } from \"@eclipse-docks/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider } from \"@eclipse-docks/core\";\nimport '@eclipse-docks/extension-monaco-editor/widget';\nimport type { DocksMonacoWidget } from '@eclipse-docks/extension-monaco-editor/widget';\nimport { PyEnv, pythonPackageManagerService } from \"./api\";\nimport { parsePackagesFromContent, contentWithPackagesLine } from \"./editor-python-run\";\nimport { toastError } from \"@eclipse-docks/core\";\n\n@customElement(\"docks-python-editor\")\nexport class DocksPythonEditor extends DocksPart implements EditorContentProvider {\n @property({ attribute: false })\n public input?: EditorInput;\n @property({ type: Boolean })\n public readOnly = false;\n\n @state()\n private initialContent: string | undefined = undefined;\n @state()\n private initialUri: string | undefined = undefined;\n\n @state()\n private pyenv?: PyEnv;\n @state()\n private pyConnected = false;\n @state()\n private pyConnecting = false;\n @state()\n private pyVersion?: string;\n\n private widgetRef = createRef<DocksMonacoWidget>();\n\n protected async doInitUI() {\n const file = this.input!.data;\n const textContents = await file.getContents();\n this.initialContent = textContents;\n this.initialUri = file.getName();\n this.requestUpdate();\n }\n\n private _onContentChange = () => {\n this.markDirty(true);\n };\n\n save(): void {\n const value = this.widgetRef.value?.getContent() ?? \"\";\n this.input?.data.saveContents(value);\n this.markDirty(false);\n }\n\n protected doClose() {\n this.widgetRef.value?.dispose();\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = undefined;\n }\n this.pyConnected = false;\n this.pyVersion = undefined;\n }\n\n public getLanguage(): string | null {\n return \"python\";\n }\n\n public isLanguage(lang: string): boolean {\n return lang.toLowerCase() === \"python\";\n }\n\n public getContent(): string | null {\n return this.widgetRef.value?.getContent() ?? null;\n }\n\n public getSelection(): string | null {\n return this.widgetRef.value?.getSelection() ?? null;\n }\n\n public getSnippet(lines: number = 5): { snippet: string; cursorLine: number } | null {\n return this.widgetRef.value?.getSnippet(lines) ?? null;\n }\n\n public getFilePath(): string | null {\n return this.input?.data?.getWorkspacePath() ?? null;\n }\n\n public getPyEnv(): PyEnv | undefined {\n return this.pyenv;\n }\n\n private async initPyEnv(): Promise<void> {\n if (this.pyenv) return;\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyConnected = true;\n try {\n const response = await this.pyenv.execCode(\"import sys; sys.version.split()[0]\");\n this.pyVersion = response?.result || \"Unknown\";\n } catch {\n this.pyVersion = \"Unknown\";\n }\n }\n\n async connectPython(): Promise<void> {\n if (this.pyConnecting || this.pyConnected) return;\n try {\n this.pyConnecting = true;\n await this.initPyEnv();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n } finally {\n this.pyConnecting = false;\n }\n }\n\n private async runScript(): Promise<void> {\n if (!this.pyConnected || !this.pyenv) {\n await this.connectPython();\n if (!this.pyenv) return;\n }\n const content = this.getContent()?.trim();\n if (!content) {\n toastError(\"No content to run\");\n return;\n }\n try {\n const packages = parsePackagesFromContent(content);\n if (packages.length > 0) await this.pyenv.loadPackages(packages);\n await this.pyenv.execCode(content);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private updateEditorPackagesLine(packages: string[]): void {\n const content = this.getContent() ?? \"\";\n const newContent = contentWithPackagesLine(content, packages);\n if (newContent === content) return;\n this.widgetRef.value?.getModel()?.setValue(newContent);\n this.markDirty(true);\n }\n\n private openPackageManager(): void {\n if (!this.pyConnected || !this.pyenv) return;\n const content = this.getContent() ?? \"\";\n const packages = parsePackagesFromContent(content);\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv: this.pyenv,\n onPackageAdded: (name) => {\n const next = [...parsePackagesFromContent(this.getContent() ?? \"\"), name];\n this.updateEditorPackagesLine(next);\n },\n onPackageRemoved: (name) => {\n const next = parsePackagesFromContent(this.getContent() ?? \"\").filter((p) => p !== name);\n this.updateEditorPackagesLine(next);\n },\n });\n }\n\n protected renderToolbar() {\n const connectionTitle = this.pyConnecting\n ? \"Connecting to Python...\"\n : this.pyConnected\n ? \"Python Connected\"\n : \"Python Disconnected - Click to connect\";\n const connectionText = this.pyConnecting\n ? \"Connecting...\"\n : this.pyConnected && this.pyVersion\n ? `Python ${this.pyVersion}`\n : \"Not connected\";\n const iconColor = this.pyConnected\n ? \"var(--wa-color-green-40)\"\n : this.pyConnecting\n ? \"var(--wa-color-warning-500)\"\n : \"var(--wa-color-red-40)\";\n\n return html`\n <wa-button\n appearance=\"plain\"\n size=\"s\"\n style=${styleMap({ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" })}\n ?disabled=${this.pyConnecting}\n @click=${() => this.connectPython()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Python status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.runScript()}\n title=\"Run Python script\"\n >\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n `;\n }\n\n protected updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (\n changedProperties.has(\"pyConnected\") ||\n changedProperties.has(\"pyConnecting\") ||\n changedProperties.has(\"pyVersion\")\n ) {\n }\n }\n\n protected renderContent() {\n if (this.initialContent === undefined) {\n return html`<div class=\"monaco-editor-placeholder\"></div>`;\n }\n return html`\n <docks-monaco-widget\n .value=${this.initialContent}\n .uri=${this.initialUri}\n .language=${\"python\"}\n .readOnly=${this.readOnly}\n @content-change=${this._onContentChange}\n ${ref(this.widgetRef)}\n ></docks-monaco-widget>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .monaco-editor-placeholder {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-python-editor\": DocksPythonEditor;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"python-editor.d.ts","sourceRoot":"","sources":["../src/python-editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,KAAK,EAA+B,MAAM,OAAO,CAAC;AAI3D,qBACa,iBAAkB,SAAQ,SAAU,YAAW,qBAAqB;IAEtE,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB,QAAQ,UAAS;IAGxB,OAAO,CAAC,cAAc,CAAiC;IAEvD,OAAO,CAAC,UAAU,CAAiC;IAGnD,OAAO,CAAC,KAAK,CAAC,CAAQ;IAEtB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,SAAS,CAAkC;cAEnC,QAAQ;IAQxB,OAAO,CAAC,gBAAgB,CAEtB;IAEF,IAAI,IAAI,IAAI;IAMZ,SAAS,CAAC,OAAO;IAUV,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,KAAK,GAAE,MAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI7E,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,QAAQ,IAAI,KAAK,GAAG,SAAS;YAItB,SAAS;IAajB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAYtB,SAAS;IAmBvB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,kBAAkB;IAkB1B,SAAS,CAAC,aAAa;IAoDvB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAUzD,SAAS,CAAC,aAAa;IAgBvB,MAAM,CAAC,MAAM,0BAYX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ"}
1
+ {"version":3,"file":"python-editor.d.ts","sourceRoot":"","sources":["../src/python-editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,+CAA+C,CAAC;AAEvD,OAAO,EAAE,KAAK,EAA+B,MAAM,OAAO,CAAC;AAI3D,qBACa,iBAAkB,SAAQ,SAAU,YAAW,qBAAqB;IAEtE,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB,QAAQ,UAAS;IAGxB,OAAO,CAAC,cAAc,CAAiC;IAEvD,OAAO,CAAC,UAAU,CAAiC;IAGnD,OAAO,CAAC,KAAK,CAAC,CAAQ;IAEtB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,SAAS,CAAkC;cAEnC,QAAQ;IAQxB,OAAO,CAAC,gBAAgB,CAEtB;IAEF,IAAI,IAAI,IAAI;IAMZ,SAAS,CAAC,OAAO;IAUV,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,KAAK,GAAE,MAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI7E,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,QAAQ,IAAI,KAAK,GAAG,SAAS;YAItB,SAAS;IAajB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAYtB,SAAS;IAmBvB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,kBAAkB;IAkB1B,SAAS,CAAC,aAAa;IAoDvB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAUzD,SAAS,CAAC,aAAa;IAgBvB,MAAM,CAAC,MAAM,0BAYX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,qBAAqB,EAAE,iBAAiB,CAAC;KAC5C;CACJ"}
@@ -289,7 +289,7 @@ editorRegistry.registerEditorInputHandler({
289
289
  label: "Python",
290
290
  icon: "docks python",
291
291
  lazyInit: async () => {
292
- await import("./python-editor-DB7fB_L7.js");
292
+ await import("./python-editor-CcnC1W3P.js");
293
293
  },
294
294
  canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".py"),
295
295
  ranking: 1e3,
@@ -309,4 +309,4 @@ editorRegistry.registerEditorInputHandler({
309
309
  //#endregion
310
310
  export { PyEnv, pythonPackageManagerService };
311
311
 
312
- //# sourceMappingURL=python-runtime-extension-CtuvYHGh.js.map
312
+ //# sourceMappingURL=python-runtime-extension-CS8X5GzU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python-runtime-extension-CtuvYHGh.js","names":[],"sources":["../src/python-notebook-kernel.ts","../src/python-terminal-backend.ts","../src/python-runtime-extension.ts"],"sourcesContent":["import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { PyEnv } from './pyservice';\nimport { pythonPackageManagerService } from './package-manager';\n\nclass PythonNotebookKernel implements NotebookKernel {\n readonly id = 'python';\n readonly label = 'Python';\n readonly language = 'python';\n\n private pyenv: PyEnv | null = null;\n private requiredPackages: string[] = [];\n private loadedPackages = new Set<string>();\n private connectPromise: Promise<void> | null = null;\n\n async connect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (this.connectPromise) {\n await this.connectPromise;\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n const packagesToLoadAfterWait = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoadAfterWait.length === 0 || !this.pyenv) return;\n await this.pyenv.loadPackages(packagesToLoadAfterWait);\n packagesToLoadAfterWait.forEach((pkg) => this.loadedPackages.add(pkg));\n return;\n }\n\n this.connectPromise = this.doConnect(options);\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n private async doConnect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n\n if (!this.pyenv) {\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n }\n\n const packagesToLoad = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoad.length > 0) {\n await this.pyenv.loadPackages(packagesToLoad);\n packagesToLoad.forEach((pkg) => this.loadedPackages.add(pkg));\n }\n\n try {\n await this.pyenv.execCode(`\ntry:\n import matplotlib\n matplotlib.use('agg')\n import matplotlib.pyplot as plt\n import io\n import base64\n _original_show = plt.show\n _display_data = None\n def _patched_show(*args, **kwargs):\n global _display_data\n if plt.get_fignums():\n fig = plt.gcf()\n buffer = io.BytesIO()\n fig.savefig(buffer, format='png', bbox_inches='tight', dpi=100)\n buffer.seek(0)\n _display_data = base64.b64encode(buffer.read()).decode('utf-8')\n plt.close(fig)\n pass\n plt.show = _patched_show\nexcept ImportError:\n pass\n`);\n } catch {\n // matplotlib not installed\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n if (!this.pyenv) {\n await this.connect();\n }\n if (!this.pyenv) {\n return { error: 'Python kernel not initialized' };\n }\n try {\n const response = await this.pyenv.execCode(code);\n const outputParts: string[] = [];\n\n if (response && typeof response === 'object' && 'console' in response) {\n const consoleOutput = response.console;\n if (Array.isArray(consoleOutput) && consoleOutput.length > 0) {\n const filtered = consoleOutput.filter((s: unknown) => s && String(s).trim());\n if (filtered.length > 0) {\n outputParts.push(...filtered.map(String));\n }\n }\n }\n\n let imageData: string | undefined;\n try {\n const checkDisplayData = await this.pyenv.execCode(\n '_display_data if \"_display_data\" in dir() else None'\n );\n const displayResult =\n checkDisplayData && typeof checkDisplayData === 'object' && checkDisplayData !== null && 'result' in checkDisplayData\n ? (checkDisplayData as { result: unknown }).result\n : checkDisplayData;\n if (\n displayResult != null &&\n String(displayResult) !== 'None' &&\n String(displayResult) !== 'undefined'\n ) {\n imageData = String(displayResult);\n await this.pyenv.execCode('_display_data = None');\n }\n } catch {\n // ignore\n }\n\n if (!imageData) {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n if (result !== undefined && result !== null && String(result) !== 'undefined') {\n const s = String(result);\n if (s && s !== 'undefined') outputParts.push(s);\n }\n }\n\n return {\n data: outputParts.length > 0 ? outputParts.join('\\n') : undefined,\n imageData,\n };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getVersion(): Promise<string | undefined> {\n if (!this.pyenv) return undefined;\n try {\n const response = await this.pyenv.getVersion();\n return response ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n interrupt(): void {\n this.pyenv?.interrupt?.();\n }\n\n async restart(): Promise<void> {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n await this.connect({ requiredPackages: this.requiredPackages });\n }\n\n openPackageManager(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void {\n if (!this.pyenv) return;\n pythonPackageManagerService.showPackageManager({\n packages: context?.requiredPackages ?? [],\n pyenv: this.pyenv,\n onPackageAdded: context?.onPackageAdded,\n onPackageRemoved: context?.onPackageRemoved,\n });\n }\n\n close(): void {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n }\n}\n\nexport const pythonNotebookKernelContribution: NotebookKernelContribution = {\n id: 'python',\n label: 'Python',\n language: 'python',\n loadKernel: async (): Promise<NotebookKernel> => new PythonNotebookKernel(),\n};\n","import type { TerminalBackend } from '@eclipse-docks/extension-terminal/api';\nimport { LineInput } from '@eclipse-docks/extension-terminal/api';\nimport { PyEnv } from './pyservice';\n\nconst PROMPT = '>>> ';\n\nfunction formatExecResult(response: unknown): string {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n\n if (result === undefined || result === null || String(result) === 'undefined') {\n return '';\n }\n const text = String(result);\n if (!text || text === 'undefined') return '';\n if (typeof result === 'object') return JSON.stringify(result, null, 2) + '\\r\\n';\n return text + '\\r\\n';\n}\n\nexport class PythonReplBackend implements TerminalBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private pyenv: PyEnv | null = null;\n private running = false;\n private atLineStart = true;\n\n constructor() {\n this.lineInput = new LineInput((data: string) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n if (data.length > 0) {\n this.atLineStart = /[\\r\\n]$/.test(data);\n }\n }\n\n private emitPrompt(): void {\n if (!this.atLineStart) this.emit('\\r\\n');\n this.emit(PROMPT);\n }\n\n async open(): Promise<void> {\n this.emit('Initializing Python...\\r\\n');\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyenv.setStdoutCallback((text) => this.emit(text));\n this.pyenv.setStderrCallback((text) => this.emit(`\\x1b[31m${text}\\x1b[0m`));\n\n let version = '';\n try {\n version = String((await this.pyenv.getVersion()) ?? '');\n } catch {\n version = '';\n }\n\n this.emit(`Python ${version} REPL (Pyodide)\\r\\n\\r\\n`);\n this.emitPrompt();\n }\n\n close(): void {\n this.pyenv?.close();\n this.pyenv = null;\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n if (this.running) return;\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n if (!this.pyenv) {\n this.emitPrompt();\n return;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n this.emitPrompt();\n return;\n }\n\n this.running = true;\n try {\n const response = await this.pyenv.execCode(trimmed);\n const output = formatExecResult(response);\n if (output) this.emit(output);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit(`\\x1b[31m${msg}\\x1b[0m\\r\\n`);\n } finally {\n this.running = false;\n this.emitPrompt();\n }\n }\n}\n\nexport const PYTHON_REPL_PROFILE_ID = 'terminal.python-repl';\n","import {\n registerAll,\n toastInfo,\n toastError,\n editorRegistry,\n File,\n type EditorInput,\n contributionRegistry,\n} from \"@eclipse-docks/core\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"@eclipse-docks/extension-notebook\";\nimport { registerTerminalProfile } from \"@eclipse-docks/extension-terminal/api\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\ntype EditorWithLanguage = { isLanguage?(lang: string): boolean };\nimport { PyEnv } from \"./pyservice\";\nimport { pythonNotebookKernelContribution } from \"./python-notebook-kernel\";\nimport { PythonReplBackend, PYTHON_REPL_PROFILE_ID } from \"./python-terminal-backend\";\n\ncontributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, pythonNotebookKernelContribution);\n\nregisterTerminalProfile({\n id: PYTHON_REPL_PROFILE_ID,\n label: \"Python REPL\",\n icon: \"docks python\",\n create: async () => new PythonReplBackend(),\n});\n\nimport { parsePackagesFromContent } from \"./editor-python-run\";\nimport { pythonPackageManagerService } from \"./package-manager\";\n\nexport { PyEnv } from \"./pyservice\";\nexport { pythonPackageManagerService } from \"./package-manager\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Script\",\n description: \"Executes a Python script given its file path\",\n parameters: [\n { name: \"script\", description: \"the path to a Python script to run\", required: false },\n ],\n },\n handler: {\n execute: async (context: any) => {\n const script: string = context.params?.[\"script\"];\n if (!script) return;\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n await pyenv.execScript(script);\n },\n },\n});\n\nregisterAll({\n command: {\n id: \"python.openEditorPackageManager\",\n name: \"Manage packages\",\n description: \"Manage Python packages for the editor environment\",\n parameters: [],\n },\n handler: {\n canExecute: (ctx) => !!(ctx.activeEditor as EditorWithLanguage)?.isLanguage?.(\"python\"),\n execute: async (ctx) => {\n const ed = ctx.activeEditor as { getContent?: () => string; getPyEnv?: () => PyEnv | undefined } | undefined;\n if (!ed) {\n toastError(\"No active editor\");\n return;\n }\n const content = ed?.getContent?.() ?? \"\";\n const packages = parsePackagesFromContent(content);\n const pyenv = ed.getPyEnv?.();\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv,\n });\n },\n },\n});\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.python-editor\",\n label: \"Python\",\n icon: \"docks python\",\n lazyInit: async () => {\n await import(\"./python-editor\");\n },\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith(\".py\"),\n ranking: 1000,\n handle: async (input: File) => {\n const editorInput: EditorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n component: () => null as any,\n };\n\n editorInput.component = (id: string) =>\n html`<docks-python-editor id=\"${id}\" .input=${editorInput}></docks-python-editor>`;\n\n return editorInput;\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"python-runtime-extension-CS8X5GzU.js","names":[],"sources":["../src/python-notebook-kernel.ts","../src/python-terminal-backend.ts","../src/python-runtime-extension.ts"],"sourcesContent":["import type {\n NotebookExecutionResult,\n NotebookKernel,\n NotebookKernelContribution,\n} from '@eclipse-docks/extension-notebook';\nimport { TARGET_NOTEBOOK_KERNELS } from '@eclipse-docks/extension-notebook';\nimport { PyEnv } from './pyservice';\nimport { pythonPackageManagerService } from './package-manager';\n\nclass PythonNotebookKernel implements NotebookKernel {\n readonly id = 'python';\n readonly label = 'Python';\n readonly language = 'python';\n\n private pyenv: PyEnv | null = null;\n private requiredPackages: string[] = [];\n private loadedPackages = new Set<string>();\n private connectPromise: Promise<void> | null = null;\n\n async connect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (this.connectPromise) {\n await this.connectPromise;\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n const packagesToLoadAfterWait = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoadAfterWait.length === 0 || !this.pyenv) return;\n await this.pyenv.loadPackages(packagesToLoadAfterWait);\n packagesToLoadAfterWait.forEach((pkg) => this.loadedPackages.add(pkg));\n return;\n }\n\n this.connectPromise = this.doConnect(options);\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n private async doConnect(options?: { requiredPackages?: string[] }): Promise<void> {\n if (options?.requiredPackages) {\n this.requiredPackages = options.requiredPackages;\n }\n\n if (!this.pyenv) {\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n }\n\n const packagesToLoad = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));\n if (packagesToLoad.length > 0) {\n await this.pyenv.loadPackages(packagesToLoad);\n packagesToLoad.forEach((pkg) => this.loadedPackages.add(pkg));\n }\n\n try {\n await this.pyenv.execCode(`\ntry:\n import matplotlib\n matplotlib.use('agg')\n import matplotlib.pyplot as plt\n import io\n import base64\n _original_show = plt.show\n _display_data = None\n def _patched_show(*args, **kwargs):\n global _display_data\n if plt.get_fignums():\n fig = plt.gcf()\n buffer = io.BytesIO()\n fig.savefig(buffer, format='png', bbox_inches='tight', dpi=100)\n buffer.seek(0)\n _display_data = base64.b64encode(buffer.read()).decode('utf-8')\n plt.close(fig)\n pass\n plt.show = _patched_show\nexcept ImportError:\n pass\n`);\n } catch {\n // matplotlib not installed\n }\n }\n\n async execute(code: string): Promise<NotebookExecutionResult> {\n if (!this.pyenv) {\n await this.connect();\n }\n if (!this.pyenv) {\n return { error: 'Python kernel not initialized' };\n }\n try {\n const response = await this.pyenv.execCode(code);\n const outputParts: string[] = [];\n\n if (response && typeof response === 'object' && 'console' in response) {\n const consoleOutput = response.console;\n if (Array.isArray(consoleOutput) && consoleOutput.length > 0) {\n const filtered = consoleOutput.filter((s: unknown) => s && String(s).trim());\n if (filtered.length > 0) {\n outputParts.push(...filtered.map(String));\n }\n }\n }\n\n let imageData: string | undefined;\n try {\n const checkDisplayData = await this.pyenv.execCode(\n '_display_data if \"_display_data\" in dir() else None'\n );\n const displayResult =\n checkDisplayData && typeof checkDisplayData === 'object' && checkDisplayData !== null && 'result' in checkDisplayData\n ? (checkDisplayData as { result: unknown }).result\n : checkDisplayData;\n if (\n displayResult != null &&\n String(displayResult) !== 'None' &&\n String(displayResult) !== 'undefined'\n ) {\n imageData = String(displayResult);\n await this.pyenv.execCode('_display_data = None');\n }\n } catch {\n // ignore\n }\n\n if (!imageData) {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n if (result !== undefined && result !== null && String(result) !== 'undefined') {\n const s = String(result);\n if (s && s !== 'undefined') outputParts.push(s);\n }\n }\n\n return {\n data: outputParts.length > 0 ? outputParts.join('\\n') : undefined,\n imageData,\n };\n } catch (err) {\n return {\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getVersion(): Promise<string | undefined> {\n if (!this.pyenv) return undefined;\n try {\n const response = await this.pyenv.getVersion();\n return response ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n interrupt(): void {\n this.pyenv?.interrupt?.();\n }\n\n async restart(): Promise<void> {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n await this.connect({ requiredPackages: this.requiredPackages });\n }\n\n openPackageManager(\n context?: {\n requiredPackages: string[];\n onPackageAdded: (name: string) => void;\n onPackageRemoved: (name: string) => void;\n }\n ): void {\n if (!this.pyenv) return;\n pythonPackageManagerService.showPackageManager({\n packages: context?.requiredPackages ?? [],\n pyenv: this.pyenv,\n onPackageAdded: context?.onPackageAdded,\n onPackageRemoved: context?.onPackageRemoved,\n });\n }\n\n close(): void {\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = null;\n }\n this.loadedPackages.clear();\n }\n}\n\nexport const pythonNotebookKernelContribution: NotebookKernelContribution = {\n id: 'python',\n label: 'Python',\n language: 'python',\n loadKernel: async (): Promise<NotebookKernel> => new PythonNotebookKernel(),\n};\n","import type { TerminalBackend } from '@eclipse-docks/extension-terminal/api';\nimport { LineInput } from '@eclipse-docks/extension-terminal/api';\nimport { PyEnv } from './pyservice';\n\nconst PROMPT = '>>> ';\n\nfunction formatExecResult(response: unknown): string {\n const result =\n response && typeof response === 'object' && response !== null && 'result' in response\n ? (response as { result: unknown }).result\n : response;\n\n if (result === undefined || result === null || String(result) === 'undefined') {\n return '';\n }\n const text = String(result);\n if (!text || text === 'undefined') return '';\n if (typeof result === 'object') return JSON.stringify(result, null, 2) + '\\r\\n';\n return text + '\\r\\n';\n}\n\nexport class PythonReplBackend implements TerminalBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private pyenv: PyEnv | null = null;\n private running = false;\n private atLineStart = true;\n\n constructor() {\n this.lineInput = new LineInput((data: string) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n if (data.length > 0) {\n this.atLineStart = /[\\r\\n]$/.test(data);\n }\n }\n\n private emitPrompt(): void {\n if (!this.atLineStart) this.emit('\\r\\n');\n this.emit(PROMPT);\n }\n\n async open(): Promise<void> {\n this.emit('Initializing Python...\\r\\n');\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyenv.setStdoutCallback((text) => this.emit(text));\n this.pyenv.setStderrCallback((text) => this.emit(`\\x1b[31m${text}\\x1b[0m`));\n\n let version = '';\n try {\n version = String((await this.pyenv.getVersion()) ?? '');\n } catch {\n version = '';\n }\n\n this.emit(`Python ${version} REPL (Pyodide)\\r\\n\\r\\n`);\n this.emitPrompt();\n }\n\n close(): void {\n this.pyenv?.close();\n this.pyenv = null;\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n if (this.running) return;\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n if (!this.pyenv) {\n this.emitPrompt();\n return;\n }\n\n const trimmed = line.trim();\n if (!trimmed) {\n this.emitPrompt();\n return;\n }\n\n this.running = true;\n try {\n const response = await this.pyenv.execCode(trimmed);\n const output = formatExecResult(response);\n if (output) this.emit(output);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit(`\\x1b[31m${msg}\\x1b[0m\\r\\n`);\n } finally {\n this.running = false;\n this.emitPrompt();\n }\n }\n}\n\nexport const PYTHON_REPL_PROFILE_ID = 'terminal.python-repl';\n","import {\n registerAll,\n toastInfo,\n toastError,\n editorRegistry,\n File,\n type EditorInput,\n contributionRegistry,\n} from \"@eclipse-docks/core\";\nimport { TARGET_NOTEBOOK_KERNELS } from \"@eclipse-docks/extension-notebook\";\nimport { registerTerminalProfile } from \"@eclipse-docks/extension-terminal/api\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\ntype EditorWithLanguage = { isLanguage?(lang: string): boolean };\nimport { PyEnv } from \"./pyservice\";\nimport { pythonNotebookKernelContribution } from \"./python-notebook-kernel\";\nimport { PythonReplBackend, PYTHON_REPL_PROFILE_ID } from \"./python-terminal-backend\";\n\ncontributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, pythonNotebookKernelContribution);\n\nregisterTerminalProfile({\n id: PYTHON_REPL_PROFILE_ID,\n label: \"Python REPL\",\n icon: \"docks python\",\n create: async () => new PythonReplBackend(),\n});\n\nimport { parsePackagesFromContent } from \"./editor-python-run\";\nimport { pythonPackageManagerService } from \"./package-manager\";\n\nexport { PyEnv } from \"./pyservice\";\nexport { pythonPackageManagerService } from \"./package-manager\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Script\",\n description: \"Executes a Python script given its file path\",\n parameters: [\n { name: \"script\", description: \"the path to a Python script to run\", required: false },\n ],\n },\n handler: {\n execute: async (context: any) => {\n const script: string = context.params?.[\"script\"];\n if (!script) return;\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n await pyenv.execScript(script);\n },\n },\n});\n\nregisterAll({\n command: {\n id: \"python.openEditorPackageManager\",\n name: \"Manage packages\",\n description: \"Manage Python packages for the editor environment\",\n parameters: [],\n },\n handler: {\n canExecute: (ctx) => !!(ctx.activeEditor as EditorWithLanguage)?.isLanguage?.(\"python\"),\n execute: async (ctx) => {\n const ed = ctx.activeEditor as { getContent?: () => string; getPyEnv?: () => PyEnv | undefined } | undefined;\n if (!ed) {\n toastError(\"No active editor\");\n return;\n }\n const content = ed?.getContent?.() ?? \"\";\n const packages = parsePackagesFromContent(content);\n const pyenv = ed.getPyEnv?.();\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv,\n });\n },\n },\n});\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.python-editor\",\n label: \"Python\",\n icon: \"docks python\",\n lazyInit: async () => {\n await import(\"./python-editor\");\n },\n canHandle: (input: unknown) =>\n input instanceof File && input.getName().toLowerCase().endsWith(\".py\"),\n ranking: 1000,\n handle: async (input: File) => {\n const editorInput: EditorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: editorRegistry.getFileIcon(input.getName()),\n state: {},\n component: () => null as any,\n };\n\n editorInput.component = (id: string) =>\n html`<docks-python-editor id=\"${id}\" .input=${editorInput}></docks-python-editor>`;\n\n return editorInput;\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-python-runtime",
3
- "version": "0.7.136",
3
+ "version": "0.7.137",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"python-editor-DB7fB_L7.js","names":[],"sources":["../src/python-editor.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { DocksPart } from \"@eclipse-docks/core\";\nimport { css, html } from \"lit\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EditorInput, EditorContentProvider } from \"@eclipse-docks/core\";\nimport { DocksMonacoWidget } from '@eclipse-docks/extension-monaco-editor/widget';\nimport { PyEnv, pythonPackageManagerService } from \"./api\";\nimport { parsePackagesFromContent, contentWithPackagesLine } from \"./editor-python-run\";\nimport { toastError } from \"@eclipse-docks/core\";\n\n@customElement(\"docks-python-editor\")\nexport class DocksPythonEditor extends DocksPart implements EditorContentProvider {\n @property({ attribute: false })\n public input?: EditorInput;\n @property({ type: Boolean })\n public readOnly = false;\n\n @state()\n private initialContent: string | undefined = undefined;\n @state()\n private initialUri: string | undefined = undefined;\n\n @state()\n private pyenv?: PyEnv;\n @state()\n private pyConnected = false;\n @state()\n private pyConnecting = false;\n @state()\n private pyVersion?: string;\n\n private widgetRef = createRef<DocksMonacoWidget>();\n\n protected async doInitUI() {\n const file = this.input!.data;\n const textContents = await file.getContents();\n this.initialContent = textContents;\n this.initialUri = file.getName();\n this.requestUpdate();\n }\n\n private _onContentChange = () => {\n this.markDirty(true);\n };\n\n save(): void {\n const value = this.widgetRef.value?.getContent() ?? \"\";\n this.input?.data.saveContents(value);\n this.markDirty(false);\n }\n\n protected doClose() {\n this.widgetRef.value?.dispose();\n if (this.pyenv) {\n this.pyenv.close();\n this.pyenv = undefined;\n }\n this.pyConnected = false;\n this.pyVersion = undefined;\n }\n\n public getLanguage(): string | null {\n return \"python\";\n }\n\n public isLanguage(lang: string): boolean {\n return lang.toLowerCase() === \"python\";\n }\n\n public getContent(): string | null {\n return this.widgetRef.value?.getContent() ?? null;\n }\n\n public getSelection(): string | null {\n return this.widgetRef.value?.getSelection() ?? null;\n }\n\n public getSnippet(lines: number = 5): { snippet: string; cursorLine: number } | null {\n return this.widgetRef.value?.getSnippet(lines) ?? null;\n }\n\n public getFilePath(): string | null {\n return this.input?.data?.getWorkspacePath() ?? null;\n }\n\n public getPyEnv(): PyEnv | undefined {\n return this.pyenv;\n }\n\n private async initPyEnv(): Promise<void> {\n if (this.pyenv) return;\n this.pyenv = new PyEnv();\n await this.pyenv.init();\n this.pyConnected = true;\n try {\n const response = await this.pyenv.execCode(\"import sys; sys.version.split()[0]\");\n this.pyVersion = response?.result || \"Unknown\";\n } catch {\n this.pyVersion = \"Unknown\";\n }\n }\n\n async connectPython(): Promise<void> {\n if (this.pyConnecting || this.pyConnected) return;\n try {\n this.pyConnecting = true;\n await this.initPyEnv();\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n } finally {\n this.pyConnecting = false;\n }\n }\n\n private async runScript(): Promise<void> {\n if (!this.pyConnected || !this.pyenv) {\n await this.connectPython();\n if (!this.pyenv) return;\n }\n const content = this.getContent()?.trim();\n if (!content) {\n toastError(\"No content to run\");\n return;\n }\n try {\n const packages = parsePackagesFromContent(content);\n if (packages.length > 0) await this.pyenv.loadPackages(packages);\n await this.pyenv.execCode(content);\n } catch (err) {\n toastError(err instanceof Error ? err.message : String(err));\n }\n }\n\n private updateEditorPackagesLine(packages: string[]): void {\n const content = this.getContent() ?? \"\";\n const newContent = contentWithPackagesLine(content, packages);\n if (newContent === content) return;\n this.widgetRef.value?.getModel()?.setValue(newContent);\n this.markDirty(true);\n }\n\n private openPackageManager(): void {\n if (!this.pyConnected || !this.pyenv) return;\n const content = this.getContent() ?? \"\";\n const packages = parsePackagesFromContent(content);\n pythonPackageManagerService.showPackageManager({\n packages,\n pyenv: this.pyenv,\n onPackageAdded: (name) => {\n const next = [...parsePackagesFromContent(this.getContent() ?? \"\"), name];\n this.updateEditorPackagesLine(next);\n },\n onPackageRemoved: (name) => {\n const next = parsePackagesFromContent(this.getContent() ?? \"\").filter((p) => p !== name);\n this.updateEditorPackagesLine(next);\n },\n });\n }\n\n protected renderToolbar() {\n const connectionTitle = this.pyConnecting\n ? \"Connecting to Python...\"\n : this.pyConnected\n ? \"Python Connected\"\n : \"Python Disconnected - Click to connect\";\n const connectionText = this.pyConnecting\n ? \"Connecting...\"\n : this.pyConnected && this.pyVersion\n ? `Python ${this.pyVersion}`\n : \"Not connected\";\n const iconColor = this.pyConnected\n ? \"var(--wa-color-green-40)\"\n : this.pyConnecting\n ? \"var(--wa-color-warning-500)\"\n : \"var(--wa-color-red-40)\";\n\n return html`\n <wa-button\n appearance=\"plain\"\n size=\"s\"\n style=${styleMap({ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" })}\n ?disabled=${this.pyConnecting}\n @click=${() => this.connectPython()}\n title=${connectionTitle}\n >\n <wa-icon name=\"circle\" label=\"Python status\" style=${styleMap({ color: iconColor })}></wa-icon>\n ${connectionText}\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.runScript()}\n title=\"Run Python script\"\n >\n <wa-icon name=\"play\" label=\"Run\"></wa-icon>\n Run\n </wa-button>\n <wa-button\n size=\"s\"\n appearance=\"plain\"\n ?disabled=${!this.pyConnected}\n @click=${() => this.openPackageManager()}\n title=\"Manage packages\"\n >\n <wa-icon name=\"box\" label=\"Packages\"></wa-icon>\n Packages\n </wa-button>\n `;\n }\n\n protected updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (\n changedProperties.has(\"pyConnected\") ||\n changedProperties.has(\"pyConnecting\") ||\n changedProperties.has(\"pyVersion\")\n ) {\n }\n }\n\n protected renderContent() {\n if (this.initialContent === undefined) {\n return html`<div class=\"monaco-editor-placeholder\"></div>`;\n }\n return html`\n <docks-monaco-widget\n .value=${this.initialContent}\n .uri=${this.initialUri}\n .language=${\"python\"}\n .readOnly=${this.readOnly}\n @content-change=${this._onContentChange}\n ${ref(this.widgetRef)}\n ></docks-monaco-widget>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .monaco-editor-placeholder {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-python-editor\": DocksPythonEditor;\n }\n}\n"],"mappings":"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"}