@eclipse-lyra/core 0.7.6 → 0.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.js +28 -29
- package/dist/api/services.d.ts +0 -4
- package/dist/api/services.d.ts.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/components/fastviews.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/{app-switcher.d.ts → layout-switcher.d.ts} +5 -4
- package/dist/components/layout-switcher.d.ts.map +1 -0
- package/dist/{standard-layout-Efok-voU.js → config-BiRvaEoO.js} +243 -454
- package/dist/config-BiRvaEoO.js.map +1 -0
- package/dist/contributions/default-layout-contributions.d.ts +1 -0
- package/dist/contributions/default-layout-contributions.d.ts.map +1 -0
- package/dist/contributions/index.d.ts.map +1 -1
- package/dist/core/apploader.d.ts +40 -30
- package/dist/core/apploader.d.ts.map +1 -1
- package/dist/core/constants.d.ts +1 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/contributionregistry.d.ts +9 -0
- package/dist/core/contributionregistry.d.ts.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/icon-DN6fp0dg.js.map +1 -1
- package/dist/index.js +28 -29
- package/dist/parts/contextmenu.d.ts +1 -1
- package/dist/parts/index.js +1 -1
- package/dist/parts/resizable-grid.d.ts +1 -1
- package/dist/{resizable-grid-BP9wOk_x.js → resizable-grid-oWYRVx30.js} +315 -94
- package/dist/resizable-grid-oWYRVx30.js.map +1 -0
- package/dist/vite-plugin-resolve-deps.d.ts +18 -0
- package/dist/vite-plugin-resolve-deps.d.ts.map +1 -0
- package/dist/vite-plugin-resolve-deps.js +76 -0
- package/dist/vite-plugin-resolve-deps.js.map +1 -0
- package/dist/widgets/icon.d.ts +1 -1
- package/package.json +8 -1
- package/src/api/services.ts +0 -4
- package/src/api/types.ts +1 -0
- package/src/commands/version-info.ts +24 -10
- package/src/components/index.ts +1 -1
- package/src/components/layout-switcher.ts +83 -0
- package/src/contributions/default-layout-contributions.ts +10 -0
- package/src/contributions/default-ui-contributions.ts +1 -1
- package/src/contributions/index.ts +1 -0
- package/src/contributions/marketplace-catalog-contributions.ts +1 -1
- package/src/core/apploader.ts +182 -99
- package/src/core/constants.ts +1 -0
- package/src/core/contributionregistry.ts +7 -0
- package/src/core/index.ts +0 -1
- package/src/vite-env.d.ts +9 -0
- package/src/vite-plugin-resolve-deps.ts +112 -0
- package/dist/components/app-selector.d.ts +0 -17
- package/dist/components/app-selector.d.ts.map +0 -1
- package/dist/components/app-switcher.d.ts.map +0 -1
- package/dist/core/app-host-config.d.ts +0 -7
- package/dist/core/app-host-config.d.ts.map +0 -1
- package/dist/core/packageinfoservice.d.ts +0 -16
- package/dist/core/packageinfoservice.d.ts.map +0 -1
- package/dist/resizable-grid-BP9wOk_x.js.map +0 -1
- package/dist/standard-layout-Efok-voU.js.map +0 -1
- package/src/components/app-selector.ts +0 -233
- package/src/components/app-switcher.ts +0 -126
- package/src/core/app-host-config.ts +0 -23
- package/src/core/packageinfoservice.ts +0 -56
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
import { html, css } from "lit";
|
|
2
|
-
import { customElement, state } from "lit/decorators.js";
|
|
3
|
-
import { LyraElement } from "../parts/element";
|
|
4
|
-
import { appLoaderService, type AppDefinition } from "../core/apploader";
|
|
5
|
-
|
|
6
|
-
@customElement('lyra-app-selector')
|
|
7
|
-
export class LyraAppSelector extends LyraElement {
|
|
8
|
-
@state()
|
|
9
|
-
private apps: AppDefinition[] = [];
|
|
10
|
-
|
|
11
|
-
@state()
|
|
12
|
-
private loading = true;
|
|
13
|
-
|
|
14
|
-
@state()
|
|
15
|
-
private error: string | null = null;
|
|
16
|
-
|
|
17
|
-
protected async doBeforeUI() {
|
|
18
|
-
await this.loadApps();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
private async loadApps() {
|
|
22
|
-
try {
|
|
23
|
-
this.loading = true;
|
|
24
|
-
this.apps = appLoaderService.getRegisteredApps();
|
|
25
|
-
this.loading = false;
|
|
26
|
-
} catch (err) {
|
|
27
|
-
this.error = err instanceof Error ? err.message : 'Failed to load apps';
|
|
28
|
-
this.loading = false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
private async selectApp(app: AppDefinition) {
|
|
33
|
-
try {
|
|
34
|
-
await appLoaderService.setPreferredAppId(app.id);
|
|
35
|
-
await appLoaderService.loadApp(app.id, document.body);
|
|
36
|
-
} catch (err) {
|
|
37
|
-
this.error = err instanceof Error ? err.message : 'Failed to load app';
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
protected render() {
|
|
42
|
-
if (this.loading) {
|
|
43
|
-
return html`
|
|
44
|
-
<div class="selector-container">
|
|
45
|
-
<wa-spinner></wa-spinner>
|
|
46
|
-
<p>Loading available apps...</p>
|
|
47
|
-
</div>
|
|
48
|
-
`;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (this.error) {
|
|
52
|
-
return html`
|
|
53
|
-
<div class="selector-container">
|
|
54
|
-
<wa-icon name="triangle-exclamation" class="error-icon"></wa-icon>
|
|
55
|
-
<p class="error-message">${this.error}</p>
|
|
56
|
-
<wa-button @click=${() => this.loadApps()}>Retry</wa-button>
|
|
57
|
-
</div>
|
|
58
|
-
`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (this.apps.length === 0) {
|
|
62
|
-
return html`
|
|
63
|
-
<div class="selector-container">
|
|
64
|
-
<wa-icon name="folder-open" class="empty-icon"></wa-icon>
|
|
65
|
-
<h2>No Apps Available</h2>
|
|
66
|
-
<p>No applications are currently registered.</p>
|
|
67
|
-
</div>
|
|
68
|
-
`;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return html`
|
|
72
|
-
<div class="selector-container">
|
|
73
|
-
<div class="header">
|
|
74
|
-
<h1>Select an Application</h1>
|
|
75
|
-
<p>Choose an application to load</p>
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
<div class="app-list">
|
|
79
|
-
${this.apps.map(app => html`
|
|
80
|
-
<div
|
|
81
|
-
class="app-card"
|
|
82
|
-
@click=${() => this.selectApp(app)}
|
|
83
|
-
@keydown=${(e: KeyboardEvent) => {
|
|
84
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
85
|
-
e.preventDefault();
|
|
86
|
-
this.selectApp(app);
|
|
87
|
-
}
|
|
88
|
-
}}
|
|
89
|
-
tabindex="0"
|
|
90
|
-
role="button">
|
|
91
|
-
<div class="app-header">
|
|
92
|
-
<h3 class="app-name">${app.name}</h3>
|
|
93
|
-
${app.version ? html`<span class="app-version">v${app.version}</span>` : ''}
|
|
94
|
-
</div>
|
|
95
|
-
${app.description ? html`<p class="app-description">${app.description}</p>` : ''}
|
|
96
|
-
<div class="app-id">ID: ${app.id}</div>
|
|
97
|
-
</div>
|
|
98
|
-
`)}
|
|
99
|
-
</div>
|
|
100
|
-
</div>
|
|
101
|
-
`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
static styles = css`
|
|
105
|
-
:host {
|
|
106
|
-
display: flex;
|
|
107
|
-
flex-direction: column;
|
|
108
|
-
width: 100%;
|
|
109
|
-
height: 100vh;
|
|
110
|
-
align-items: center;
|
|
111
|
-
justify-content: center;
|
|
112
|
-
background: var(--wa-color-neutral-background-base);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.selector-container {
|
|
116
|
-
display: flex;
|
|
117
|
-
flex-direction: column;
|
|
118
|
-
align-items: center;
|
|
119
|
-
justify-content: center;
|
|
120
|
-
max-width: 800px;
|
|
121
|
-
width: 100%;
|
|
122
|
-
padding: 2rem;
|
|
123
|
-
box-sizing: border-box;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.header {
|
|
127
|
-
text-align: center;
|
|
128
|
-
margin-bottom: 2rem;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
.header h1 {
|
|
132
|
-
margin: 0 0 0.5rem 0;
|
|
133
|
-
font-size: 2rem;
|
|
134
|
-
font-weight: 600;
|
|
135
|
-
color: var(--wa-color-neutral-foreground-loud);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
.header p {
|
|
139
|
-
margin: 0;
|
|
140
|
-
color: var(--wa-color-neutral-foreground-quiet);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.app-list {
|
|
144
|
-
display: grid;
|
|
145
|
-
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
146
|
-
gap: 1rem;
|
|
147
|
-
width: 100%;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
.app-card {
|
|
151
|
-
display: flex;
|
|
152
|
-
flex-direction: column;
|
|
153
|
-
padding: 1.5rem;
|
|
154
|
-
border: 1px solid var(--wa-color-neutral-border-loud);
|
|
155
|
-
border-radius: var(--wa-border-radius-medium);
|
|
156
|
-
background: var(--wa-color-neutral-background-base);
|
|
157
|
-
cursor: pointer;
|
|
158
|
-
transition: all 0.2s ease;
|
|
159
|
-
box-sizing: border-box;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.app-card:hover {
|
|
163
|
-
border-color: var(--wa-color-brand-border-loud);
|
|
164
|
-
background: var(--wa-color-brand-fill-quiet);
|
|
165
|
-
transform: translateY(-2px);
|
|
166
|
-
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
.app-card:focus {
|
|
170
|
-
outline: 2px solid var(--wa-color-brand-border-loud);
|
|
171
|
-
outline-offset: 2px;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.app-header {
|
|
175
|
-
display: flex;
|
|
176
|
-
justify-content: space-between;
|
|
177
|
-
align-items: flex-start;
|
|
178
|
-
margin-bottom: 0.75rem;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.app-name {
|
|
182
|
-
margin: 0;
|
|
183
|
-
font-size: 1.25rem;
|
|
184
|
-
font-weight: 600;
|
|
185
|
-
color: var(--wa-color-neutral-foreground-loud);
|
|
186
|
-
flex: 1;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
.app-version {
|
|
190
|
-
font-size: 0.875rem;
|
|
191
|
-
color: var(--wa-color-neutral-foreground-quiet);
|
|
192
|
-
padding: 0.25rem 0.5rem;
|
|
193
|
-
background: var(--wa-color-neutral-fill-quiet);
|
|
194
|
-
border-radius: var(--wa-border-radius-small);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.app-description {
|
|
198
|
-
margin: 0 0 0.75rem 0;
|
|
199
|
-
color: var(--wa-color-neutral-foreground-base);
|
|
200
|
-
line-height: 1.5;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
.app-id {
|
|
204
|
-
font-size: 0.75rem;
|
|
205
|
-
color: var(--wa-color-neutral-foreground-quiet);
|
|
206
|
-
font-family: monospace;
|
|
207
|
-
margin-top: auto;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
.empty-icon,
|
|
211
|
-
.error-icon {
|
|
212
|
-
font-size: 4rem;
|
|
213
|
-
color: var(--wa-color-neutral-foreground-quiet);
|
|
214
|
-
margin-bottom: 1rem;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
.error-message {
|
|
218
|
-
color: var(--wa-color-danger-foreground-loud);
|
|
219
|
-
margin-bottom: 1rem;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
wa-spinner {
|
|
223
|
-
margin-bottom: 1rem;
|
|
224
|
-
}
|
|
225
|
-
`;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
declare global {
|
|
229
|
-
interface HTMLElementTagNameMap {
|
|
230
|
-
'lyra-app-selector': LyraAppSelector;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { html, css } from "lit";
|
|
2
|
-
import { customElement, state } from "lit/decorators.js";
|
|
3
|
-
import { LyraElement } from "../parts/element";
|
|
4
|
-
import { appLoaderService, type AppDefinition } from "../core/apploader";
|
|
5
|
-
import { contributionRegistry } from "../core/contributionregistry";
|
|
6
|
-
import { CLOSE_BUTTON, DIALOG_CONTRIBUTION_TARGET, dialogService } from "../core/dialogservice";
|
|
7
|
-
|
|
8
|
-
const APP_SWITCHER_DIALOG_ID = 'app-switcher';
|
|
9
|
-
|
|
10
|
-
contributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {
|
|
11
|
-
id: APP_SWITCHER_DIALOG_ID,
|
|
12
|
-
label: "Switch Application",
|
|
13
|
-
buttons: [CLOSE_BUTTON],
|
|
14
|
-
component: (state?: any) => {
|
|
15
|
-
const apps: AppDefinition[] = state?.apps || [];
|
|
16
|
-
const currentAppId: string | undefined = state?.currentAppId;
|
|
17
|
-
const selectApp = state?.selectApp as (app: AppDefinition) => void;
|
|
18
|
-
|
|
19
|
-
return html`
|
|
20
|
-
<wa-scroller orientation="vertical" style="min-width: 300px; max-height: 400px; padding: var(--wa-space-m);">
|
|
21
|
-
<div style="display: flex; flex-direction: column; gap: var(--wa-space-s);">
|
|
22
|
-
${apps.map(app => html`
|
|
23
|
-
<wa-card
|
|
24
|
-
style="cursor: pointer;"
|
|
25
|
-
variant=${app.id === currentAppId ? 'brand' : 'neutral'}
|
|
26
|
-
@click=${() => selectApp(app)}>
|
|
27
|
-
<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--wa-space-xs);">
|
|
28
|
-
<span style="font-weight: 600;">${app.name}</span>
|
|
29
|
-
${app.version ? html`<wa-badge variant="neutral">v${app.version}</wa-badge>` : ''}
|
|
30
|
-
</div>
|
|
31
|
-
${app.description ? html`<p style="margin: 0; font-size: 0.875rem; line-height: 1.4;">${app.description}</p>` : ''}
|
|
32
|
-
<div style="font-size: 0.75rem; color: var(--wa-color-neutral-foreground-quiet); font-family: monospace; margin-top: var(--wa-space-xs);">ID: ${app.id}</div>
|
|
33
|
-
</wa-card>
|
|
34
|
-
`)}
|
|
35
|
-
</div>
|
|
36
|
-
</wa-scroller>
|
|
37
|
-
`;
|
|
38
|
-
},
|
|
39
|
-
onButton: async () => true,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const showAppSwitcherDialog = async (): Promise<void> => {
|
|
43
|
-
const apps = appLoaderService.getRegisteredApps();
|
|
44
|
-
const currentApp = appLoaderService.getCurrentApp();
|
|
45
|
-
|
|
46
|
-
if (apps.length === 0) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const state = {
|
|
51
|
-
apps,
|
|
52
|
-
currentAppId: currentApp?.id,
|
|
53
|
-
selectApp: async (app: AppDefinition) => {
|
|
54
|
-
if (app.id === currentApp?.id) {
|
|
55
|
-
state.close?.();
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
await appLoaderService.setPreferredAppId(app.id);
|
|
61
|
-
await appLoaderService.loadApp(app.id, document.body);
|
|
62
|
-
} catch (error) {
|
|
63
|
-
console.error('Failed to switch app:', error);
|
|
64
|
-
} finally {
|
|
65
|
-
state.close?.();
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
close: undefined as (() => void) | undefined,
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
await dialogService.open(APP_SWITCHER_DIALOG_ID, state);
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
@customElement('lyra-app-switcher')
|
|
75
|
-
export class LyraAppSwitcher extends LyraElement {
|
|
76
|
-
@state()
|
|
77
|
-
private currentApp: AppDefinition | undefined;
|
|
78
|
-
|
|
79
|
-
protected doBeforeUI() {
|
|
80
|
-
this.currentApp = appLoaderService.getCurrentApp();
|
|
81
|
-
|
|
82
|
-
const updateCurrentApp = () => {
|
|
83
|
-
this.currentApp = appLoaderService.getCurrentApp();
|
|
84
|
-
this.requestUpdate();
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
window.addEventListener('app-loaded', updateCurrentApp);
|
|
88
|
-
|
|
89
|
-
return () => {
|
|
90
|
-
window.removeEventListener('app-loaded', updateCurrentApp);
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
protected render() {
|
|
95
|
-
const apps = appLoaderService.getRegisteredApps();
|
|
96
|
-
const appName = this.currentApp?.name || 'No App';
|
|
97
|
-
|
|
98
|
-
if (apps.length <= 1) {
|
|
99
|
-
return html``;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return html`
|
|
103
|
-
<wa-button
|
|
104
|
-
appearance="plain"
|
|
105
|
-
size="small"
|
|
106
|
-
title="Current app: ${appName}. Click to switch applications."
|
|
107
|
-
@click=${() => showAppSwitcherDialog()}>
|
|
108
|
-
<wa-icon name="grip" style="margin-right: 0.5rem;"></wa-icon>
|
|
109
|
-
${appName}
|
|
110
|
-
</wa-button>
|
|
111
|
-
`;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
static styles = css`
|
|
115
|
-
:host {
|
|
116
|
-
display: inline-block;
|
|
117
|
-
}
|
|
118
|
-
`;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
declare global {
|
|
122
|
-
interface HTMLElementTagNameMap {
|
|
123
|
-
'lyra-app-switcher': LyraAppSwitcher;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { PackageInfo } from './packageinfoservice';
|
|
2
|
-
import { packageInfoService } from './packageinfoservice';
|
|
3
|
-
import { marketplaceRegistry } from './marketplaceregistry';
|
|
4
|
-
|
|
5
|
-
let applied = false;
|
|
6
|
-
|
|
7
|
-
export interface AppHostConfig {
|
|
8
|
-
packageInfo?: PackageInfo;
|
|
9
|
-
marketplaceCatalogUrls?: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function applyAppHostConfig(config: AppHostConfig): void {
|
|
13
|
-
if (applied) return;
|
|
14
|
-
applied = true;
|
|
15
|
-
if (config.packageInfo) {
|
|
16
|
-
packageInfoService.addPackage(config.packageInfo);
|
|
17
|
-
}
|
|
18
|
-
if (config.marketplaceCatalogUrls?.length) {
|
|
19
|
-
config.marketplaceCatalogUrls.forEach((url) => {
|
|
20
|
-
marketplaceRegistry.addCatalogUrl(url).catch(() => {});
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { html, TemplateResult } from "lit";
|
|
2
|
-
import { rootContext } from "./di";
|
|
3
|
-
|
|
4
|
-
export interface PackageInfo {
|
|
5
|
-
name: string;
|
|
6
|
-
version: string;
|
|
7
|
-
dependencies?: Record<string, string>;
|
|
8
|
-
devDependencies?: Record<string, string>;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
class PackageInfoService {
|
|
12
|
-
private packages: PackageInfo[] = [];
|
|
13
|
-
|
|
14
|
-
addPackage(packageInfo: PackageInfo): void {
|
|
15
|
-
this.packages.push(packageInfo);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
hasPackages(): boolean {
|
|
19
|
-
return this.packages.length > 0 && this.packages.some(pkg =>
|
|
20
|
-
pkg.dependencies && Object.keys(pkg.dependencies).length > 0
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
renderTree(): TemplateResult {
|
|
25
|
-
if (this.packages.length === 0) {
|
|
26
|
-
return html``;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return html`
|
|
30
|
-
<wa-tree style="--indent-guide-width: 1px;">
|
|
31
|
-
${this.packages.map(pkg => {
|
|
32
|
-
const deps = pkg.dependencies || {};
|
|
33
|
-
const depEntries = Object.entries(deps);
|
|
34
|
-
|
|
35
|
-
if (depEntries.length === 0) {
|
|
36
|
-
return html``;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return html`
|
|
40
|
-
<wa-tree-item expanded>
|
|
41
|
-
<span>${pkg.name}</span>
|
|
42
|
-
${depEntries.map(([name, version]) => html`
|
|
43
|
-
<wa-tree-item>
|
|
44
|
-
<span>${name} <small>${version}</small></span>
|
|
45
|
-
</wa-tree-item>
|
|
46
|
-
`)}
|
|
47
|
-
</wa-tree-item>
|
|
48
|
-
`;
|
|
49
|
-
})}
|
|
50
|
-
</wa-tree>
|
|
51
|
-
`;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export const packageInfoService = new PackageInfoService();
|
|
56
|
-
rootContext.put("packageInfoService", packageInfoService);
|