@elixir-cloud/service-registry 2.0.0-alpha.28

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 (53) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +12 -0
  3. package/dist/chunks/chunk.2GTT6OBC.js +558 -0
  4. package/dist/chunks/chunk.422CUO5Q.js +329 -0
  5. package/dist/chunks/chunk.5EYXDARO.js +23 -0
  6. package/dist/chunks/chunk.EDOYU2FL.js +1 -0
  7. package/dist/chunks/chunk.FSZTY25R.js +10 -0
  8. package/dist/chunks/chunk.G7EXF7Y5.js +24 -0
  9. package/dist/chunks/chunk.KXF7UXMG.js +477 -0
  10. package/dist/chunks/chunk.L4ERSGP3.js +59 -0
  11. package/dist/chunks/chunk.P4Y7MKRA.js +1 -0
  12. package/dist/chunks/chunk.SWMR6FP7.js +97 -0
  13. package/dist/chunks/chunk.TWJOFBJX.js +517 -0
  14. package/dist/chunks/chunk.UMP3GNBP.js +10 -0
  15. package/dist/chunks/chunk.WHWUXFA2.js +12 -0
  16. package/dist/components/index.d.ts +2 -0
  17. package/dist/components/index.js +10 -0
  18. package/dist/components/service/index.d.ts +8 -0
  19. package/dist/components/service/index.js +6 -0
  20. package/dist/components/service/service.d.ts +39 -0
  21. package/dist/components/service/service.js +5 -0
  22. package/dist/components/service/tw-styles.d.ts +1 -0
  23. package/dist/components/service/tw-styles.js +2 -0
  24. package/dist/components/services/index.d.ts +8 -0
  25. package/dist/components/services/index.js +6 -0
  26. package/dist/components/services/services.d.ts +46 -0
  27. package/dist/components/services/services.js +5 -0
  28. package/dist/components/services/tw-styles.d.ts +1 -0
  29. package/dist/components/services/tw-styles.js +2 -0
  30. package/dist/custom-elements.json +538 -0
  31. package/dist/events/ecc-service-changed.d.ts +6 -0
  32. package/dist/events/ecc-service-selected.d.ts +6 -0
  33. package/dist/events/ecc-services-changed.d.ts +6 -0
  34. package/dist/events/ecc-services-selected.d.ts +6 -0
  35. package/dist/events/index.d.ts +4 -0
  36. package/dist/global.d.ts +4 -0
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.js +10 -0
  39. package/dist/providers/index.d.ts +3 -0
  40. package/dist/providers/index.js +3 -0
  41. package/dist/providers/rest-sr-provider.d.ts +30 -0
  42. package/dist/providers/rest-sr-provider.js +2 -0
  43. package/dist/providers/sr-provider.d.ts +58 -0
  44. package/dist/providers/sr-provider.js +1 -0
  45. package/dist/react/index.d.ts +2 -0
  46. package/dist/react/index.js +9 -0
  47. package/dist/react/service/index.d.ts +18 -0
  48. package/dist/react/service/index.js +6 -0
  49. package/dist/react/services/index.d.ts +23 -0
  50. package/dist/react/services/index.js +6 -0
  51. package/dist/vscode.html-custom-data.json +28 -0
  52. package/dist/web-types.json +105 -0
  53. package/package.json +76 -0
