@eclipse-docks/extension-python-runtime 0.7.68

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.
Files changed (44) hide show
  1. package/dist/api-BOBYsCjI.js +2 -0
  2. package/dist/api.d.ts +3 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +4 -0
  5. package/dist/assets/__vite-browser-external-CIfIXVz4.js +9 -0
  6. package/dist/assets/__vite-browser-external-CIfIXVz4.js.map +1 -0
  7. package/dist/assets/pyworker-B9Puyiq6.js.map +1 -0
  8. package/dist/commands-DsAwshaD.js +29 -0
  9. package/dist/commands-DsAwshaD.js.map +1 -0
  10. package/dist/commands.d.ts +2 -0
  11. package/dist/commands.d.ts.map +1 -0
  12. package/dist/editor-python-run-Cs68X5JL.js +21 -0
  13. package/dist/editor-python-run-Cs68X5JL.js.map +1 -0
  14. package/dist/editor-python-run.d.ts +4 -0
  15. package/dist/editor-python-run.d.ts.map +1 -0
  16. package/dist/i18n.de-CHoexpTu.js +11 -0
  17. package/dist/i18n.de-CHoexpTu.js.map +1 -0
  18. package/dist/i18n.en-BSbqitYs.js +11 -0
  19. package/dist/i18n.en-BSbqitYs.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/package-manager-DcDiJbD3.js +283 -0
  25. package/dist/package-manager-DcDiJbD3.js.map +1 -0
  26. package/dist/package-manager.d.ts +33 -0
  27. package/dist/package-manager.d.ts.map +1 -0
  28. package/dist/pyservice-HZft4q8C.js +259 -0
  29. package/dist/pyservice-HZft4q8C.js.map +1 -0
  30. package/dist/pyservice.d.ts +33 -0
  31. package/dist/pyservice.d.ts.map +1 -0
  32. package/dist/python-editor-DfVBnWKu.js +215 -0
  33. package/dist/python-editor-DfVBnWKu.js.map +1 -0
  34. package/dist/python-editor.d.ts +42 -0
  35. package/dist/python-editor.d.ts.map +1 -0
  36. package/dist/python-notebook-kernel.d.ts +3 -0
  37. package/dist/python-notebook-kernel.d.ts.map +1 -0
  38. package/dist/python-runtime-extension-CTgWtzO7.js +221 -0
  39. package/dist/python-runtime-extension-CTgWtzO7.js.map +1 -0
  40. package/dist/python-runtime-extension.d.ts +3 -0
  41. package/dist/python-runtime-extension.d.ts.map +1 -0
  42. package/dist/pyworker.d.ts +11 -0
  43. package/dist/pyworker.d.ts.map +1 -0
  44. package/package.json +39 -0
