@eclipse-docks/extension-python-runtime 0.7.122 → 0.7.125
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/api-DpvBDibr.js +2 -0
- package/dist/api.js +2 -2
- package/dist/{commands-D0y3XxCw.js → commands-Cn6_ogss.js} +3 -3
- package/dist/commands-Cn6_ogss.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/{package-manager-DcDiJbD3.js → package-manager-DJaTJoVI.js} +2 -2
- package/dist/package-manager-DJaTJoVI.js.map +1 -0
- package/dist/{python-editor-BpEUhgXs.js → python-editor-DYi4l3P9.js} +6 -6
- package/dist/{python-editor-BpEUhgXs.js.map → python-editor-DYi4l3P9.js.map} +1 -1
- package/dist/{python-runtime-extension-BZ3XkDRK.js → python-runtime-extension-u9NoE4Xj.js} +3 -3
- package/dist/{python-runtime-extension-BZ3XkDRK.js.map → python-runtime-extension-u9NoE4Xj.js.map} +1 -1
- package/package.json +1 -1
- package/dist/api-C6Mnm5y_.js +0 -2
- package/dist/commands-D0y3XxCw.js.map +0 -1
- package/dist/package-manager-DcDiJbD3.js.map +0 -1
package/dist/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
|
|
2
|
-
import { t as pythonPackageManagerService } from "./package-manager-
|
|
3
|
-
import "./api-
|
|
2
|
+
import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
|
|
3
|
+
import "./api-DpvBDibr.js";
|
|
4
4
|
export { PyEnv, pythonPackageManagerService };
|
|
@@ -3,8 +3,8 @@ import { registerAll, toastError } from "@eclipse-docks/core";
|
|
|
3
3
|
//#region src/commands.ts
|
|
4
4
|
registerAll({
|
|
5
5
|
command: {
|
|
6
|
-
id: "python",
|
|
7
|
-
name: "Run Python
|
|
6
|
+
id: "python.runCode",
|
|
7
|
+
name: "Run Python Code",
|
|
8
8
|
description: "Runs Python code.",
|
|
9
9
|
keyBinding: "CTRL+R",
|
|
10
10
|
parameters: [{
|
|
@@ -26,4 +26,4 @@ registerAll({
|
|
|
26
26
|
});
|
|
27
27
|
//#endregion
|
|
28
28
|
|
|
29
|
-
//# sourceMappingURL=commands-
|
|
29
|
+
//# sourceMappingURL=commands-Cn6_ogss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-Cn6_ogss.js","names":[],"sources":["../src/commands.ts"],"sourcesContent":["import { registerAll, toastError } from \"@eclipse-docks/core\";\nimport { PyEnv } from \"./pyservice\";\n\nregisterAll({\n command: {\n id: \"python.runCode\",\n name: \"Run Python Code\",\n description: \"Runs Python code.\",\n keyBinding: \"CTRL+R\",\n parameters: [\n {\n name: \"code\",\n description: \"Python code to execute\",\n required: true\n }\n ]\n },\n handler: {\n execute: async (context: any) => {\n const code: string | undefined = context.params?.code;\n if (!code) {\n toastError(\"No Python code provided.\");\n return;\n }\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n return await pyenv.execCode(code);\n }\n }\n});\n\n"],"mappings":";;;AAGA,YAAY;CACV,SAAS;EACP,IAAI;EACJ,MAAM;EACN,aAAa;EACb,YAAY;EACZ,YAAY,CACV;GACE,MAAM;GACN,aAAa;GACb,UAAU;GACX,CACF;EACF;CACD,SAAS,EACP,SAAS,OAAO,YAAiB;EAC/B,MAAM,OAA2B,QAAQ,QAAQ;AACjD,MAAI,CAAC,MAAM;AACT,cAAW,2BAA2B;AACtC;;EAEF,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC5C,SAAO,MAAM,MAAM,SAAS,KAAK;IAEpC;CACF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,9 +9,9 @@ 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-
|
|
12
|
+
loader: () => Promise.all([import("./python-runtime-extension-u9NoE4Xj.js"), import("./commands-Cn6_ogss.js")]),
|
|
13
13
|
icon: "docks python",
|
|
14
|
-
dependencies: ["@eclipse-docks/extension-terminal"]
|
|
14
|
+
dependencies: ["@eclipse-docks/extension-terminal", "@eclipse-docks/extension-monaco-editor"]
|
|
15
15
|
});
|
|
16
16
|
//#endregion
|
|
17
17
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_PYTHONRUNTIME_NAME,\n description: t.EXT_PYTHONRUNTIME_DESC,\n loader: () => Promise.all([\n import(\"./python-runtime-extension\"),\n import(\"./commands\"),\n ]),\n icon: \"docks python\",\n dependencies: [\"@eclipse-docks/extension-terminal\"],\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,QAAQ,IAAI,CACxB,OAAO,2CACP,OAAO,0BACR,CAAC;CACF,MAAM;CACN,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-docks/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_PYTHONRUNTIME_NAME,\n description: t.EXT_PYTHONRUNTIME_DESC,\n loader: () => Promise.all([\n import(\"./python-runtime-extension\"),\n import(\"./commands\"),\n ]),\n icon: \"docks python\",\n dependencies: [\"@eclipse-docks/extension-terminal\",\"@eclipse-docks/extension-monaco-editor\"],\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,QAAQ,IAAI,CACxB,OAAO,2CACP,OAAO,0BACR,CAAC;CACF,MAAM;CACN,cAAc,CAAC,qCAAoC,yCAAA;CACpD,CAAC"}
|
|
@@ -124,7 +124,7 @@ var DocksPythonPackageManager = class DocksPythonPackageManager extends LitEleme
|
|
|
124
124
|
<wa-icon name="box" style="opacity: 0.5;"></wa-icon>
|
|
125
125
|
<span class="package-name">${pkg}</span>
|
|
126
126
|
<wa-button
|
|
127
|
-
size="
|
|
127
|
+
size="s"
|
|
128
128
|
variant="text"
|
|
129
129
|
@click=${() => this.removePackage(pkg)}
|
|
130
130
|
title="Remove package">
|
|
@@ -280,4 +280,4 @@ rootContext.put("pythonPackageManagerService", pythonPackageManagerService);
|
|
|
280
280
|
//#endregion
|
|
281
281
|
export { pythonPackageManagerService as t };
|
|
282
282
|
|
|
283
|
-
//# sourceMappingURL=package-manager-
|
|
283
|
+
//# sourceMappingURL=package-manager-DJaTJoVI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager-DJaTJoVI.js","names":[],"sources":["../src/package-manager.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { PyEnv } from \"./pyservice\";\nimport { rootContext } from \"@eclipse-docks/core\";\n\nexport interface PackageManagerOptions {\n packages: string[];\n onPackageAdded?: (packageName: string) => void;\n onPackageRemoved?: (packageName: string) => void;\n pyenv?: PyEnv;\n}\n\n@customElement('docks-python-package-manager')\nexport class DocksPythonPackageManager extends LitElement {\n @property({ type: Boolean })\n open: boolean = false;\n\n @property({ type: Array })\n packages: string[] = [];\n\n @property({ attribute: false })\n pyenv?: PyEnv;\n\n @state()\n private loadingPackages: boolean = false;\n\n @state()\n private packageLoadError?: string;\n\n private onPackageAdded?: (packageName: string) => void;\n private onPackageRemoved?: (packageName: string) => void;\n\n public configure(options: PackageManagerOptions) {\n this.packages = options.packages || [];\n this.pyenv = options.pyenv;\n this.onPackageAdded = options.onPackageAdded;\n this.onPackageRemoved = options.onPackageRemoved;\n }\n\n public show() {\n this.open = true;\n }\n\n public hide() {\n this.open = false;\n }\n\n private addPackage(packageName: string) {\n if (!packageName || packageName.trim() === '') return;\n\n const trimmedName = packageName.trim();\n if (!this.packages.includes(trimmedName)) {\n this.packages = [...this.packages, trimmedName];\n this.onPackageAdded?.(trimmedName);\n }\n }\n\n private removePackage(packageName: string) {\n const index = this.packages.indexOf(packageName);\n if (index > -1) {\n this.packages = this.packages.filter(pkg => pkg !== packageName);\n this.onPackageRemoved?.(packageName);\n }\n }\n\n private async reloadPackages() {\n if (!this.pyenv) return;\n\n this.loadingPackages = true;\n this.packageLoadError = undefined;\n\n try {\n await this.pyenv.loadPackages(this.packages);\n } catch (error) {\n this.packageLoadError = String(error);\n } finally {\n this.loadingPackages = false;\n }\n }\n\n render() {\n let newPackageInput: HTMLInputElement | undefined;\n\n return html`\n <wa-dialog \n label=\"Manage Required Packages\" \n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n }}>\n <div class=\"package-manager\">\n <p class=\"package-manager-description\">\n Specify Python packages that should be automatically loaded when connecting to the kernel.\n </p>\n\n ${this.loadingPackages ? html`\n <wa-alert variant=\"primary\" open>\n <wa-icon slot=\"icon\" name=\"circle-notch\" library=\"fa\" class=\"spinning\"></wa-icon>\n Loading packages...\n </wa-alert>\n ` : ''}\n\n ${this.packageLoadError ? html`\n <wa-alert variant=\"danger\" open closable @wa-after-hide=${() => this.packageLoadError = undefined}>\n <wa-icon slot=\"icon\" name=\"exclamation-triangle\"></wa-icon>\n <strong>Package Load Error:</strong><br>\n ${this.packageLoadError}\n </wa-alert>\n ` : ''}\n\n <div class=\"package-input-group\">\n <wa-input \n placeholder=\"Package name (e.g., pandas, numpy)\" \n ${ref((el: any) => newPackageInput = el)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}>\n <wa-icon slot=\"prefix\" name=\"box\"></wa-icon>\n </wa-input>\n <wa-button \n @click=${() => {\n if (newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}\n variant=\"primary\">\n <wa-icon slot=\"prefix\" name=\"plus\"></wa-icon>\n Add\n </wa-button>\n </div>\n\n ${this.packages.length === 0 ? html`\n <div class=\"empty-state\">\n <wa-icon name=\"box\" style=\"font-size: 3rem; opacity: 0.3;\"></wa-icon>\n <p>No packages configured</p>\n <p style=\"font-size: 0.9rem; opacity: 0.7;\">Add packages above to auto-load them when the kernel connects</p>\n </div>\n ` : html`\n <div class=\"package-list\">\n <div class=\"package-list-header\">\n <strong>Required Packages (${this.packages.length})</strong>\n </div>\n ${repeat(this.packages, pkg => pkg, pkg => html`\n <div class=\"package-item\">\n <wa-icon name=\"box\" style=\"opacity: 0.5;\"></wa-icon>\n <span class=\"package-name\">${pkg}</span>\n <wa-button \n size=\"s\" \n variant=\"text\"\n @click=${() => this.removePackage(pkg)}\n title=\"Remove package\">\n <wa-icon name=\"xmark\"></wa-icon>\n </wa-button>\n </div>\n `)}\n </div>\n `}\n </div>\n <div slot=\"footer\" class=\"package-manager-footer\">\n ${this.pyenv && this.packages.length > 0 ? html`\n <wa-button \n variant=\"default\"\n @click=${() => this.reloadPackages()}\n ?disabled=${this.loadingPackages}>\n <wa-icon slot=\"prefix\" name=\"arrows-rotate\"></wa-icon>\n Reload Packages\n </wa-button>\n ` : ''}\n <wa-button \n variant=\"primary\"\n @click=${() => this.hide()}>\n Done\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .package-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n }\n\n .package-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.8;\n line-height: 1.5;\n }\n\n .package-input-group {\n display: flex;\n gap: 0.5rem;\n }\n\n .package-input-group wa-input {\n flex: 1;\n }\n\n .package-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n }\n\n .package-list-header {\n padding: 0.5rem;\n border-bottom: 1px solid var(--wa-color-outline);\n margin-bottom: 0.5rem;\n }\n\n .package-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border-radius: 4px;\n background: var(--wa-color-surface-variant);\n transition: background 0.2s;\n }\n\n .package-item:hover {\n background: var(--wa-color-surface-container-highest);\n }\n\n .package-name {\n flex: 1;\n font-family: monospace;\n font-size: 0.95rem;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .package-manager-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-outline);\n }\n\n .spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `;\n}\n\nclass PythonPackageManagerService {\n private managerInstance?: DocksPythonPackageManager;\n\n public showPackageManager(options: PackageManagerOptions): DocksPythonPackageManager {\n if (!this.managerInstance) {\n this.managerInstance = document.createElement('docks-python-package-manager') as DocksPythonPackageManager;\n document.body.appendChild(this.managerInstance);\n }\n\n this.managerInstance.configure(options);\n this.managerInstance.show();\n\n return this.managerInstance;\n }\n\n public getManager(): DocksPythonPackageManager | undefined {\n return this.managerInstance;\n }\n}\n\nexport const pythonPackageManagerService = new PythonPackageManagerService();\nrootContext.put(\"pythonPackageManagerService\", pythonPackageManagerService);\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
|
|
2
|
-
import { t as pythonPackageManagerService } from "./package-manager-
|
|
3
|
-
import "./api-
|
|
2
|
+
import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
|
|
3
|
+
import "./api-DpvBDibr.js";
|
|
4
4
|
import { n as parsePackagesFromContent, t as contentWithPackagesLine } from "./editor-python-run-Cs68X5JL.js";
|
|
5
5
|
import { DocksPart, toastError } from "@eclipse-docks/core";
|
|
6
6
|
import { css, html } from "lit";
|
|
@@ -133,7 +133,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
|
|
|
133
133
|
return html`
|
|
134
134
|
<wa-button
|
|
135
135
|
appearance="plain"
|
|
136
|
-
size="
|
|
136
|
+
size="s"
|
|
137
137
|
style=${styleMap({
|
|
138
138
|
display: "flex",
|
|
139
139
|
alignItems: "center",
|
|
@@ -147,7 +147,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
|
|
|
147
147
|
${connectionText}
|
|
148
148
|
</wa-button>
|
|
149
149
|
<wa-button
|
|
150
|
-
size="
|
|
150
|
+
size="s"
|
|
151
151
|
appearance="plain"
|
|
152
152
|
?disabled=${!this.pyConnected}
|
|
153
153
|
@click=${() => this.runScript()}
|
|
@@ -157,7 +157,7 @@ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
|
|
|
157
157
|
Run
|
|
158
158
|
</wa-button>
|
|
159
159
|
<wa-button
|
|
160
|
-
size="
|
|
160
|
+
size="s"
|
|
161
161
|
appearance="plain"
|
|
162
162
|
?disabled=${!this.pyConnected}
|
|
163
163
|
@click=${() => this.openPackageManager()}
|
|
@@ -212,4 +212,4 @@ _decorate([state()], DocksPythonEditor.prototype, "pyVersion", void 0);
|
|
|
212
212
|
DocksPythonEditor = _decorate([customElement("docks-python-editor")], DocksPythonEditor);
|
|
213
213
|
//#endregion
|
|
214
214
|
|
|
215
|
-
//# sourceMappingURL=python-editor-
|
|
215
|
+
//# sourceMappingURL=python-editor-DYi4l3P9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-editor-BpEUhgXs.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=\"small\"\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=\"small\"\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=\"small\"\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
|
+
{"version":3,"file":"python-editor-DYi4l3P9.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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as PyEnv } from "./pyservice-DGwNXWO4.js";
|
|
2
|
-
import { t as pythonPackageManagerService } from "./package-manager-
|
|
2
|
+
import { t as pythonPackageManagerService } from "./package-manager-DJaTJoVI.js";
|
|
3
3
|
import { n as parsePackagesFromContent } from "./editor-python-run-Cs68X5JL.js";
|
|
4
4
|
import { File, contributionRegistry, editorRegistry, registerAll, toastError } from "@eclipse-docks/core";
|
|
5
5
|
import { TARGET_NOTEBOOK_KERNELS } from "@eclipse-docks/extension-notebook";
|
|
@@ -288,7 +288,7 @@ editorRegistry.registerEditorInputHandler({
|
|
|
288
288
|
label: "Python",
|
|
289
289
|
icon: "docks python",
|
|
290
290
|
lazyInit: async () => {
|
|
291
|
-
await import("./python-editor-
|
|
291
|
+
await import("./python-editor-DYi4l3P9.js");
|
|
292
292
|
},
|
|
293
293
|
canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".py"),
|
|
294
294
|
ranking: 1e3,
|
|
@@ -308,4 +308,4 @@ editorRegistry.registerEditorInputHandler({
|
|
|
308
308
|
//#endregion
|
|
309
309
|
export { PyEnv, pythonPackageManagerService };
|
|
310
310
|
|
|
311
|
-
//# sourceMappingURL=python-runtime-extension-
|
|
311
|
+
//# sourceMappingURL=python-runtime-extension-u9NoE4Xj.js.map
|
package/dist/{python-runtime-extension-BZ3XkDRK.js.map → python-runtime-extension-u9NoE4Xj.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-runtime-extension-BZ3XkDRK.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-u9NoE4Xj.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
package/dist/api-C6Mnm5y_.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commands-D0y3XxCw.js","names":[],"sources":["../src/commands.ts"],"sourcesContent":["import { registerAll, toastError } from \"@eclipse-docks/core\";\nimport { PyEnv } from \"./pyservice\";\n\nregisterAll({\n command: {\n id: \"python\",\n name: \"Run Python Cell\",\n description: \"Runs Python code.\",\n keyBinding: \"CTRL+R\",\n parameters: [\n {\n name: \"code\",\n description: \"Python code to execute\",\n required: true\n }\n ]\n },\n handler: {\n execute: async (context: any) => {\n const code: string | undefined = context.params?.code;\n if (!code) {\n toastError(\"No Python code provided.\");\n return;\n }\n const pyenv = new PyEnv();\n await pyenv.init({ params: context.params });\n return await pyenv.execCode(code);\n }\n }\n});\n\n"],"mappings":";;;AAGA,YAAY;CACV,SAAS;EACP,IAAI;EACJ,MAAM;EACN,aAAa;EACb,YAAY;EACZ,YAAY,CACV;GACE,MAAM;GACN,aAAa;GACb,UAAU;GACX,CACF;EACF;CACD,SAAS,EACP,SAAS,OAAO,YAAiB;EAC/B,MAAM,OAA2B,QAAQ,QAAQ;AACjD,MAAI,CAAC,MAAM;AACT,cAAW,2BAA2B;AACtC;;EAEF,MAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC5C,SAAO,MAAM,MAAM,SAAS,KAAK;IAEpC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-DcDiJbD3.js","names":[],"sources":["../src/package-manager.ts"],"sourcesContent":["import { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { PyEnv } from \"./pyservice\";\nimport { rootContext } from \"@eclipse-docks/core\";\n\nexport interface PackageManagerOptions {\n packages: string[];\n onPackageAdded?: (packageName: string) => void;\n onPackageRemoved?: (packageName: string) => void;\n pyenv?: PyEnv;\n}\n\n@customElement('docks-python-package-manager')\nexport class DocksPythonPackageManager extends LitElement {\n @property({ type: Boolean })\n open: boolean = false;\n\n @property({ type: Array })\n packages: string[] = [];\n\n @property({ attribute: false })\n pyenv?: PyEnv;\n\n @state()\n private loadingPackages: boolean = false;\n\n @state()\n private packageLoadError?: string;\n\n private onPackageAdded?: (packageName: string) => void;\n private onPackageRemoved?: (packageName: string) => void;\n\n public configure(options: PackageManagerOptions) {\n this.packages = options.packages || [];\n this.pyenv = options.pyenv;\n this.onPackageAdded = options.onPackageAdded;\n this.onPackageRemoved = options.onPackageRemoved;\n }\n\n public show() {\n this.open = true;\n }\n\n public hide() {\n this.open = false;\n }\n\n private addPackage(packageName: string) {\n if (!packageName || packageName.trim() === '') return;\n\n const trimmedName = packageName.trim();\n if (!this.packages.includes(trimmedName)) {\n this.packages = [...this.packages, trimmedName];\n this.onPackageAdded?.(trimmedName);\n }\n }\n\n private removePackage(packageName: string) {\n const index = this.packages.indexOf(packageName);\n if (index > -1) {\n this.packages = this.packages.filter(pkg => pkg !== packageName);\n this.onPackageRemoved?.(packageName);\n }\n }\n\n private async reloadPackages() {\n if (!this.pyenv) return;\n\n this.loadingPackages = true;\n this.packageLoadError = undefined;\n\n try {\n await this.pyenv.loadPackages(this.packages);\n } catch (error) {\n this.packageLoadError = String(error);\n } finally {\n this.loadingPackages = false;\n }\n }\n\n render() {\n let newPackageInput: HTMLInputElement | undefined;\n\n return html`\n <wa-dialog \n label=\"Manage Required Packages\" \n ?open=${this.open}\n @wa-after-hide=${() => {\n this.open = false;\n this.dispatchEvent(new CustomEvent('hide', { bubbles: true, composed: true }));\n }}>\n <div class=\"package-manager\">\n <p class=\"package-manager-description\">\n Specify Python packages that should be automatically loaded when connecting to the kernel.\n </p>\n\n ${this.loadingPackages ? html`\n <wa-alert variant=\"primary\" open>\n <wa-icon slot=\"icon\" name=\"circle-notch\" library=\"fa\" class=\"spinning\"></wa-icon>\n Loading packages...\n </wa-alert>\n ` : ''}\n\n ${this.packageLoadError ? html`\n <wa-alert variant=\"danger\" open closable @wa-after-hide=${() => this.packageLoadError = undefined}>\n <wa-icon slot=\"icon\" name=\"exclamation-triangle\"></wa-icon>\n <strong>Package Load Error:</strong><br>\n ${this.packageLoadError}\n </wa-alert>\n ` : ''}\n\n <div class=\"package-input-group\">\n <wa-input \n placeholder=\"Package name (e.g., pandas, numpy)\" \n ${ref((el: any) => newPackageInput = el)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}>\n <wa-icon slot=\"prefix\" name=\"box\"></wa-icon>\n </wa-input>\n <wa-button \n @click=${() => {\n if (newPackageInput) {\n this.addPackage(newPackageInput.value);\n newPackageInput.value = '';\n }\n }}\n variant=\"primary\">\n <wa-icon slot=\"prefix\" name=\"plus\"></wa-icon>\n Add\n </wa-button>\n </div>\n\n ${this.packages.length === 0 ? html`\n <div class=\"empty-state\">\n <wa-icon name=\"box\" style=\"font-size: 3rem; opacity: 0.3;\"></wa-icon>\n <p>No packages configured</p>\n <p style=\"font-size: 0.9rem; opacity: 0.7;\">Add packages above to auto-load them when the kernel connects</p>\n </div>\n ` : html`\n <div class=\"package-list\">\n <div class=\"package-list-header\">\n <strong>Required Packages (${this.packages.length})</strong>\n </div>\n ${repeat(this.packages, pkg => pkg, pkg => html`\n <div class=\"package-item\">\n <wa-icon name=\"box\" style=\"opacity: 0.5;\"></wa-icon>\n <span class=\"package-name\">${pkg}</span>\n <wa-button \n size=\"small\" \n variant=\"text\"\n @click=${() => this.removePackage(pkg)}\n title=\"Remove package\">\n <wa-icon name=\"xmark\"></wa-icon>\n </wa-button>\n </div>\n `)}\n </div>\n `}\n </div>\n <div slot=\"footer\" class=\"package-manager-footer\">\n ${this.pyenv && this.packages.length > 0 ? html`\n <wa-button \n variant=\"default\"\n @click=${() => this.reloadPackages()}\n ?disabled=${this.loadingPackages}>\n <wa-icon slot=\"prefix\" name=\"arrows-rotate\"></wa-icon>\n Reload Packages\n </wa-button>\n ` : ''}\n <wa-button \n variant=\"primary\"\n @click=${() => this.hide()}>\n Done\n </wa-button>\n </div>\n </wa-dialog>\n `;\n }\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .package-manager {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n }\n\n .package-manager-description {\n margin: 0;\n font-size: 0.95rem;\n opacity: 0.8;\n line-height: 1.5;\n }\n\n .package-input-group {\n display: flex;\n gap: 0.5rem;\n }\n\n .package-input-group wa-input {\n flex: 1;\n }\n\n .package-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n }\n\n .package-list-header {\n padding: 0.5rem;\n border-bottom: 1px solid var(--wa-color-outline);\n margin-bottom: 0.5rem;\n }\n\n .package-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border-radius: 4px;\n background: var(--wa-color-surface-variant);\n transition: background 0.2s;\n }\n\n .package-item:hover {\n background: var(--wa-color-surface-container-highest);\n }\n\n .package-name {\n flex: 1;\n font-family: monospace;\n font-size: 0.95rem;\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 3rem 1rem;\n text-align: center;\n opacity: 0.6;\n }\n\n .empty-state p {\n margin: 0;\n }\n\n .package-manager-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n padding-top: 1rem;\n border-top: 1px solid var(--wa-color-outline);\n }\n\n .spinning {\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n `;\n}\n\nclass PythonPackageManagerService {\n private managerInstance?: DocksPythonPackageManager;\n\n public showPackageManager(options: PackageManagerOptions): DocksPythonPackageManager {\n if (!this.managerInstance) {\n this.managerInstance = document.createElement('docks-python-package-manager') as DocksPythonPackageManager;\n document.body.appendChild(this.managerInstance);\n }\n\n this.managerInstance.configure(options);\n this.managerInstance.show();\n\n return this.managerInstance;\n }\n\n public getManager(): DocksPythonPackageManager | undefined {\n return this.managerInstance;\n }\n}\n\nexport const pythonPackageManagerService = new PythonPackageManagerService();\nrootContext.put(\"pythonPackageManagerService\", pythonPackageManagerService);\n"],"mappings":"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"}
|