@@ -0,0 +1,329 @@
1
+ import { ComponentStyles } from './chunk.2GTT6OBC.js';
2
+ import { GlobalStyles } from './chunk.SWMR6FP7.js';
3
+ import { RestServiceRegistryProvider } from './chunk.L4ERSGP3.js';
4
+ import { __decorateClass } from './chunk.WHWUXFA2.js';
5
+ import { css, LitElement, html } from 'lit';
6
+ import { property, state } from 'lit/decorators.js';
7
+ import '@elixir-cloud/design/components/table/index.js';
8
+ import '@elixir-cloud/design/components/button/index.js';
9
+ import '@elixir-cloud/design/components/input/index.js';
10
+ import '@elixir-cloud/design/components/select/index.js';
11
+ import '@elixir-cloud/design/components/label/index.js';
12
+ import '@elixir-cloud/design/components/pagination/index.js';
13
+ import '@elixir-cloud/design/components/badge/index.js';
14
+ import '@elixir-cloud/design/components/skeleton/index.js';
15
+
16
+ var _ECCClientGa4ghServiceRegistryServices = class _ECCClientGa4ghServiceRegistryServices extends LitElement {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.baseUrl = "";
20
+ this.filter = true;
21
+ this.search = true;
22
+ this.searchQuery = "";
23
+ this.services = [];
24
+ this.loading = false;
25
+ this.error = null;
26
+ this.serviceTypes = [];
27
+ this.searchTimeout = null;
28
+ this._provider = null;
29
+ }
30
+ async firstUpdated() {
31
+ if (!this.baseUrl && !this.provider) {
32
+ this.error = "Please provide either a base URL for the Service Registry API or a custom provider.";
33
+ return;
34
+ }
35
+ if (this.provider) {
36
+ this._provider = this.provider;
37
+ } else if (this.baseUrl) {
38
+ this._provider = new RestServiceRegistryProvider(this.baseUrl);
39
+ } else {
40
+ this._provider = null;
41
+ }
42
+ if (this._provider) {
43
+ await this.loadData();
44
+ await this.loadServiceTypes();
45
+ }
46
+ }
47
+ updated(changedProperties) {
48
+ if (changedProperties.has("baseUrl") && this.baseUrl) {
49
+ this._provider = new RestServiceRegistryProvider(this.baseUrl);
50
+ this.loadData();
51
+ this.loadServiceTypes();
52
+ }
53
+ }
54
+ async loadServiceTypes() {
55
+ if (!this._provider) return;
56
+ try {
57
+ this.serviceTypes = await this._provider.getServiceTypes();
58
+ } catch (error) {
59
+ console.error("Failed to load service types:", error);
60
+ }
61
+ }
62
+ async loadData() {
63
+ if (!this._provider) return;
64
+ this.loading = true;
65
+ this.error = null;
66
+ try {
67
+ const services = await this._provider.getServices();
68
+ this.services = services;
69
+ this.dispatchEvent(
70
+ new CustomEvent("ecc-services-changed", {
71
+ detail: { services },
72
+ bubbles: true,
73
+ composed: true
74
+ })
75
+ );
76
+ } catch (err) {
77
+ this.error = err instanceof Error ? err.message : "Failed to load services";
78
+ console.error({
79
+ error: this.error,
80
+ breakPoint: "ECCClientGa4ghServiceRegistryServices.loadData"
81
+ });
82
+ } finally {
83
+ this.loading = false;
84
+ }
85
+ }
86
+ handleSearch(e) {
87
+ this.searchQuery = e.detail.value;
88
+ if (this.searchTimeout) {
89
+ clearTimeout(this.searchTimeout);
90
+ }
91
+ this.searchTimeout = setTimeout(() => {
92
+ this.filterServices();
93
+ }, 500);
94
+ }
95
+ filterServices() {
96
+ if (!this.searchQuery) {
97
+ this.loadData();
98
+ return;
99
+ }
100
+ const query = this.searchQuery.toLowerCase();
101
+ if (!this._provider) return;
102
+ this.loading = true;
103
+ this.error = null;
104
+ try {
105
+ this._provider.getServices().then((services) => {
106
+ this.services = services.filter(
107
+ (service) => {
108
+ var _a;
109
+ return service.id.toLowerCase().includes(query) || service.name.toLowerCase().includes(query) || ((_a = service.description) == null ? void 0 : _a.toLowerCase().includes(query)) || service.organization.name.toLowerCase().includes(query) || service.type.group.toLowerCase().includes(query) || service.type.artifact.toLowerCase().includes(query);
110
+ }
111
+ );
112
+ this.loading = false;
113
+ });
114
+ } catch (err) {
115
+ this.error = err instanceof Error ? err.message : "Failed to filter services";
116
+ this.loading = false;
117
+ }
118
+ }
119
+ handleViewDetails(serviceId) {
120
+ this.dispatchEvent(
121
+ new CustomEvent("ecc-service-selected", {
122
+ detail: { serviceId },
123
+ bubbles: true,
124
+ composed: true
125
+ })
126
+ );
127
+ }
128
+ static renderSkeletonRows() {
129
+ return html`
130
+ ${Array(5).fill(0).map(
131
+ () => html`
132
+ <ecc-utils-design-table-row>
133
+ <ecc-utils-design-table-cell class="w-7/12">
134
+ <div class="flex flex-col w-full gap-2">
135
+ <ecc-utils-design-skeleton
136
+ class="part:h-5 part:w-40"
137
+ ></ecc-utils-design-skeleton>
138
+ <ecc-utils-design-skeleton
139
+ class="part:h-3 part:w-full"
140
+ ></ecc-utils-design-skeleton>
141
+ <ecc-utils-design-skeleton
142
+ class="part:h-3 part:w-4/5"
143
+ ></ecc-utils-design-skeleton>
144
+ </div>
145
+ </ecc-utils-design-table-cell>
146
+ <ecc-utils-design-table-cell class="w-2/12">
147
+ <ecc-utils-design-skeleton
148
+ class="part:h-6 part:w-24 part:rounded-full"
149
+ ></ecc-utils-design-skeleton>
150
+ </ecc-utils-design-table-cell>
151
+ <ecc-utils-design-table-cell class="w-2/12">
152
+ <ecc-utils-design-skeleton
153
+ class="part:h-4 part:w-28"
154
+ ></ecc-utils-design-skeleton>
155
+ </ecc-utils-design-table-cell>
156
+ <ecc-utils-design-table-cell class="w-1/12">
157
+ <ecc-utils-design-skeleton
158
+ class="part:h-8 part:w-8 part:rounded"
159
+ ></ecc-utils-design-skeleton>
160
+ </ecc-utils-design-table-cell>
161
+ </ecc-utils-design-table-row>
162
+ `
163
+ )}
164
+ `;
165
+ }
166
+ static getServiceTypeVariant(type) {
167
+ if (type.group.includes("ga4gh") || type.group.includes("elixir")) {
168
+ return "secondary";
169
+ }
170
+ return "default";
171
+ }
172
+ render() {
173
+ return html`
174
+ <div class="flex flex-col gap-4">
175
+ ${this.error ? html`<div
176
+ class="p-4 border border-destructive rounded-md text-destructive-foreground bg-destructive/10"
177
+ >
178
+ ${this.error}
179
+ </div>` : ""}
180
+ ${this.search ? html`
181
+ <div class="flex flex-col gap-1">
182
+ <ecc-utils-design-label>Search Services</ecc-utils-design-label>
183
+ <ecc-utils-design-input
184
+ class="part:w-full"
185
+ placeholder="Search by name, type, organization..."
186
+ @ecc-input-changed=${this.handleSearch}
187
+ ></ecc-utils-design-input>
188
+ </div>
189
+ ` : ""}
190
+
191
+ <ecc-utils-design-table>
192
+ <ecc-utils-design-table-header>
193
+ <ecc-utils-design-table-row>
194
+ <ecc-utils-design-table-head class="w-7/12"
195
+ >Service Info</ecc-utils-design-table-head
196
+ >
197
+ <ecc-utils-design-table-head class="w-2/12"
198
+ >Type</ecc-utils-design-table-head
199
+ >
200
+ <ecc-utils-design-table-head class="w-2/12"
201
+ >Organization</ecc-utils-design-table-head
202
+ >
203
+ <ecc-utils-design-table-head
204
+ class="w-1/12"
205
+ ></ecc-utils-design-table-head>
206
+ </ecc-utils-design-table-row>
207
+ </ecc-utils-design-table-header>
208
+ <ecc-utils-design-table-body>
209
+ ${(() => {
210
+ if (this.loading) {
211
+ return _ECCClientGa4ghServiceRegistryServices.renderSkeletonRows();
212
+ }
213
+ if (this.services.length === 0) {
214
+ return html`
215
+ <ecc-utils-design-table-row>
216
+ <ecc-utils-design-table-cell
217
+ colspan="4"
218
+ class="part:text-center part:py-8 part:text-muted-foreground"
219
+ >
220
+ No services found
221
+ </ecc-utils-design-table-cell>
222
+ </ecc-utils-design-table-row>
223
+ `;
224
+ }
225
+ return this.services.map(
226
+ (service) => html`
227
+ <ecc-utils-design-table-row>
228
+ <ecc-utils-design-table-cell class="w-7/12">
229
+ <div class="flex flex-col w-full">
230
+ <div class="flex items-center gap-2">
231
+ <ecc-utils-design-button
232
+ class="part:font-medium part:text-primary part:w-fit part:cursor-pointer part:p-0"
233
+ variant="link"
234
+ @click=${() => this.handleViewDetails(service.id)}
235
+ >
236
+ ${service.name || "-"}
237
+ </ecc-utils-design-button>
238
+ ${service.version ? html`<ecc-utils-design-badge variant="outline">
239
+ v${service.version}
240
+ </ecc-utils-design-badge>` : ""}
241
+ </div>
242
+ ${service.description ? html`<div
243
+ class="text-xs text-muted-foreground line-clamp-3 break-all whitespace-normal overflow-hidden max-w-full"
244
+ >
245
+ ${service.description}
246
+ </div>` : ""}
247
+ </div>
248
+ </ecc-utils-design-table-cell>
249
+ <ecc-utils-design-table-cell class="w-2/12">
250
+ <ecc-utils-design-badge
251
+ variant=${_ECCClientGa4ghServiceRegistryServices.getServiceTypeVariant(
252
+ service.type
253
+ )}
254
+ >
255
+ ${service.type.artifact}@${service.type.version}
256
+ </ecc-utils-design-badge>
257
+ </ecc-utils-design-table-cell>
258
+ <ecc-utils-design-table-cell class="w-2/12">
259
+ ${service.organization.url ? html`<ecc-utils-design-button
260
+ class="part:font-medium part:text-primary part:w-fit part:cursor-pointer part:p-0"
261
+ variant="link"
262
+ @click=${() => window.open(service.organization.url, "_blank")}
263
+ >
264
+ ${service.organization.name}
265
+ </ecc-utils-design-button>` : html`${service.organization.name}`}
266
+ </ecc-utils-design-table-cell>
267
+ <ecc-utils-design-table-cell class="w-1/12">
268
+ <slot name=${`actions-${service.id}`}>
269
+ <ecc-utils-design-button
270
+ size="sm"
271
+ @click=${() => this.handleViewDetails(service.id)}
272
+ >
273
+ View Details
274
+ </ecc-utils-design-button>
275
+ </slot>
276
+ </ecc-utils-design-table-cell>
277
+ </ecc-utils-design-table-row>
278
+ `
279
+ );
280
+ })()}
281
+ </ecc-utils-design-table-body>
282
+ </ecc-utils-design-table>
283
+ </div>
284
+ `;
285
+ }
286
+ };
287
+ _ECCClientGa4ghServiceRegistryServices.styles = [
288
+ ComponentStyles,
289
+ GlobalStyles,
290
+ css`
291
+ :host {
292
+ display: block;
293
+ width: 100%;
294
+ }
295
+ `
296
+ ];
297
+ __decorateClass([
298
+ property({ type: String, reflect: true })
299
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "baseUrl", 2);
300
+ __decorateClass([
301
+ property({ type: Boolean, reflect: true })
302
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "filter", 2);
303
+ __decorateClass([
304
+ property({ type: Boolean, reflect: true })
305
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "search", 2);
306
+ __decorateClass([
307
+ property({ attribute: false, reflect: true })
308
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "provider", 2);
309
+ __decorateClass([
310
+ state()
311
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "searchQuery", 2);
312
+ __decorateClass([
313
+ state()
314
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "services", 2);
315
+ __decorateClass([
316
+ state()
317
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "loading", 2);
318
+ __decorateClass([
319
+ state()
320
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "error", 2);
321
+ __decorateClass([
322
+ state()
323
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "serviceTypes", 2);
324
+ __decorateClass([
325
+ state()
326
+ ], _ECCClientGa4ghServiceRegistryServices.prototype, "searchTimeout", 2);
327
+ var ECCClientGa4ghServiceRegistryServices = _ECCClientGa4ghServiceRegistryServices;
328
+
329
+ export { ECCClientGa4ghServiceRegistryServices };
@@ -0,0 +1,23 @@
1
+ import { ECCClientGa4ghServiceRegistryService } from './chunk.KXF7UXMG.js';
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+
5
+ var tagName = "ecc-client-ga4gh-service-registry-service";
6
+ if (typeof window !== "undefined" && window.customElements && !window.customElements.get("ecc-client-ga4gh-service-registry-service")) {
7
+ window.customElements.define(
8
+ "ecc-client-ga4gh-service-registry-service",
9
+ ECCClientGa4ghServiceRegistryService
10
+ );
11
+ }
12
+ var reactWrapper = createComponent({
13
+ tagName,
14
+ elementClass: ECCClientGa4ghServiceRegistryService,
15
+ react: React,
16
+ events: {
17
+ onEccServiceChanged: "ecc-service-changed"
18
+ },
19
+ displayName: "EccClientGaGhServiceRegistryService"
20
+ });
21
+ var service_default = reactWrapper;
22
+
23
+ export { service_default };
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,10 @@
1
+ import { ECCClientGa4ghServiceRegistryServices } from './chunk.422CUO5Q.js';
2
+
3
+ // src/components/services/index.ts
4
+ var services_default = ECCClientGa4ghServiceRegistryServices;
5
+ window.customElements.define(
6
+ "ecc-client-ga4gh-service-registry-services",
7
+ ECCClientGa4ghServiceRegistryServices
8
+ );
9
+
10
+ export { services_default };
@@ -0,0 +1,24 @@
1
+ import { ECCClientGa4ghServiceRegistryServices } from './chunk.422CUO5Q.js';
2
+ import * as React from 'react';
3
+ import { createComponent } from '@lit/react';
4
+
5
+ var tagName = "ecc-client-ga4gh-service-registry-services";
6
+ if (typeof window !== "undefined" && window.customElements && !window.customElements.get("ecc-client-ga4gh-service-registry-services")) {
7
+ window.customElements.define(
8
+ "ecc-client-ga4gh-service-registry-services",
9
+ ECCClientGa4ghServiceRegistryServices
10
+ );
11
+ }
12
+ var reactWrapper = createComponent({
13
+ tagName,
14
+ elementClass: ECCClientGa4ghServiceRegistryServices,
15
+ react: React,
16
+ events: {
17
+ onEccServicesChanged: "ecc-services-changed",
18
+ onEccServiceSelected: "ecc-service-selected"
19
+ },
20
+ displayName: "EccClientGaGhServiceRegistryServices"
21
+ });
22
+ var services_default = reactWrapper;
23
+
24
+ export { services_default };