@eclipse-docks/extension-canvas 0.0.0-stage → 0.0.0
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/_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js +9 -0
- package/dist/active-canvas.d.ts +13 -0
- package/dist/active-canvas.d.ts.map +1 -0
- package/dist/active-canvas.js +23 -0
- package/dist/active-canvas.js.map +1 -0
- package/dist/bridges/core.d.ts +2 -0
- package/dist/bridges/core.d.ts.map +1 -0
- package/dist/bridges/core.js +9 -0
- package/dist/bridges/core.js.map +1 -0
- package/dist/bridges/events.d.ts +2 -0
- package/dist/bridges/events.d.ts.map +1 -0
- package/dist/bridges/events.js +9 -0
- package/dist/bridges/events.js.map +1 -0
- package/dist/bridges/lit.d.ts +2 -0
- package/dist/bridges/lit.d.ts.map +1 -0
- package/dist/bridges/lit.js +9 -0
- package/dist/bridges/lit.js.map +1 -0
- package/dist/bridges/parts.d.ts +2 -0
- package/dist/bridges/parts.d.ts.map +1 -0
- package/dist/bridges/parts.js +9 -0
- package/dist/bridges/parts.js.map +1 -0
- package/dist/bridges/register.d.ts +9 -0
- package/dist/bridges/register.d.ts.map +1 -0
- package/dist/bridges/register.js +13 -0
- package/dist/bridges/register.js.map +1 -0
- package/dist/bridges/third-party.d.ts +2 -0
- package/dist/bridges/third-party.d.ts.map +1 -0
- package/dist/bridges/third-party.js +9 -0
- package/dist/bridges/third-party.js.map +1 -0
- package/dist/bridges/urls.d.ts +3 -0
- package/dist/bridges/urls.d.ts.map +1 -0
- package/dist/bridges/urls.js +27 -0
- package/dist/bridges/urls.js.map +1 -0
- package/dist/bridges/webawesome.d.ts +2 -0
- package/dist/bridges/webawesome.d.ts.map +1 -0
- package/dist/bridges/webawesome.js +9 -0
- package/dist/bridges/webawesome.js.map +1 -0
- package/dist/bridges/widgets.d.ts +2 -0
- package/dist/bridges/widgets.d.ts.map +1 -0
- package/dist/bridges/widgets.js +9 -0
- package/dist/bridges/widgets.js.map +1 -0
- package/dist/canvas-editor.d.ts +61 -0
- package/dist/canvas-editor.d.ts.map +1 -0
- package/dist/canvas-editor.js +276 -0
- package/dist/canvas-editor.js.map +1 -0
- package/dist/canvas-extension.d.ts +1 -0
- package/dist/canvas-extension.d.ts.map +1 -0
- package/dist/canvas-extension.js +48 -0
- package/dist/canvas-extension.js.map +1 -0
- package/dist/canvas-switcher.d.ts +11 -0
- package/dist/canvas-switcher.d.ts.map +1 -0
- package/dist/canvas-switcher.js +59 -0
- package/dist/canvas-switcher.js.map +1 -0
- package/dist/canvas-tools.d.ts +4 -0
- package/dist/canvas-tools.d.ts.map +1 -0
- package/dist/canvas-tools.js +30 -0
- package/dist/canvas-tools.js.map +1 -0
- package/dist/canvases.d.ts +3 -0
- package/dist/canvases.d.ts.map +1 -0
- package/dist/canvases.js +10 -0
- package/dist/canvases.js.map +1 -0
- package/dist/commands.d.ts +9 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +255 -0
- package/dist/commands.js.map +1 -0
- package/dist/compile.d.ts +31 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +398 -0
- package/dist/compile.js.map +1 -0
- package/dist/contribution.d.ts +30 -0
- package/dist/contribution.d.ts.map +1 -0
- package/dist/contribution.js +10 -0
- package/dist/contribution.js.map +1 -0
- package/dist/help.d.ts +3 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +19 -0
- package/dist/help.js.map +1 -0
- package/dist/host.d.ts +11 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +63 -0
- package/dist/host.js.map +1 -0
- package/dist/i18n.de.js +11 -0
- package/dist/i18n.de.js.map +1 -0
- package/dist/i18n.en.js +11 -0
- package/dist/i18n.en.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/mount.d.ts +15 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +81 -0
- package/dist/mount.js.map +1 -0
- package/dist/workspace-file.d.ts +5 -0
- package/dist/workspace-file.d.ts.map +1 -0
- package/dist/workspace-file.js +41 -0
- package/dist/workspace-file.js.map +1 -0
- package/package.json +41 -4
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-editor.js","names":["_decorate"],"sources":["../src/canvas-editor.ts"],"sourcesContent":["import {\n DocksPart,\n File,\n icon,\n type EditorContentProvider,\n type EditorInput,\n} from '@eclipse-docks/core';\nimport { css, html, nothing, type PropertyValues } from '@eclipse-docks/core/externals/lit';\nimport { customElement, property, query, state } from '@eclipse-docks/core/externals/lit';\nimport { Directive, directive } from 'lit/directive.js';\nimport '@eclipse-docks/extension-monaco-editor/widget';\nimport type { DocksMonacoWidget } from '@eclipse-docks/extension-monaco-editor/widget';\nimport type { CanvasContribution } from './contribution';\nimport { compileCanvas } from './compile';\nimport { createContributionHost, createFileHost, type CanvasHost } from './host';\nimport { elementFromConstructor, mountCompiled, type CanvasViewElement } from './mount';\nimport { canvasBridges } from './bridges/urls';\nimport { readWorkspaceFile } from './workspace-file';\n\nconst heldNode = directive(class extends Directive {\n render(node?: Node) {\n return node ?? nothing;\n }\n});\n\n@customElement('docks-canvas-surface')\nexport class DocksCanvasSurface extends DocksPart implements EditorContentProvider {\n @property({ attribute: false }) input?: EditorInput;\n @property() kind: 'workspace' | 'registered' = 'workspace';\n @property() canvasName?: string;\n @property() entryPath = '';\n @property() source = '';\n @property({ type: Boolean }) showSource = false;\n\n @state() protected sourceText = '';\n @state() protected mode: 'preview' | 'source' = 'preview';\n @state() protected previewError?: string;\n @state() protected previewElement?: CanvasViewElement;\n @query('docks-monaco-widget') protected widget?: DocksMonacoWidget;\n\n protected scrollMode: 'scroller' | 'native' | 'none' = 'none';\n protected host: CanvasHost = { getState: (_key, fallback) => fallback, setState: () => undefined, openFile: () => undefined };\n private previewDispose?: () => void;\n private contribution?: CanvasContribution;\n private ready = false;\n private reloadGeneration = 0;\n private compiledSource = '';\n protected previewStale = false;\n\n override connectedCallback() {\n super.connectedCallback();\n this.addEventListener('dirty', this.onDirty);\n }\n\n override disconnectedCallback() {\n this.removeEventListener('dirty', this.onDirty);\n this.reloadGeneration++;\n super.disconnectedCallback();\n }\n\n protected async doInitUI() {\n const data = this.input?.data;\n if (data instanceof File) {\n this.kind = 'workspace';\n this.entryPath = data.getWorkspacePath();\n this.showSource = true;\n this.sourceText = String(await data.getContents() ?? '');\n this.host = await createFileHost(data);\n } else if (data && typeof data === 'object' && 'contribution' in data) {\n this.contribution = (data as { contribution: CanvasContribution }).contribution;\n this.kind = 'registered';\n this.canvasName = this.contribution.name;\n this.showSource = this.contribution.source !== undefined;\n if (typeof this.contribution.source === 'function') this.sourceText = await this.contribution.source();\n else this.sourceText = this.contribution.source ?? '';\n this.host = await createContributionHost(this.contribution);\n } else if (this.entryPath || this.source) {\n this.kind = 'workspace';\n this.showSource = false;\n this.sourceText = this.source;\n const workspaceFile = await readWorkspaceFile(this.entryPath);\n if (workspaceFile?.text !== undefined && !this.sourceText) this.sourceText = workspaceFile.text;\n this.host = { getState: (_key, fallback) => fallback, setState: () => undefined, openFile: () => undefined };\n }\n this.mode = this.input?.state?.mode === 'source' ? 'source' : 'preview';\n this.ready = true;\n this.requestUpdate();\n if (this.mode === 'preview' || !this.showSource) await this.reload();\n }\n\n protected doClose() {\n this.reloadGeneration++;\n this.previewDispose?.();\n this.previewDispose = undefined;\n this.widget?.dispose();\n }\n\n getContent(): string | null {\n return this.widget?.getContent() ?? this.sourceText;\n }\n\n getSelection(): string | null {\n return this.widget?.getSelection() ?? null;\n }\n\n getSnippet(lines = 5): { snippet: string; cursorLine: number } | null {\n return this.widget?.getSnippet(lines) ?? null;\n }\n\n getLanguage(): string | null {\n return 'javascript';\n }\n\n isLanguage(lang: string): boolean {\n return lang.toLowerCase() === 'javascript';\n }\n\n getFilePath(): string | null {\n const data = this.input?.data;\n if (data instanceof File) return data.getWorkspacePath();\n return this.entryPath || null;\n }\n\n getState(key: string): unknown {\n return this.host.getState(key);\n }\n\n setState(key: string, value: unknown): void {\n this.host.setState(key, value);\n }\n\n setSource(source: string): void {\n this.previewStale = source !== this.compiledSource;\n this.sourceText = source;\n const model = this.widget?.getModel();\n if (model && model.getValue() !== source) model.setValue(source);\n this.requestUpdate();\n }\n\n async reload(): Promise<string> {\n const source = this.getContent() ?? '';\n if (this.previewElement && !this.previewStale && source === this.compiledSource && !this.previewError) return 'ready';\n const generation = ++this.reloadGeneration;\n if (this.kind === 'registered' && this.contribution) {\n try {\n const mod = await this.contribution.load();\n if (generation !== this.reloadGeneration) return 'ready';\n const Ctor = mod.default;\n if (typeof Ctor !== 'function' || !(Ctor.prototype instanceof HTMLElement)) {\n this.previewError = 'Canvas default export must be an HTMLElement subclass';\n this.requestUpdate();\n return this.previewError;\n }\n const element = elementFromConstructor(Ctor);\n element.canvasHost = this.host;\n this.replacePreview(element);\n return 'ready';\n } catch (err) {\n if (generation !== this.reloadGeneration) return 'ready';\n this.previewError = err instanceof Error ? err.message : String(err);\n this.requestUpdate();\n return this.previewError;\n }\n }\n const compiled = await compileCanvas({\n entryPath: this.entryPath || 'canvas.js',\n entrySource: source,\n read: readWorkspaceFile,\n bridges: canvasBridges(),\n });\n if (generation !== this.reloadGeneration) return 'ready';\n if (!compiled.ok) {\n this.previewError = compiled.error;\n this.requestUpdate();\n return compiled.error;\n }\n const mounted = await mountCompiled(compiled.code);\n if (generation !== this.reloadGeneration) {\n if (mounted.ok) mounted.dispose();\n return 'ready';\n }\n if (!mounted.ok) {\n this.previewError = mounted.error;\n this.requestUpdate();\n return mounted.error;\n }\n mounted.element.canvasHost = this.host;\n this.compiledSource = source;\n this.previewStale = false;\n this.replacePreview(mounted.element, mounted.dispose);\n return 'ready';\n }\n\n private replacePreview(element: CanvasViewElement, dispose?: () => void) {\n const previous = this.previewDispose;\n this.previewDispose = dispose ?? (() => element.remove());\n this.previewElement = element;\n this.previewError = undefined;\n this.compiledSource = this.getContent() ?? this.compiledSource;\n this.previewStale = false;\n this.requestUpdate();\n previous?.();\n }\n\n private onDirty = (event: Event) => {\n if (!this.ready || (event as CustomEvent<boolean>).detail !== true) return;\n const source = this.getContent() ?? '';\n if (source === this.compiledSource && this.previewElement) return;\n this.previewStale = true;\n if (this.mode === 'preview' || !this.showSource) void this.reload();\n };\n\n protected updated(changed: PropertyValues) {\n super.updated(changed);\n if (this.mode === 'source') this.widget?.layout();\n }\n\n private onContentChange = () => {\n const next = this.widget?.getContent() ?? this.sourceText;\n this.previewStale = next !== this.compiledSource;\n this.sourceText = next;\n this.markDirty(true);\n };\n\n private toggleMode() {\n if (this.widget) this.sourceText = this.widget.getContent() ?? this.sourceText;\n const next = this.mode === 'preview' ? 'source' : 'preview';\n this.mode = next;\n if (this.input) this.input.state.mode = next;\n if (next === 'preview' && (this.previewStale || !this.previewElement)) void this.reload();\n }\n\n protected renderToolbar() {\n if (!this.ready || !this.showSource) return nothing;\n const toSource = this.mode === 'preview';\n const label = toSource ? 'Source' : 'Preview';\n return html`\n <wa-button appearance=\"plain\" size=\"s\" title=${label} @click=${() => this.toggleMode()}>\n ${icon(toSource ? 'code' : 'eye', { slot: 'start' })}\n ${label}\n </wa-button>\n `;\n }\n\n protected renderContent() {\n if (!this.ready) return html``;\n const showPreview = !this.showSource || this.mode === 'preview';\n return html`\n <div class=\"canvas-preview ${showPreview ? '' : 'canvas-hidden'}\">\n ${this.previewError ? html`<pre class=\"canvas-error\">${this.previewError}</pre>` : nothing}\n <wa-scroller class=\"canvas-scroll\" orientation=\"vertical\">\n <div class=\"canvas-mount\">${heldNode(this.previewElement)}</div>\n </wa-scroller>\n </div>\n ${this.showSource ? html`\n <docks-monaco-widget\n class=${this.mode === 'source' ? '' : 'canvas-hidden'}\n .value=${this.sourceText}\n .language=${'javascript'}\n .uri=${this.entryPath || this.canvasName || 'canvas.js'}\n @content-change=${this.onContentChange}>\n </docks-monaco-widget>\n ` : nothing}\n `;\n }\n\n static styles = css`\n :host { display: flex; flex-direction: column; height: 100%; min-height: 0; }\n .canvas-preview { display: flex; flex-direction: column; height: 100%; min-height: 0; overflow: hidden; }\n .canvas-preview.canvas-hidden, docks-monaco-widget.canvas-hidden { display: none; }\n wa-scroller.canvas-scroll { flex: 1 1 0; min-height: 0; height: 100%; }\n .canvas-mount > * { display: block; }\n docks-monaco-widget { display: block; height: 100%; min-height: 0; }\n .canvas-error {\n margin: 0;\n padding: var(--wa-space-s, 8px);\n white-space: pre-wrap;\n color: var(--wa-color-danger-on-quiet, #b42318);\n }\n `;\n}\n\n@customElement('docks-canvas-editor')\nexport class DocksCanvasEditor extends DocksCanvasSurface {\n override async save(): Promise<void> {\n const value = this.getContent() ?? '';\n const data = this.input?.data;\n if (data instanceof File) await data.saveContents(value);\n this.markDirty(false);\n if (this.mode === 'preview' && this.previewStale) await this.reload();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-canvas-surface': DocksCanvasSurface;\n 'docks-canvas-editor': DocksCanvasEditor;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=canvas-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-extension.d.ts","sourceRoot":"","sources":["../src/canvas-extension.ts"],"names":[],"mappings":"AAgBA,OAAO,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SYSTEM_CANVASES, isCanvasContribution } from "./contribution.js";
|
|
2
|
+
import { CANVAS_SKILL } from "./help.js";
|
|
3
|
+
import { listRegisteredCanvases } from "./canvases.js";
|
|
4
|
+
import { registerCanvasTools } from "./canvas-tools.js";
|
|
5
|
+
import { registerCanvasCommands } from "./commands.js";
|
|
6
|
+
import "./canvas-switcher.js";
|
|
7
|
+
import { File, TOOLBAR_MAIN_RIGHT, TOPIC_CONTRIBUTEIONS_CHANGED, contributionRegistry, editorRegistry, subscribe } from "@eclipse-docks/core";
|
|
8
|
+
import { html } from "@eclipse-docks/core/externals/lit";
|
|
9
|
+
//#region src/canvas-extension.ts
|
|
10
|
+
editorRegistry.registerEditorInputHandler({
|
|
11
|
+
editorId: "system.canvas-editor",
|
|
12
|
+
label: "Canvas",
|
|
13
|
+
icon: "table-columns",
|
|
14
|
+
ranking: 1100,
|
|
15
|
+
canHandle: (input) => input instanceof File && input.getName().toLowerCase().endsWith(".canvas.js"),
|
|
16
|
+
handle: async (input) => {
|
|
17
|
+
const editorInput = {
|
|
18
|
+
title: input.getName(),
|
|
19
|
+
data: input,
|
|
20
|
+
key: input.getWorkspacePath(),
|
|
21
|
+
icon: "table-columns",
|
|
22
|
+
state: { mode: "preview" },
|
|
23
|
+
component: () => html``
|
|
24
|
+
};
|
|
25
|
+
editorInput.component = (id) => html`<docks-canvas-editor id="${id}" .input=${editorInput}></docks-canvas-editor>`;
|
|
26
|
+
return editorInput;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
contributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {
|
|
30
|
+
name: "canvas.switcher",
|
|
31
|
+
label: "Canvases",
|
|
32
|
+
component: () => html`<docks-canvas-switcher></docks-canvas-switcher>`
|
|
33
|
+
});
|
|
34
|
+
function registerListedCanvasTools() {
|
|
35
|
+
for (const canvas of listRegisteredCanvases()) registerCanvasTools(canvas);
|
|
36
|
+
}
|
|
37
|
+
registerCanvasCommands();
|
|
38
|
+
registerListedCanvasTools();
|
|
39
|
+
subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
|
|
40
|
+
if (event?.target !== "system.canvases") return;
|
|
41
|
+
for (const contribution of contributionRegistry.getContributions(SYSTEM_CANVASES)) if (isCanvasContribution(contribution)) registerCanvasTools(contribution);
|
|
42
|
+
});
|
|
43
|
+
import("@eclipse-docks/extension-ai-system/api").then((ai) => {
|
|
44
|
+
ai.cognitiveRuntime.addSystemPromptEnhancer((prompt) => `${prompt}\n\n${CANVAS_SKILL}`);
|
|
45
|
+
}).catch(() => void 0);
|
|
46
|
+
//#endregion
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=canvas-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-extension.js","names":[],"sources":["../src/canvas-extension.ts"],"sourcesContent":["import {\n contributionRegistry,\n editorRegistry,\n File,\n subscribe,\n TOOLBAR_MAIN_RIGHT,\n TOPIC_CONTRIBUTEIONS_CHANGED,\n type EditorInput,\n type HTMLContribution,\n} from '@eclipse-docks/core';\nimport { html } from '@eclipse-docks/core/externals/lit';\nimport { CANVAS_SKILL } from './help';\nimport { isCanvasContribution, SYSTEM_CANVASES } from './contribution';\nimport { listRegisteredCanvases } from './canvases';\nimport { registerCanvasTools } from './canvas-tools';\nimport { registerCanvasCommands } from './commands';\nimport './canvas-switcher';\n\neditorRegistry.registerEditorInputHandler({\n editorId: 'system.canvas-editor',\n label: 'Canvas',\n icon: 'table-columns',\n ranking: 1100,\n canHandle: (input: unknown) => input instanceof File && input.getName().toLowerCase().endsWith('.canvas.js'),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getName(),\n data: input,\n key: input.getWorkspacePath(),\n icon: 'table-columns',\n state: { mode: 'preview' },\n component: () => html``,\n } as EditorInput;\n editorInput.component = (id: string) => html`<docks-canvas-editor id=\"${id}\" .input=${editorInput}></docks-canvas-editor>`;\n return editorInput;\n },\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {\n name: 'canvas.switcher',\n label: 'Canvases',\n component: () => html`<docks-canvas-switcher></docks-canvas-switcher>`,\n} as HTMLContribution);\n\nfunction registerListedCanvasTools(): void {\n for (const canvas of listRegisteredCanvases()) registerCanvasTools(canvas);\n}\n\nregisterCanvasCommands();\nregisterListedCanvasTools();\nsubscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target !== SYSTEM_CANVASES) return;\n for (const contribution of contributionRegistry.getContributions(SYSTEM_CANVASES)) {\n if (isCanvasContribution(contribution)) registerCanvasTools(contribution);\n }\n});\n\nvoid import('@eclipse-docks/extension-ai-system/api').then(ai => {\n ai.cognitiveRuntime.addSystemPromptEnhancer(prompt => `${prompt}\\n\\n${CANVAS_SKILL}`);\n}).catch(() => undefined);\n"],"mappings":";;;;;;;;;AAkBA,eAAe,2BAA2B;CACtC,UAAU;CACV,OAAO;CACP,MAAM;CACN,SAAS;CACT,YAAY,UAAmB,iBAAiB,QAAQ,MAAM,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,YAAY;CAC3G,QAAQ,OAAO,UAAgB;EAC3B,MAAM,cAAc;GAChB,OAAO,MAAM,QAAQ;GACrB,MAAM;GACN,KAAK,MAAM,iBAAiB;GAC5B,MAAM;GACN,OAAO,EAAE,MAAM,UAAU;GACzB,iBAAiB,IAAI;EACzB;EACA,YAAY,aAAa,OAAe,IAAI,4BAA4B,GAAG,WAAW,YAAY;EAClG,OAAO;CACX;AACJ,CAAC;AAED,qBAAqB,qBAAqB,oBAAoB;CAC1D,MAAM;CACN,OAAO;CACP,iBAAiB,IAAI;AACzB,CAAqB;AAErB,SAAS,4BAAkC;CACvC,KAAK,MAAM,UAAU,uBAAuB,GAAG,oBAAoB,MAAM;AAC7E;AAEA,uBAAuB;AACvB,0BAA0B;AAC1B,UAAU,+BAA+B,UAA+B;CACpE,IAAI,OAAO,WAAA,mBAA4B;CACvC,KAAK,MAAM,gBAAgB,qBAAqB,iBAAiB,eAAe,GAC5E,IAAI,qBAAqB,YAAY,GAAG,oBAAoB,YAAY;AAEhF,CAAC;AAEI,OAAO,yCAAyC,CAAC,MAAK,OAAM;CAC7D,GAAG,iBAAiB,yBAAwB,WAAU,GAAG,OAAO,MAAM,cAAc;AACxF,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DocksElement } from '@eclipse-docks/core';
|
|
2
|
+
export declare class DocksCanvasSwitcher extends DocksElement {
|
|
3
|
+
private canvases;
|
|
4
|
+
private topic?;
|
|
5
|
+
protected doBeforeUI(): void;
|
|
6
|
+
disconnectedCallback(): void;
|
|
7
|
+
private onSelect;
|
|
8
|
+
protected render(): import('lit-html').TemplateResult<1>;
|
|
9
|
+
static styles: import('lit').CSSResult;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=canvas-switcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-switcher.d.ts","sourceRoot":"","sources":["../src/canvas-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA8D,MAAM,qBAAqB,CAAC;AAO/G,qBACa,mBAAoB,SAAQ,YAAY;IACxC,OAAO,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAC,CAAS;IAEvB,SAAS,CAAC,UAAU;IAOpB,oBAAoB;IAKpB,OAAO,CAAC,QAAQ,CAKd;IAEF,SAAS,CAAC,MAAM;IAiBhB,MAAM,CAAC,MAAM,0BAEX;CACL"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import "./contribution.js";
|
|
2
|
+
import { listRegisteredCanvases } from "./canvases.js";
|
|
3
|
+
import __decorate from "./_virtual/_@oxc-project_runtime@0.152.0/helpers/esm/decorate.js";
|
|
4
|
+
import { openCanvasByName } from "./commands.js";
|
|
5
|
+
import { DocksElement, TOPIC_CONTRIBUTEIONS_CHANGED, icon, subscribe, unsubscribe } from "@eclipse-docks/core";
|
|
6
|
+
import { css, customElement, html, state } from "@eclipse-docks/core/externals/lit";
|
|
7
|
+
//#region src/canvas-switcher.ts
|
|
8
|
+
var DocksCanvasSwitcher = class DocksCanvasSwitcher extends DocksElement {
|
|
9
|
+
constructor(..._args) {
|
|
10
|
+
super(..._args);
|
|
11
|
+
this.canvases = listRegisteredCanvases();
|
|
12
|
+
this.onSelect = (event) => {
|
|
13
|
+
const item = event.detail?.item;
|
|
14
|
+
const name = item?.value || item?.getAttribute("value");
|
|
15
|
+
if (!name) return;
|
|
16
|
+
openCanvasByName(name);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
doBeforeUI() {
|
|
20
|
+
this.topic = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
|
|
21
|
+
if (event?.target !== "system.canvases") return;
|
|
22
|
+
this.canvases = listRegisteredCanvases();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
disconnectedCallback() {
|
|
26
|
+
if (this.topic) unsubscribe(this.topic);
|
|
27
|
+
super.disconnectedCallback();
|
|
28
|
+
}
|
|
29
|
+
render() {
|
|
30
|
+
if (this.canvases.length === 0) return html``;
|
|
31
|
+
return html`
|
|
32
|
+
<wa-dropdown placement="bottom-end" distance="4" size="s" @wa-select=${this.onSelect}>
|
|
33
|
+
<wa-button slot="trigger" appearance="plain" size="s" with-caret title="Canvases">
|
|
34
|
+
${icon("table-columns", { label: "Canvases" })}
|
|
35
|
+
</wa-button>
|
|
36
|
+
${this.canvases.map((canvas) => html`
|
|
37
|
+
<wa-dropdown-item value="${canvas.name ?? ""}">
|
|
38
|
+
${icon(canvas.icon, {
|
|
39
|
+
label: canvas.label,
|
|
40
|
+
slot: "icon"
|
|
41
|
+
})}
|
|
42
|
+
${canvas.label}
|
|
43
|
+
</wa-dropdown-item>
|
|
44
|
+
`)}
|
|
45
|
+
</wa-dropdown>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
static {
|
|
49
|
+
this.styles = css`
|
|
50
|
+
:host { display: inline-block; }
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
__decorate([state()], DocksCanvasSwitcher.prototype, "canvases", void 0);
|
|
55
|
+
DocksCanvasSwitcher = __decorate([customElement("docks-canvas-switcher")], DocksCanvasSwitcher);
|
|
56
|
+
//#endregion
|
|
57
|
+
export { DocksCanvasSwitcher };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=canvas-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-switcher.js","names":["_decorate"],"sources":["../src/canvas-switcher.ts"],"sourcesContent":["import { DocksElement, icon, subscribe, TOPIC_CONTRIBUTEIONS_CHANGED, unsubscribe } from '@eclipse-docks/core';\nimport { css, html } from '@eclipse-docks/core/externals/lit';\nimport { customElement, state } from '@eclipse-docks/core/externals/lit';\nimport { listRegisteredCanvases } from './canvases';\nimport { SYSTEM_CANVASES } from './contribution';\nimport { openCanvasByName } from './commands';\n\n@customElement('docks-canvas-switcher')\nexport class DocksCanvasSwitcher extends DocksElement {\n @state() private canvases = listRegisteredCanvases();\n private topic?: string;\n\n protected doBeforeUI() {\n this.topic = subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: { target?: string }) => {\n if (event?.target !== SYSTEM_CANVASES) return;\n this.canvases = listRegisteredCanvases();\n });\n }\n\n disconnectedCallback() {\n if (this.topic) unsubscribe(this.topic);\n super.disconnectedCallback();\n }\n\n private onSelect = (event: CustomEvent) => {\n const item = event.detail?.item as HTMLElement & { value?: string } | undefined;\n const name = item?.value || item?.getAttribute('value');\n if (!name) return;\n void openCanvasByName(name);\n };\n\n protected render() {\n if (this.canvases.length === 0) return html``;\n return html`\n <wa-dropdown placement=\"bottom-end\" distance=\"4\" size=\"s\" @wa-select=${this.onSelect}>\n <wa-button slot=\"trigger\" appearance=\"plain\" size=\"s\" with-caret title=\"Canvases\">\n ${icon('table-columns', { label: 'Canvases' })}\n </wa-button>\n ${this.canvases.map(canvas => html`\n <wa-dropdown-item value=\"${canvas.name ?? ''}\">\n ${icon(canvas.icon, { label: canvas.label, slot: 'icon' })}\n ${canvas.label}\n </wa-dropdown-item>\n `)}\n </wa-dropdown>\n `;\n }\n\n static styles = css`\n :host { display: inline-block; }\n `;\n}\n"],"mappings":";;;;;;;AAQO,IAAM,sBAAN,MAAM,4BAA4B,aAAa;;;EACtB,KAAA,WAAA,uBAAuB;EAe/B,KAAA,YAAA,UAAuB;GACvC,MAAM,OAAO,MAAM,QAAQ;GAC3B,MAAM,OAAO,MAAM,SAAS,MAAM,aAAa,OAAO;GACtD,IAAI,CAAC,MAAM;GACX,iBAAsB,IAAI;EAC9B;;CAjBA,aAAuB;EACnB,KAAK,QAAQ,UAAU,+BAA+B,UAA+B;GACjF,IAAI,OAAO,WAAA,mBAA4B;GACvC,KAAK,WAAW,uBAAuB;EAC3C,CAAC;CACL;CAEA,uBAAuB;EACnB,IAAI,KAAK,OAAO,YAAY,KAAK,KAAK;EACtC,MAAM,qBAAqB;CAC/B;CASA,SAAmB;EACf,IAAI,KAAK,SAAS,WAAW,GAAG,OAAO,IAAI;EAC3C,OAAO,IAAI;mFACgE,KAAK,SAAS;;sBAE3E,KAAK,iBAAiB,EAAE,OAAO,WAAW,CAAC,EAAE;;kBAEjD,KAAK,SAAS,KAAI,WAAU,IAAI;+CACH,OAAO,QAAQ,GAAG;0BACvC,KAAK,OAAO,MAAM;GAAE,OAAO,OAAO;GAAO,MAAM;EAAO,CAAC,EAAE;0BACzD,OAAO,MAAM;;iBAEtB,EAAE;;;CAGf;;EAEgB,KAAA,SAAA,GAAG;;;;AAGvB;AA1CKA,WAAA,CAAA,MAAM,CAAA,GAAA,oBAAA,WAAA,YAAA,KAAA,CAAA;AAFV,sBAAAA,WAAA,CAAA,cAAc,uBAAuB,CAAA,GAAA,mBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-tools.d.ts","sourceRoot":"","sources":["../src/canvas-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAiB1E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { readActiveCanvas } from "./active-canvas.js";
|
|
2
|
+
import { registerAll } from "@eclipse-docks/core";
|
|
3
|
+
//#region src/canvas-tools.ts
|
|
4
|
+
var registeredToolIds = /* @__PURE__ */ new Set();
|
|
5
|
+
function canvasToolIsActive(canvasName) {
|
|
6
|
+
const active = readActiveCanvas();
|
|
7
|
+
return !!active?.editor && active.kind === "registered" && active.canvasName === canvasName;
|
|
8
|
+
}
|
|
9
|
+
function registerCanvasTools(contribution) {
|
|
10
|
+
for (const tool of contribution.tools ?? []) {
|
|
11
|
+
if (registeredToolIds.has(tool.id)) continue;
|
|
12
|
+
registeredToolIds.add(tool.id);
|
|
13
|
+
registerAll({
|
|
14
|
+
command: {
|
|
15
|
+
id: tool.id,
|
|
16
|
+
name: tool.name,
|
|
17
|
+
description: tool.description,
|
|
18
|
+
parameters: tool.parameters
|
|
19
|
+
},
|
|
20
|
+
handler: {
|
|
21
|
+
canExecute: () => canvasToolIsActive(contribution.name),
|
|
22
|
+
execute: (context) => tool.execute({ params: context.params })
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { canvasToolIsActive, registerCanvasTools };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=canvas-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-tools.js","names":[],"sources":["../src/canvas-tools.ts"],"sourcesContent":["import { registerAll } from '@eclipse-docks/core';\nimport { readActiveCanvas } from './active-canvas';\nimport type { CanvasContribution } from './contribution';\n\nconst registeredToolIds = new Set<string>();\n\nexport function canvasToolIsActive(canvasName: string | undefined): boolean {\n const active = readActiveCanvas();\n return !!active?.editor && active.kind === 'registered' && active.canvasName === canvasName;\n}\n\nexport function registerCanvasTools(contribution: CanvasContribution): void {\n for (const tool of contribution.tools ?? []) {\n if (registeredToolIds.has(tool.id)) continue;\n registeredToolIds.add(tool.id);\n registerAll({\n command: {\n id: tool.id,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n handler: {\n canExecute: () => canvasToolIsActive(contribution.name),\n execute: context => tool.execute({ params: context.params as Record<string, unknown> | undefined }),\n },\n });\n }\n}\n"],"mappings":";;;AAIA,IAAM,oCAAoB,IAAI,IAAY;AAE1C,SAAgB,mBAAmB,YAAyC;CACxE,MAAM,SAAS,iBAAiB;CAChC,OAAO,CAAC,CAAC,QAAQ,UAAU,OAAO,SAAS,gBAAgB,OAAO,eAAe;AACrF;AAEA,SAAgB,oBAAoB,cAAwC;CACxE,KAAK,MAAM,QAAQ,aAAa,SAAS,CAAC,GAAG;EACzC,IAAI,kBAAkB,IAAI,KAAK,EAAE,GAAG;EACpC,kBAAkB,IAAI,KAAK,EAAE;EAC7B,YAAY;GACR,SAAS;IACL,IAAI,KAAK;IACT,MAAM,KAAK;IACX,aAAa,KAAK;IAClB,YAAY,KAAK;GACrB;GACA,SAAS;IACL,kBAAkB,mBAAmB,aAAa,IAAI;IACtD,UAAS,YAAW,KAAK,QAAQ,EAAE,QAAQ,QAAQ,OAA8C,CAAC;GACtG;EACJ,CAAC;CACL;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvases.d.ts","sourceRoot":"","sources":["../src/canvases.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhG,wBAAgB,sBAAsB,IAAI,kBAAkB,EAAE,CAE7D"}
|
package/dist/canvases.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SYSTEM_CANVASES, isCanvasContribution } from "./contribution.js";
|
|
2
|
+
import { contributionRegistry } from "@eclipse-docks/core";
|
|
3
|
+
//#region src/canvases.ts
|
|
4
|
+
function listRegisteredCanvases() {
|
|
5
|
+
return contributionRegistry.getContributions(SYSTEM_CANVASES).filter(isCanvasContribution);
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { listRegisteredCanvases };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=canvases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvases.js","names":[],"sources":["../src/canvases.ts"],"sourcesContent":["import { contributionRegistry } from '@eclipse-docks/core';\nimport { isCanvasContribution, SYSTEM_CANVASES, type CanvasContribution } from './contribution';\n\nexport function listRegisteredCanvases(): CanvasContribution[] {\n return contributionRegistry.getContributions(SYSTEM_CANVASES).filter(isCanvasContribution);\n}\n"],"mappings":";;;AAGA,SAAgB,yBAA+C;CAC3D,OAAO,qBAAqB,iBAAiB,eAAe,CAAC,CAAC,OAAO,oBAAoB;AAC7F"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EditorInput } from '@eclipse-docks/core';
|
|
2
|
+
import { CanvasContribution } from './contribution';
|
|
3
|
+
export declare function canvasEditorInput(contribution: CanvasContribution, sourceText?: string): EditorInput;
|
|
4
|
+
export declare function openCanvasByName(name: string): Promise<string>;
|
|
5
|
+
export declare function openCanvasByPath(path: string): Promise<string>;
|
|
6
|
+
export declare function showCanvasView(slot: string, path: string, source: string): string;
|
|
7
|
+
export declare function hideCanvasView(slot: string, path: string): string;
|
|
8
|
+
export declare function registerCanvasCommands(): void;
|
|
9
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EASH,KAAK,WAAW,EACnB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,iBAAiB,CAAC;AAIzB,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,EAAE,UAAU,SAAK,GAAG,WAAW,CAehG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOpE;AAMD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAYjF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAiBD,wBAAgB,sBAAsB,IAAI,IAAI,CAiK7C"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { CANVAS_HELP } from "./help.js";
|
|
2
|
+
import { listRegisteredCanvases } from "./canvases.js";
|
|
3
|
+
import { readActiveCanvas } from "./active-canvas.js";
|
|
4
|
+
import "./canvas-editor.js";
|
|
5
|
+
import { File, PANEL_BOTTOM, SIDEBAR_AUXILIARY, SIDEBAR_MAIN, contributionRegistry, editorRegistry, registerAll, workspaceService } from "@eclipse-docks/core";
|
|
6
|
+
import { html } from "@eclipse-docks/core/externals/lit";
|
|
7
|
+
//#region src/commands.ts
|
|
8
|
+
var VIEW_SLOTS = /* @__PURE__ */ new Set([
|
|
9
|
+
SIDEBAR_MAIN,
|
|
10
|
+
SIDEBAR_AUXILIARY,
|
|
11
|
+
PANEL_BOTTOM
|
|
12
|
+
]);
|
|
13
|
+
function canvasEditorInput(contribution, sourceText = "") {
|
|
14
|
+
const hasSource = contribution.source !== void 0;
|
|
15
|
+
const input = {
|
|
16
|
+
key: `canvas:${contribution.name}`,
|
|
17
|
+
title: contribution.label,
|
|
18
|
+
icon: contribution.icon ?? "table-columns",
|
|
19
|
+
data: { contribution },
|
|
20
|
+
state: { mode: "preview" },
|
|
21
|
+
component: () => html``
|
|
22
|
+
};
|
|
23
|
+
input.component = (id) => hasSource ? html`<docks-canvas-editor id="${id}" .input=${input} .source=${sourceText}></docks-canvas-editor>` : html`<docks-canvas-surface id="${id}" .input=${input}></docks-canvas-surface>`;
|
|
24
|
+
input.editorId = "system.canvas-editor";
|
|
25
|
+
return input;
|
|
26
|
+
}
|
|
27
|
+
async function openCanvasByName(name) {
|
|
28
|
+
const contribution = listRegisteredCanvases().find((item) => item.name === name);
|
|
29
|
+
if (!contribution) return `No canvas named ${name}`;
|
|
30
|
+
const sourceText = typeof contribution.source === "function" ? await contribution.source() : contribution.source ?? "";
|
|
31
|
+
await editorRegistry.loadEditor(canvasEditorInput(contribution, sourceText));
|
|
32
|
+
return "ready";
|
|
33
|
+
}
|
|
34
|
+
async function openCanvasByPath(path) {
|
|
35
|
+
const workspace = workspaceService.getWorkspaceSync() ?? await workspaceService.getWorkspace();
|
|
36
|
+
if (!workspace) return "No workspace is open";
|
|
37
|
+
const resource = await workspace.getResource(path.replace(/^\/+/, ""));
|
|
38
|
+
if (!(resource instanceof File)) return `Cannot find workspace file "${path}"`;
|
|
39
|
+
await editorRegistry.loadEditor(resource, "system.canvas-editor");
|
|
40
|
+
return "ready";
|
|
41
|
+
}
|
|
42
|
+
function viewName(path) {
|
|
43
|
+
return `canvas-view:${path}`;
|
|
44
|
+
}
|
|
45
|
+
function showCanvasView(slot, path, source) {
|
|
46
|
+
if (!VIEW_SLOTS.has(slot)) return `Unsupported view slot ${slot}`;
|
|
47
|
+
const name = viewName(path);
|
|
48
|
+
contributionRegistry.unregisterContribution(slot, name);
|
|
49
|
+
contributionRegistry.registerContribution(slot, {
|
|
50
|
+
name,
|
|
51
|
+
label: path.split("/").pop() || path,
|
|
52
|
+
icon: "table-columns",
|
|
53
|
+
closable: true,
|
|
54
|
+
component: (id) => html`<docks-canvas-surface id="${id}" .entryPath=${path} .source=${source}></docks-canvas-surface>`
|
|
55
|
+
});
|
|
56
|
+
return "ready";
|
|
57
|
+
}
|
|
58
|
+
function hideCanvasView(slot, path) {
|
|
59
|
+
if (!VIEW_SLOTS.has(slot)) return `Unsupported view slot ${slot}`;
|
|
60
|
+
contributionRegistry.unregisterContribution(slot, viewName(path));
|
|
61
|
+
return "ready";
|
|
62
|
+
}
|
|
63
|
+
function workspaceCanvas() {
|
|
64
|
+
const active = readActiveCanvas();
|
|
65
|
+
if (!active?.editor || active.kind !== "workspace") return null;
|
|
66
|
+
return active;
|
|
67
|
+
}
|
|
68
|
+
async function waitForCanvas(match) {
|
|
69
|
+
for (let attempt = 0; attempt < 30; attempt++) {
|
|
70
|
+
const active = readActiveCanvas();
|
|
71
|
+
if (active?.reload && match(active)) return active;
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function registerCanvasCommands() {
|
|
77
|
+
registerAll({
|
|
78
|
+
command: {
|
|
79
|
+
id: "canvas.help",
|
|
80
|
+
name: "Canvas help",
|
|
81
|
+
description: "Returns the canvas.js contract and the canvases registered on system.canvases",
|
|
82
|
+
parameters: []
|
|
83
|
+
},
|
|
84
|
+
handler: { execute: async () => {
|
|
85
|
+
const listed = listRegisteredCanvases().map((item) => `${item.name}: ${item.label}`).join("\n");
|
|
86
|
+
return listed ? `${CANVAS_HELP}\n\nRegistered canvases:\n${listed}` : CANVAS_HELP;
|
|
87
|
+
} }
|
|
88
|
+
});
|
|
89
|
+
registerAll({
|
|
90
|
+
command: {
|
|
91
|
+
id: "canvas.open",
|
|
92
|
+
name: "Open canvas",
|
|
93
|
+
description: "Opens a workspace .canvas.js path or a canvas registered on system.canvases and returns ready or a compile error",
|
|
94
|
+
parameters: [{
|
|
95
|
+
name: "path",
|
|
96
|
+
description: "Workspace path of a .canvas.js file",
|
|
97
|
+
required: false
|
|
98
|
+
}, {
|
|
99
|
+
name: "name",
|
|
100
|
+
description: "Name of a canvas registered on system.canvases",
|
|
101
|
+
required: false
|
|
102
|
+
}]
|
|
103
|
+
},
|
|
104
|
+
handler: { execute: async ({ params }) => {
|
|
105
|
+
const name = params?.name;
|
|
106
|
+
const path = params?.path;
|
|
107
|
+
if (name) {
|
|
108
|
+
const opened = await openCanvasByName(name);
|
|
109
|
+
if (opened !== "ready") return opened;
|
|
110
|
+
const active = await waitForCanvas((item) => item.canvasName === name);
|
|
111
|
+
return active?.reload ? active.reload() : opened;
|
|
112
|
+
}
|
|
113
|
+
if (path) {
|
|
114
|
+
const opened = await openCanvasByPath(path);
|
|
115
|
+
if (opened !== "ready") return opened;
|
|
116
|
+
const active = await waitForCanvas((item) => item.kind === "workspace");
|
|
117
|
+
return active?.reload ? active.reload() : opened;
|
|
118
|
+
}
|
|
119
|
+
return "Provide a workspace path or a registered canvas name";
|
|
120
|
+
} }
|
|
121
|
+
});
|
|
122
|
+
registerAll({
|
|
123
|
+
command: {
|
|
124
|
+
id: "canvas.apply_source",
|
|
125
|
+
name: "Apply canvas source",
|
|
126
|
+
description: "Writes source into the active workspace canvas, compiles it, and returns ready or the compile error",
|
|
127
|
+
parameters: [{
|
|
128
|
+
name: "source",
|
|
129
|
+
description: "Full canvas module source",
|
|
130
|
+
required: true
|
|
131
|
+
}, {
|
|
132
|
+
name: "path",
|
|
133
|
+
description: "Workspace path of the canvas file",
|
|
134
|
+
required: false
|
|
135
|
+
}]
|
|
136
|
+
},
|
|
137
|
+
handler: {
|
|
138
|
+
canExecute: () => !!workspaceCanvas(),
|
|
139
|
+
execute: async ({ params }) => {
|
|
140
|
+
const active = workspaceCanvas();
|
|
141
|
+
if (!active?.setSource || !active.reload) return "No workspace canvas is active";
|
|
142
|
+
const source = String(params?.source ?? "");
|
|
143
|
+
const path = params?.path ?? active.getFilePath?.() ?? void 0;
|
|
144
|
+
if (path) {
|
|
145
|
+
const { writeWorkspaceFile } = await import("./workspace-file.js");
|
|
146
|
+
if (!await writeWorkspaceFile(path, source)) return `Cannot write workspace file "${path}"`;
|
|
147
|
+
}
|
|
148
|
+
active.setSource(source);
|
|
149
|
+
return active.reload();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
registerAll({
|
|
154
|
+
command: {
|
|
155
|
+
id: "canvas.get_source",
|
|
156
|
+
name: "Get canvas source",
|
|
157
|
+
description: "Returns the current source buffer of the active workspace canvas",
|
|
158
|
+
parameters: []
|
|
159
|
+
},
|
|
160
|
+
handler: {
|
|
161
|
+
canExecute: () => !!workspaceCanvas(),
|
|
162
|
+
execute: async () => workspaceCanvas()?.getContent?.() ?? ""
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
registerAll({
|
|
166
|
+
command: {
|
|
167
|
+
id: "canvas.get_state",
|
|
168
|
+
name: "Get canvas state",
|
|
169
|
+
description: "Reads one persisted state value from the active workspace canvas",
|
|
170
|
+
parameters: [{
|
|
171
|
+
name: "key",
|
|
172
|
+
description: "State key",
|
|
173
|
+
required: true
|
|
174
|
+
}]
|
|
175
|
+
},
|
|
176
|
+
handler: {
|
|
177
|
+
canExecute: () => !!workspaceCanvas(),
|
|
178
|
+
execute: async ({ params }) => workspaceCanvas()?.getState?.(String(params?.key ?? ""))
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
registerAll({
|
|
182
|
+
command: {
|
|
183
|
+
id: "canvas.set_state",
|
|
184
|
+
name: "Set canvas state",
|
|
185
|
+
description: "Writes one persisted state value on the active workspace canvas",
|
|
186
|
+
parameters: [{
|
|
187
|
+
name: "key",
|
|
188
|
+
description: "State key",
|
|
189
|
+
required: true
|
|
190
|
+
}, {
|
|
191
|
+
name: "value",
|
|
192
|
+
description: "JSON value",
|
|
193
|
+
required: true
|
|
194
|
+
}]
|
|
195
|
+
},
|
|
196
|
+
handler: {
|
|
197
|
+
canExecute: () => !!workspaceCanvas(),
|
|
198
|
+
execute: async ({ params }) => {
|
|
199
|
+
const active = workspaceCanvas();
|
|
200
|
+
if (!active?.setState) return "No workspace canvas is active";
|
|
201
|
+
active.setState(String(params?.key ?? ""), params?.value);
|
|
202
|
+
return "ready";
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
registerAll({
|
|
207
|
+
command: {
|
|
208
|
+
id: "canvas.show_as_view",
|
|
209
|
+
name: "Show canvas as view",
|
|
210
|
+
description: "Pins the active workspace canvas preview into a sidebar or the bottom panel",
|
|
211
|
+
parameters: [{
|
|
212
|
+
name: "slot",
|
|
213
|
+
description: "sidebar-main, sidebar-auxiliary, or panel-bottom",
|
|
214
|
+
required: true
|
|
215
|
+
}]
|
|
216
|
+
},
|
|
217
|
+
handler: {
|
|
218
|
+
canExecute: () => !!workspaceCanvas(),
|
|
219
|
+
execute: async ({ params }) => {
|
|
220
|
+
const active = workspaceCanvas();
|
|
221
|
+
const path = active?.getFilePath?.();
|
|
222
|
+
if (!active || !path) return "No workspace canvas is active";
|
|
223
|
+
return showCanvasView(String(params?.slot ?? ""), path, active.getContent?.() ?? "");
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
registerAll({
|
|
228
|
+
command: {
|
|
229
|
+
id: "canvas.hide_view",
|
|
230
|
+
name: "Hide canvas view",
|
|
231
|
+
description: "Removes a pinned canvas preview from a sidebar or the bottom panel",
|
|
232
|
+
parameters: [{
|
|
233
|
+
name: "slot",
|
|
234
|
+
description: "sidebar-main, sidebar-auxiliary, or panel-bottom",
|
|
235
|
+
required: true
|
|
236
|
+
}, {
|
|
237
|
+
name: "path",
|
|
238
|
+
description: "Workspace path of the canvas file",
|
|
239
|
+
required: false
|
|
240
|
+
}]
|
|
241
|
+
},
|
|
242
|
+
handler: {
|
|
243
|
+
canExecute: () => !!workspaceCanvas(),
|
|
244
|
+
execute: async ({ params }) => {
|
|
245
|
+
const path = params?.path ?? workspaceCanvas()?.getFilePath?.() ?? "";
|
|
246
|
+
if (!path) return "No canvas path";
|
|
247
|
+
return hideCanvasView(String(params?.slot ?? ""), path);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//#endregion
|
|
253
|
+
export { canvasEditorInput, hideCanvasView, openCanvasByName, openCanvasByPath, registerCanvasCommands, showCanvasView };
|
|
254
|
+
|
|
255
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","names":[],"sources":["../src/commands.ts"],"sourcesContent":["import {\n contributionRegistry,\n editorRegistry,\n File,\n registerAll,\n SIDEBAR_AUXILIARY,\n SIDEBAR_MAIN,\n PANEL_BOTTOM,\n workspaceService,\n type EditorInput,\n} from '@eclipse-docks/core';\nimport { html } from '@eclipse-docks/core/externals/lit';\nimport { readActiveCanvas } from './active-canvas';\nimport { listRegisteredCanvases } from './canvases';\nimport type { CanvasContribution } from './contribution';\nimport { CANVAS_HELP } from './help';\nimport './canvas-editor';\n\nconst VIEW_SLOTS = new Set([SIDEBAR_MAIN, SIDEBAR_AUXILIARY, PANEL_BOTTOM]);\n\nexport function canvasEditorInput(contribution: CanvasContribution, sourceText = ''): EditorInput {\n const hasSource = contribution.source !== undefined;\n const input = {\n key: `canvas:${contribution.name}`,\n title: contribution.label,\n icon: contribution.icon ?? 'table-columns',\n data: { contribution },\n state: { mode: 'preview' },\n component: () => html``,\n } as EditorInput;\n input.component = (id: string) => hasSource\n ? html`<docks-canvas-editor id=\"${id}\" .input=${input} .source=${sourceText}></docks-canvas-editor>`\n : html`<docks-canvas-surface id=\"${id}\" .input=${input}></docks-canvas-surface>`;\n (input as unknown as { editorId: string }).editorId = 'system.canvas-editor';\n return input;\n}\n\nexport async function openCanvasByName(name: string): Promise<string> {\n const contribution = listRegisteredCanvases().find(item => item.name === name);\n if (!contribution) return `No canvas named ${name}`;\n const sourceText = typeof contribution.source === 'function' ? await contribution.source() : (contribution.source ?? '');\n await editorRegistry.loadEditor(canvasEditorInput(contribution, sourceText));\n return 'ready';\n}\n\nexport async function openCanvasByPath(path: string): Promise<string> {\n const workspace = workspaceService.getWorkspaceSync() ?? await workspaceService.getWorkspace();\n if (!workspace) return 'No workspace is open';\n const resource = await workspace.getResource(path.replace(/^\\/+/, ''));\n if (!(resource instanceof File)) return `Cannot find workspace file \"${path}\"`;\n await editorRegistry.loadEditor(resource, 'system.canvas-editor');\n return 'ready';\n}\n\nfunction viewName(path: string): string {\n return `canvas-view:${path}`;\n}\n\nexport function showCanvasView(slot: string, path: string, source: string): string {\n if (!VIEW_SLOTS.has(slot)) return `Unsupported view slot ${slot}`;\n const name = viewName(path);\n contributionRegistry.unregisterContribution(slot, name);\n contributionRegistry.registerContribution(slot, {\n name,\n label: path.split('/').pop() || path,\n icon: 'table-columns',\n closable: true,\n component: (id: string) => html`<docks-canvas-surface id=\"${id}\" .entryPath=${path} .source=${source}></docks-canvas-surface>`,\n });\n return 'ready';\n}\n\nexport function hideCanvasView(slot: string, path: string): string {\n if (!VIEW_SLOTS.has(slot)) return `Unsupported view slot ${slot}`;\n contributionRegistry.unregisterContribution(slot, viewName(path));\n return 'ready';\n}\n\nfunction workspaceCanvas() {\n const active = readActiveCanvas();\n if (!active?.editor || active.kind !== 'workspace') return null;\n return active;\n}\n\nasync function waitForCanvas(match: (active: NonNullable<ReturnType<typeof readActiveCanvas>>) => boolean) {\n for (let attempt = 0; attempt < 30; attempt++) {\n const active = readActiveCanvas();\n if (active?.reload && match(active)) return active;\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n return null;\n}\n\nexport function registerCanvasCommands(): void {\n registerAll({\n command: {\n id: 'canvas.help',\n name: 'Canvas help',\n description: 'Returns the canvas.js contract and the canvases registered on system.canvases',\n parameters: [],\n },\n handler: {\n execute: async () => {\n const listed = listRegisteredCanvases().map(item => `${item.name}: ${item.label}`).join('\\n');\n return listed ? `${CANVAS_HELP}\\n\\nRegistered canvases:\\n${listed}` : CANVAS_HELP;\n },\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.open',\n name: 'Open canvas',\n description: 'Opens a workspace .canvas.js path or a canvas registered on system.canvases and returns ready or a compile error',\n parameters: [\n { name: 'path', description: 'Workspace path of a .canvas.js file', required: false },\n { name: 'name', description: 'Name of a canvas registered on system.canvases', required: false },\n ],\n },\n handler: {\n execute: async ({ params }) => {\n const name = params?.name as string | undefined;\n const path = params?.path as string | undefined;\n if (name) {\n const opened = await openCanvasByName(name);\n if (opened !== 'ready') return opened;\n const active = await waitForCanvas(item => item.canvasName === name);\n return active?.reload ? active.reload() : opened;\n }\n if (path) {\n const opened = await openCanvasByPath(path);\n if (opened !== 'ready') return opened;\n const active = await waitForCanvas(item => item.kind === 'workspace');\n return active?.reload ? active.reload() : opened;\n }\n return 'Provide a workspace path or a registered canvas name';\n },\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.apply_source',\n name: 'Apply canvas source',\n description: 'Writes source into the active workspace canvas, compiles it, and returns ready or the compile error',\n parameters: [\n { name: 'source', description: 'Full canvas module source', required: true },\n { name: 'path', description: 'Workspace path of the canvas file', required: false },\n ],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async ({ params }) => {\n const active = workspaceCanvas();\n if (!active?.setSource || !active.reload) return 'No workspace canvas is active';\n const source = String(params?.source ?? '');\n const path = (params?.path as string | undefined) ?? active.getFilePath?.() ?? undefined;\n if (path) {\n const { writeWorkspaceFile } = await import('./workspace-file');\n const written = await writeWorkspaceFile(path, source);\n if (!written) return `Cannot write workspace file \"${path}\"`;\n }\n active.setSource(source);\n return active.reload();\n },\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.get_source',\n name: 'Get canvas source',\n description: 'Returns the current source buffer of the active workspace canvas',\n parameters: [],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async () => workspaceCanvas()?.getContent?.() ?? '',\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.get_state',\n name: 'Get canvas state',\n description: 'Reads one persisted state value from the active workspace canvas',\n parameters: [{ name: 'key', description: 'State key', required: true }],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async ({ params }) => workspaceCanvas()?.getState?.(String(params?.key ?? '')),\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.set_state',\n name: 'Set canvas state',\n description: 'Writes one persisted state value on the active workspace canvas',\n parameters: [\n { name: 'key', description: 'State key', required: true },\n { name: 'value', description: 'JSON value', required: true },\n ],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async ({ params }) => {\n const active = workspaceCanvas();\n if (!active?.setState) return 'No workspace canvas is active';\n active.setState(String(params?.key ?? ''), params?.value);\n return 'ready';\n },\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.show_as_view',\n name: 'Show canvas as view',\n description: 'Pins the active workspace canvas preview into a sidebar or the bottom panel',\n parameters: [\n { name: 'slot', description: 'sidebar-main, sidebar-auxiliary, or panel-bottom', required: true },\n ],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async ({ params }) => {\n const active = workspaceCanvas();\n const path = active?.getFilePath?.();\n if (!active || !path) return 'No workspace canvas is active';\n return showCanvasView(String(params?.slot ?? ''), path, active.getContent?.() ?? '');\n },\n },\n });\n\n registerAll({\n command: {\n id: 'canvas.hide_view',\n name: 'Hide canvas view',\n description: 'Removes a pinned canvas preview from a sidebar or the bottom panel',\n parameters: [\n { name: 'slot', description: 'sidebar-main, sidebar-auxiliary, or panel-bottom', required: true },\n { name: 'path', description: 'Workspace path of the canvas file', required: false },\n ],\n },\n handler: {\n canExecute: () => !!workspaceCanvas(),\n execute: async ({ params }) => {\n const path = (params?.path as string | undefined) ?? workspaceCanvas()?.getFilePath?.() ?? '';\n if (!path) return 'No canvas path';\n return hideCanvasView(String(params?.slot ?? ''), path);\n },\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface CanvasFileBytes {
|
|
2
|
+
text?: string;
|
|
3
|
+
bytes?: Uint8Array;
|
|
4
|
+
}
|
|
5
|
+
export type CanvasFileReader = (path: string) => Promise<CanvasFileBytes | null>;
|
|
6
|
+
export interface CanvasBridges {
|
|
7
|
+
lit: string;
|
|
8
|
+
webawesome: string;
|
|
9
|
+
core: string;
|
|
10
|
+
/** Package export subpath (`./parts`) to a module URL. */
|
|
11
|
+
coreSubpaths: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export interface CompileCanvasInput {
|
|
14
|
+
entryPath: string;
|
|
15
|
+
entrySource: string;
|
|
16
|
+
read: CanvasFileReader;
|
|
17
|
+
bridges: CanvasBridges;
|
|
18
|
+
}
|
|
19
|
+
export type CompileCanvasResult = {
|
|
20
|
+
ok: true;
|
|
21
|
+
code: string;
|
|
22
|
+
} | {
|
|
23
|
+
ok: false;
|
|
24
|
+
error: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function resolveWorkspacePath(fromFile: string, spec: string): string;
|
|
27
|
+
export declare function isRelativeSpecifier(spec: string): boolean;
|
|
28
|
+
export declare function bridgeRuntime(spec: string, bridges: CanvasBridges): string | null;
|
|
29
|
+
export declare function rewriteBridgeSpecifier(spec: string, bridges: CanvasBridges): string;
|
|
30
|
+
export declare function compileCanvas(input: CompileCanvasInput): Promise<CompileCanvasResult>;
|
|
31
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAiC5F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAOjF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAOnF;AAuID,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgK3F"}
|