@@ -0,0 +1,215 @@
1
+ import { t as PyEnv } from "./pyservice-HZft4q8C.js";
2
+ import { t as pythonPackageManagerService } from "./package-manager-DcDiJbD3.js";
3
+ import "./api-BOBYsCjI.js";
4
+ import { n as parsePackagesFromContent, t as contentWithPackagesLine } from "./editor-python-run-Cs68X5JL.js";
5
+ import { DocksPart, toastError } from "@eclipse-docks/core";
6
+ import { css, html } from "lit";
7
+ import { customElement, property, state } from "lit/decorators.js";
8
+ import { createRef, ref } from "lit/directives/ref.js";
9
+ import _decorate from "@oxc-project/runtime/helpers/decorate";
10
+ import { styleMap } from "lit/directives/style-map.js";
11
+ //#region src/python-editor.ts
12
+ var DocksPythonEditor = class DocksPythonEditor extends DocksPart {
13
+ constructor(..._args) {
14
+ super(..._args);
15
+ this.readOnly = false;
16
+ this.initialContent = void 0;
17
+ this.initialUri = void 0;
18
+ this.pyConnected = false;
19
+ this.pyConnecting = false;
20
+ this.widgetRef = createRef();
21
+ this._onContentChange = () => {
22
+ this.markDirty(true);
23
+ };
24
+ }
25
+ async doInitUI() {
26
+ const file = this.input.data;
27
+ this.initialContent = await file.getContents();
28
+ this.initialUri = file.getName();
29
+ this.requestUpdate();
30
+ }
31
+ save() {
32
+ const value = this.widgetRef.value?.getContent() ?? "";
33
+ this.input?.data.saveContents(value);
34
+ this.markDirty(false);
35
+ }
36
+ doClose() {
37
+ this.widgetRef.value?.dispose();
38
+ if (this.pyenv) {
39
+ this.pyenv.close();
40
+ this.pyenv = void 0;
41
+ }
42
+ this.pyConnected = false;
43
+ this.pyVersion = void 0;
44
+ }
45
+ getLanguage() {
46
+ return "python";
47
+ }
48
+ isLanguage(lang) {
49
+ return lang.toLowerCase() === "python";
50
+ }
51
+ getContent() {
52
+ return this.widgetRef.value?.getContent() ?? null;
53
+ }
54
+ getSelection() {
55
+ return this.widgetRef.value?.getSelection() ?? null;
56
+ }
57
+ getSnippet(lines = 5) {
58
+ return this.widgetRef.value?.getSnippet(lines) ?? null;
59
+ }
60
+ getFilePath() {
61
+ return this.input?.data?.getWorkspacePath() ?? null;
62
+ }
63
+ getPyEnv() {
64
+ return this.pyenv;
65
+ }
66
+ async initPyEnv() {
67
+ if (this.pyenv) return;
68
+ this.pyenv = new PyEnv();
69
+ await this.pyenv.init();
70
+ this.pyConnected = true;
71
+ try {
72
+ this.pyVersion = (await this.pyenv.execCode("import sys; sys.version.split()[0]"))?.result || "Unknown";
73
+ } catch {
74
+ this.pyVersion = "Unknown";
75
+ }
76
+ }
77
+ async connectPython() {
78
+ if (this.pyConnecting || this.pyConnected) return;
79
+ try {
80
+ this.pyConnecting = true;
81
+ await this.initPyEnv();
82
+ } catch (err) {
83
+ toastError(err instanceof Error ? err.message : String(err));
84
+ } finally {
85
+ this.pyConnecting = false;
86
+ }
87
+ }
88
+ async runScript() {
89
+ if (!this.pyConnected || !this.pyenv) {
90
+ await this.connectPython();
91
+ if (!this.pyenv) return;
92
+ }
93
+ const content = this.getContent()?.trim();
94
+ if (!content) {
95
+ toastError("No content to run");
96
+ return;
97
+ }
98
+ try {
99
+ const packages = parsePackagesFromContent(content);
100
+ if (packages.length > 0) await this.pyenv.loadPackages(packages);
101
+ await this.pyenv.execCode(content);
102
+ } catch (err) {
103
+ toastError(err instanceof Error ? err.message : String(err));
104
+ }
105
+ }
106
+ updateEditorPackagesLine(packages) {
107
+ const content = this.getContent() ?? "";
108
+ const newContent = contentWithPackagesLine(content, packages);
109
+ if (newContent === content) return;
110
+ this.widgetRef.value?.getModel()?.setValue(newContent);
111
+ this.markDirty(true);
112
+ }
113
+ openPackageManager() {
114
+ if (!this.pyConnected || !this.pyenv) return;
115
+ const packages = parsePackagesFromContent(this.getContent() ?? "");
116
+ pythonPackageManagerService.showPackageManager({
117
+ packages,
118
+ pyenv: this.pyenv,
119
+ onPackageAdded: (name) => {
120
+ const next = [...parsePackagesFromContent(this.getContent() ?? ""), name];
121
+ this.updateEditorPackagesLine(next);
122
+ },
123
+ onPackageRemoved: (name) => {
124
+ const next = parsePackagesFromContent(this.getContent() ?? "").filter((p) => p !== name);
125
+ this.updateEditorPackagesLine(next);
126
+ }
127
+ });
128
+ }
129
+ renderToolbar() {
130
+ const connectionTitle = this.pyConnecting ? "Connecting to Python..." : this.pyConnected ? "Python Connected" : "Python Disconnected - Click to connect";
131
+ const connectionText = this.pyConnecting ? "Connecting..." : this.pyConnected && this.pyVersion ? `Python ${this.pyVersion}` : "Not connected";
132
+ const iconColor = this.pyConnected ? "var(--wa-color-green-40)" : this.pyConnecting ? "var(--wa-color-warning-500)" : "var(--wa-color-red-40)";
133
+ return html`
134
+ <wa-button
135
+ appearance="plain"
136
+ size="small"
137
+ style=${styleMap({
138
+ display: "flex",
139
+ alignItems: "center",
140
+ gap: "0.5rem"
141
+ })}
142
+ ?disabled=${this.pyConnecting}
143
+ @click=${() => this.connectPython()}
144
+ title=${connectionTitle}
145
+ >
146
+ <wa-icon name="circle" label="Python status" style=${styleMap({ color: iconColor })}></wa-icon>
147
+ ${connectionText}
148
+ </wa-button>
149
+ <wa-button
150
+ size="small"
151
+ appearance="plain"
152
+ ?disabled=${!this.pyConnected}
153
+ @click=${() => this.runScript()}
154
+ title="Run Python script"
155
+ >
156
+ <wa-icon name="play" label="Run"></wa-icon>
157
+ Run
158
+ </wa-button>
159
+ <wa-button
160
+ size="small"
161
+ appearance="plain"
162
+ ?disabled=${!this.pyConnected}
163
+ @click=${() => this.openPackageManager()}
164
+ title="Manage packages"
165
+ >
166
+ <wa-icon name="box" label="Packages"></wa-icon>
167
+ Packages
168
+ </wa-button>
169
+ `;
170
+ }
171
+ updated(changedProperties) {
172
+ super.updated(changedProperties);
173
+ if (changedProperties.has("pyConnected") || changedProperties.has("pyConnecting") || changedProperties.has("pyVersion")) {}
174
+ }
175
+ renderContent() {
176
+ if (this.initialContent === void 0) return html`<div class="monaco-editor-placeholder"></div>`;
177
+ return html`
178
+ <docks-monaco-widget
179
+ .value=${this.initialContent}
180
+ .uri=${this.initialUri}
181
+ .language=${"python"}
182
+ .readOnly=${this.readOnly}
183
+ @content-change=${this._onContentChange}
184
+ ${ref(this.widgetRef)}
185
+ ></docks-monaco-widget>
186
+ `;
187
+ }
188
+ static {
189
+ this.styles = css`
190
+ :host {
191
+ display: flex;
192
+ flex-direction: column;
193
+ position: relative;
194
+ width: 100%;
195
+ height: 100%;
196
+ }
197
+ .monaco-editor-placeholder {
198
+ flex: 1;
199
+ min-height: 0;
200
+ }
201
+ `;
202
+ }
203
+ };
204
+ _decorate([property({ attribute: false })], DocksPythonEditor.prototype, "input", void 0);
205
+ _decorate([property({ type: Boolean })], DocksPythonEditor.prototype, "readOnly", void 0);
206
+ _decorate([state()], DocksPythonEditor.prototype, "initialContent", void 0);
207
+ _decorate([state()], DocksPythonEditor.prototype, "initialUri", void 0);
208
+ _decorate([state()], DocksPythonEditor.prototype, "pyenv", void 0);
209
+ _decorate([state()], DocksPythonEditor.prototype, "pyConnected", void 0);
210
+ _decorate([state()], DocksPythonEditor.prototype, "pyConnecting", void 0);
211
+ _decorate([state()], DocksPythonEditor.prototype, "pyVersion", void 0);
212
+ DocksPythonEditor = _decorate([customElement("docks-python-editor")], DocksPythonEditor);
213
+ //#endregion
214
+
215
+ //# sourceMappingURL=python-editor-DfVBnWKu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-editor-DfVBnWKu.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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"}
@@ -0,0 +1,42 @@
1
+ import { DocksPart, EditorInput, EditorContentProvider } from '@eclipse-docks/core';
2
+ import { PyEnv } from './api';
3
+ export declare class DocksPythonEditor extends DocksPart implements EditorContentProvider {
4
+ input?: EditorInput;
5
+ readOnly: boolean;
6
+ private initialContent;
7
+ private initialUri;
8
+ private pyenv?;
9
+ private pyConnected;
10
+ private pyConnecting;
11
+ private pyVersion?;
12
+ private widgetRef;
13
+ protected doInitUI(): Promise<void>;
14
+ private _onContentChange;
15
+ save(): void;
16
+ protected doClose(): void;
17
+ getLanguage(): string | null;
18
+ isLanguage(lang: string): boolean;
19
+ getContent(): string | null;
20
+ getSelection(): string | null;
21
+ getSnippet(lines?: number): {
22
+ snippet: string;
23
+ cursorLine: number;
24
+ } | null;
25
+ getFilePath(): string | null;
26
+ getPyEnv(): PyEnv | undefined;
27
+ private initPyEnv;
28
+ connectPython(): Promise<void>;
29
+ private runScript;
30
+ private updateEditorPackagesLine;
31
+ private openPackageManager;
32
+ protected renderToolbar(): import('lit-html').TemplateResult<1>;
33
+ protected updated(changedProperties: Map<string, unknown>): void;
34
+ protected renderContent(): import('lit-html').TemplateResult<1>;
35
+ static styles: import('lit').CSSResult;
36
+ }
37
+ declare global {
38
+ interface HTMLElementTagNameMap {
39
+ "docks-python-editor": DocksPythonEditor;
40
+ }
41
+ }
42
+ //# sourceMappingURL=python-editor.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import { NotebookKernelContribution } from '@eclipse-docks/extension-notebook';
2
+ export declare const pythonNotebookKernelContribution: NotebookKernelContribution;
3
+ //# sourceMappingURL=python-notebook-kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-notebook-kernel.d.ts","sourceRoot":"","sources":["../src/python-notebook-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAiM3C,eAAO,MAAM,gCAAgC,EAAE,0BAK9C,CAAC"}
@@ -0,0 +1,221 @@
1
+ import { t as PyEnv } from "./pyservice-HZft4q8C.js";
2
+ import { t as pythonPackageManagerService } from "./package-manager-DcDiJbD3.js";
3
+ import { n as parsePackagesFromContent } from "./editor-python-run-Cs68X5JL.js";
4
+ import { File, contributionRegistry, editorRegistry, registerAll, toastError } from "@eclipse-docks/core";
5
+ import { html } from "lit";
6
+ import { TARGET_NOTEBOOK_KERNELS } from "@eclipse-docks/extension-notebook";
7
+ //#region src/python-notebook-kernel.ts
8
+ var PythonNotebookKernel = class {
9
+ constructor() {
10
+ this.id = "python";
11
+ this.label = "Python";
12
+ this.language = "python";
13
+ this.pyenv = null;
14
+ this.requiredPackages = [];
15
+ this.loadedPackages = /* @__PURE__ */ new Set();
16
+ this.connectPromise = null;
17
+ }
18
+ async connect(options) {
19
+ if (this.connectPromise) {
20
+ await this.connectPromise;
21
+ if (options?.requiredPackages) this.requiredPackages = options.requiredPackages;
22
+ const packagesToLoadAfterWait = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));
23
+ if (packagesToLoadAfterWait.length === 0 || !this.pyenv) return;
24
+ await this.pyenv.loadPackages(packagesToLoadAfterWait);
25
+ packagesToLoadAfterWait.forEach((pkg) => this.loadedPackages.add(pkg));
26
+ return;
27
+ }
28
+ this.connectPromise = this.doConnect(options);
29
+ try {
30
+ await this.connectPromise;
31
+ } finally {
32
+ this.connectPromise = null;
33
+ }
34
+ }
35
+ async doConnect(options) {
36
+ if (options?.requiredPackages) this.requiredPackages = options.requiredPackages;
37
+ if (!this.pyenv) {
38
+ this.pyenv = new PyEnv();
39
+ await this.pyenv.init();
40
+ }
41
+ const packagesToLoad = this.requiredPackages.filter((pkg) => !this.loadedPackages.has(pkg));
42
+ if (packagesToLoad.length > 0) {
43
+ await this.pyenv.loadPackages(packagesToLoad);
44
+ packagesToLoad.forEach((pkg) => this.loadedPackages.add(pkg));
45
+ }
46
+ try {
47
+ await this.pyenv.execCode(`
48
+ try:
49
+ import matplotlib
50
+ matplotlib.use('agg')
51
+ import matplotlib.pyplot as plt
52
+ import io
53
+ import base64
54
+ _original_show = plt.show
55
+ _display_data = None
56
+ def _patched_show(*args, **kwargs):
57
+ global _display_data
58
+ if plt.get_fignums():
59
+ fig = plt.gcf()
60
+ buffer = io.BytesIO()
61
+ fig.savefig(buffer, format='png', bbox_inches='tight', dpi=100)
62
+ buffer.seek(0)
63
+ _display_data = base64.b64encode(buffer.read()).decode('utf-8')
64
+ plt.close(fig)
65
+ pass
66
+ plt.show = _patched_show
67
+ except ImportError:
68
+ pass
69
+ `);
70
+ } catch {}
71
+ }
72
+ async execute(code) {
73
+ if (!this.pyenv) await this.connect();
74
+ if (!this.pyenv) return { error: "Python kernel not initialized" };
75
+ try {
76
+ const response = await this.pyenv.execCode(code);
77
+ const outputParts = [];
78
+ if (response && typeof response === "object" && "console" in response) {
79
+ const consoleOutput = response.console;
80
+ if (Array.isArray(consoleOutput) && consoleOutput.length > 0) {
81
+ const filtered = consoleOutput.filter((s) => s && String(s).trim());
82
+ if (filtered.length > 0) outputParts.push(...filtered.map(String));
83
+ }
84
+ }
85
+ let imageData;
86
+ try {
87
+ const checkDisplayData = await this.pyenv.execCode("_display_data if \"_display_data\" in dir() else None");
88
+ const displayResult = checkDisplayData && typeof checkDisplayData === "object" && checkDisplayData !== null && "result" in checkDisplayData ? checkDisplayData.result : checkDisplayData;
89
+ if (displayResult != null && String(displayResult) !== "None" && String(displayResult) !== "undefined") {
90
+ imageData = String(displayResult);
91
+ await this.pyenv.execCode("_display_data = None");
92
+ }
93
+ } catch {}
94
+ if (!imageData) {
95
+ const result = response && typeof response === "object" && response !== null && "result" in response ? response.result : response;
96
+ if (result !== void 0 && result !== null && String(result) !== "undefined") {
97
+ const s = String(result);
98
+ if (s && s !== "undefined") outputParts.push(s);
99
+ }
100
+ }
101
+ return {
102
+ data: outputParts.length > 0 ? outputParts.join("\n") : void 0,
103
+ imageData
104
+ };
105
+ } catch (err) {
106
+ return { error: err instanceof Error ? err.message : String(err) };
107
+ }
108
+ }
109
+ async getVersion() {
110
+ if (!this.pyenv) return void 0;
111
+ try {
112
+ return await this.pyenv.getVersion() ?? void 0;
113
+ } catch {
114
+ return;
115
+ }
116
+ }
117
+ interrupt() {
118
+ this.pyenv?.interrupt?.();
119
+ }
120
+ async restart() {
121
+ if (this.pyenv) {
122
+ this.pyenv.close();
123
+ this.pyenv = null;
124
+ }
125
+ this.loadedPackages.clear();
126
+ await this.connect({ requiredPackages: this.requiredPackages });
127
+ }
128
+ openPackageManager(context) {
129
+ if (!this.pyenv) return;
130
+ pythonPackageManagerService.showPackageManager({
131
+ packages: context?.requiredPackages ?? [],
132
+ pyenv: this.pyenv,
133
+ onPackageAdded: context?.onPackageAdded,
134
+ onPackageRemoved: context?.onPackageRemoved
135
+ });
136
+ }
137
+ close() {
138
+ if (this.pyenv) {
139
+ this.pyenv.close();
140
+ this.pyenv = null;
141
+ }
142
+ this.loadedPackages.clear();
143
+ }
144
+ };
145
+ //#endregion
146
+ //#region src/python-runtime-extension.ts
147
+ contributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, {
148
+ id: "python",
149
+ label: "Python",
150
+ language: "python",
151
+ loadKernel: async () => new PythonNotebookKernel()
152
+ });
153
+ registerAll({
154
+ command: {
155
+ id: "python",
156
+ name: "Run Python Script",
157
+ description: "Executes a Python script given its file path",
158
+ parameters: [{
159
+ name: "script",
160
+ description: "the path to a Python script to run",
161
+ required: false
162
+ }]
163
+ },
164
+ handler: { execute: async (context) => {
165
+ const script = context.params?.["script"];
166
+ if (!script) return;
167
+ const pyenv = new PyEnv();
168
+ await pyenv.init({ params: context.params });
169
+ await pyenv.execScript(script);
170
+ } }
171
+ });
172
+ registerAll({
173
+ command: {
174
+ id: "python.openEditorPackageManager",
175
+ name: "Manage packages",
176
+ description: "Manage Python packages for the editor environment",
177
+ parameters: []
178
+ },
179
+ handler: {
180
+ canExecute: (ctx) => !!ctx.activeEditor?.isLanguage?.("python"),
181
+ execute: async (ctx) => {
182
+ const ed = ctx.activeEditor;
183
+ if (!ed) {
184
+ toastError("No active editor");
185
+ return;
186
+ }
187
+ const packages = parsePackagesFromContent(ed?.getContent?.() ?? "");
188
+ const pyenv = ed.getPyEnv?.();
189
+ pythonPackageManagerService.showPackageManager({
190
+ packages,
191
+ pyenv
192
+ });
193
+ }
194
+ }
195
+ });
196
+ editorRegistry.registerEditorInputHandler({
197
+ editorId: "system.python-editor",
198
+ label: "Python",
199
+ icon: "docks python",
200
+ lazyInit: async () => {
201
+ await import("./python-editor-DfVBnWKu.js");
202
+ },
203
+ canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".py"),
204
+ ranking: 1e3,
205
+ handle: async (input) => {
206
+ const editorInput = {
207
+ title: input.getWorkspacePath(),
208
+ data: input,
209
+ key: input.getWorkspacePath(),
210
+ icon: "python",
211
+ state: {},
212
+ component: () => null
213
+ };
214
+ editorInput.component = (id) => html`<docks-python-editor id="${id}" .input=${editorInput}></docks-python-editor>`;
215
+ return editorInput;
216
+ }
217
+ });
218
+ //#endregion
219
+ export { PyEnv, pythonPackageManagerService };
220
+
221
+ //# sourceMappingURL=python-runtime-extension-CTgWtzO7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-runtime-extension-CTgWtzO7.js","names":[],"sources":["../src/python-notebook-kernel.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 {\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 { html } from \"lit\";\n\ntype EditorWithLanguage = { isLanguage?(lang: string): boolean };\nimport { PyEnv } from \"./pyservice\";\nimport { pythonNotebookKernelContribution } from \"./python-notebook-kernel\";\n\ncontributionRegistry.registerContribution(TARGET_NOTEBOOK_KERNELS, pythonNotebookKernelContribution);\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: \"python\",\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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"}
@@ -0,0 +1,3 @@
1
+ export { PyEnv } from './pyservice';
2
+ export { pythonPackageManagerService } from './package-manager';
3
+ //# sourceMappingURL=python-runtime-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-runtime-extension.d.ts","sourceRoot":"","sources":["../src/python-runtime-extension.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface PyWorkerMessage {
2
+ id: string;
3
+ type: 'init' | 'execCode' | 'execModule' | 'runFunction' | 'setGlobal' | 'loadPackages' | 'getVersion' | 'inputResponse' | 'workspaceResponse';
4
+ payload?: any;
5
+ }
6
+ export interface PyWorkerResponse {
7
+ id: string;
8
+ type: 'success' | 'error' | 'stdout' | 'stderr' | 'inputRequest' | 'console' | 'workspaceRequest';
9
+ payload?: any;
10
+ }
11
+ //# sourceMappingURL=pyworker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyworker.d.ts","sourceRoot":"","sources":["../src/pyworker.ts"],"names":[],"mappings":"AAkFA,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,eAAe,GAAG,mBAAmB,CAAC;IAC/I,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,GAAG,kBAAkB,CAAC;IAClG,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@eclipse-docks/extension-python-runtime",
3
+ "version": "0.7.68",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./api": {
14
+ "types": "./dist/api.d.ts",
15
+ "import": "./dist/api.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "vite build"
23
+ },
24
+ "dependencies": {
25
+ "@eclipse-docks/core": "*",
26
+ "@eclipse-docks/extension-monaco-editor": "*",
27
+ "@eclipse-docks/extension-notebook": "*",
28
+ "pyodide": "^0.29.3"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^6.0.0",
32
+ "vite": "^8.0.0",
33
+ "vite-plugin-dts": "^4.5.4"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/eclipse-docks/core"
38
+ }
39
+ }