@betterportal/config-manager 0.0.1

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 (154) hide show
  1. package/README.md +3 -0
  2. package/bsb-plugin.json +23 -0
  3. package/bsb-tests.json +14 -0
  4. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +37 -0
  5. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts.map +1 -0
  6. package/lib/.bsb/clients/service-betterportal-config-manager.js +40 -0
  7. package/lib/.bsb/clients/service-betterportal-config-manager.js.map +1 -0
  8. package/lib/index.d.ts +2 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +2 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +3 -0
  13. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -0
  14. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js +235 -0
  15. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js.map +1 -0
  16. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts +4 -0
  17. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -0
  18. package/lib/plugins/service-betterportal-config-manager/adminApi.js +2319 -0
  19. package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -0
  20. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts +21 -0
  21. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts.map +1 -0
  22. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js +269 -0
  23. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js.map +1 -0
  24. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts +19 -0
  25. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts.map +1 -0
  26. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js +329 -0
  27. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js.map +1 -0
  28. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts +4 -0
  29. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts.map +1 -0
  30. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js +38 -0
  31. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js.map +1 -0
  32. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts +96 -0
  33. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts.map +1 -0
  34. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js +78 -0
  35. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js.map +1 -0
  36. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts +4 -0
  37. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts.map +1 -0
  38. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js +62 -0
  39. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js.map +1 -0
  40. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts +5 -0
  41. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts.map +1 -0
  42. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js +5 -0
  43. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js.map +1 -0
  44. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts +43 -0
  45. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts.map +1 -0
  46. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js +68 -0
  47. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js.map +1 -0
  48. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts +5 -0
  49. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts.map +1 -0
  50. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js +11 -0
  51. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js.map +1 -0
  52. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts +32 -0
  53. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts.map +1 -0
  54. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js +32 -0
  55. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js.map +1 -0
  56. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts +4 -0
  57. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts.map +1 -0
  58. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js +170 -0
  59. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js.map +1 -0
  60. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts +60 -0
  61. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts.map +1 -0
  62. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js +48 -0
  63. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js.map +1 -0
  64. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts +4 -0
  65. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts.map +1 -0
  66. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js +28 -0
  67. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js.map +1 -0
  68. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts +48 -0
  69. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts.map +1 -0
  70. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js +40 -0
  71. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js.map +1 -0
  72. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts +5 -0
  73. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts.map +1 -0
  74. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js +194 -0
  75. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js.map +1 -0
  76. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts +80 -0
  77. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts.map +1 -0
  78. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js +59 -0
  79. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js.map +1 -0
  80. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts +5 -0
  81. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts.map +1 -0
  82. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js +167 -0
  83. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js.map +1 -0
  84. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts +128 -0
  85. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts.map +1 -0
  86. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js +89 -0
  87. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js.map +1 -0
  88. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts +5 -0
  89. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts.map +1 -0
  90. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js +8 -0
  91. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js.map +1 -0
  92. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts +89 -0
  93. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts.map +1 -0
  94. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js +93 -0
  95. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js.map +1 -0
  96. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts +4 -0
  97. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts.map +1 -0
  98. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js +61 -0
  99. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js.map +1 -0
  100. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts +180 -0
  101. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts.map +1 -0
  102. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js +405 -0
  103. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js.map +1 -0
  104. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts +26 -0
  105. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts.map +1 -0
  106. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js +58 -0
  107. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js.map +1 -0
  108. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts +3 -0
  109. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts.map +1 -0
  110. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js +365 -0
  111. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js.map +1 -0
  112. package/lib/plugins/service-betterportal-config-manager/index.d.ts +143 -0
  113. package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -0
  114. package/lib/plugins/service-betterportal-config-manager/index.js +696 -0
  115. package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -0
  116. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts +3 -0
  117. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts.map +1 -0
  118. package/lib/plugins/service-betterportal-config-manager/menuEditor.js +823 -0
  119. package/lib/plugins/service-betterportal-config-manager/menuEditor.js.map +1 -0
  120. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts +10 -0
  121. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts.map +1 -0
  122. package/lib/plugins/service-betterportal-config-manager/routeContext.js +11 -0
  123. package/lib/plugins/service-betterportal-config-manager/routeContext.js.map +1 -0
  124. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts +18 -0
  125. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts.map +1 -0
  126. package/lib/plugins/service-betterportal-config-manager/setupTokens.js +245 -0
  127. package/lib/plugins/service-betterportal-config-manager/setupTokens.js.map +1 -0
  128. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +41 -0
  129. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -0
  130. package/lib/plugins/service-betterportal-config-manager/storage/core.js +396 -0
  131. package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -0
  132. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts +10 -0
  133. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts.map +1 -0
  134. package/lib/plugins/service-betterportal-config-manager/storage/file.js +30 -0
  135. package/lib/plugins/service-betterportal-config-manager/storage/file.js.map +1 -0
  136. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts +36 -0
  137. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts.map +1 -0
  138. package/lib/plugins/service-betterportal-config-manager/storage/index.js +52 -0
  139. package/lib/plugins/service-betterportal-config-manager/storage/index.js.map +1 -0
  140. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +15 -0
  141. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -0
  142. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +60 -0
  143. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -0
  144. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +44 -0
  145. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -0
  146. package/lib/plugins/service-betterportal-config-manager/syncApi.js +280 -0
  147. package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -0
  148. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts +6 -0
  149. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts.map +1 -0
  150. package/lib/plugins/service-betterportal-config-manager/webhooks.js +372 -0
  151. package/lib/plugins/service-betterportal-config-manager/webhooks.js.map +1 -0
  152. package/lib/schemas/service-betterportal-config-manager.json +157 -0
  153. package/lib/schemas/service-betterportal-config-manager.plugin.json +135 -0
  154. package/package.json +69 -0
@@ -0,0 +1,167 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "jsx-htmx/jsx-runtime";
2
+ function configureAttrs(service, appId, serviceTitle, adminApiBase) {
3
+ const qs = new URLSearchParams({
4
+ serviceInstanceId: service.id,
5
+ hostname: service.hostname,
6
+ tenantId: service.tenantId ?? "",
7
+ title: serviceTitle,
8
+ adminApiBase,
9
+ ...(appId ? { appId } : {})
10
+ }).toString();
11
+ if (service.supportsCustomUi && service.customUiPath && appId) {
12
+ const target = `${service.hostname.replace(/\/+$/, "")}${service.customUiPath}?tenantId=${encodeURIComponent(service.tenantId ?? "")}&appId=${encodeURIComponent(appId)}&adminApiBase=${encodeURIComponent(adminApiBase)}`;
13
+ const push = `${service.pushBase}?tenantId=${encodeURIComponent(service.tenantId ?? "")}&appId=${encodeURIComponent(appId)}`;
14
+ return {
15
+ "hx-get": target,
16
+ "hx-target": "#bp-main",
17
+ "hx-swap": "innerHTML",
18
+ "hx-push-url": push
19
+ };
20
+ }
21
+ return {
22
+ "hx-get": `/.well-known/bp/admin/configure?${qs}`,
23
+ "hx-target": "#bp-config-edit-form",
24
+ "hx-swap": "innerHTML",
25
+ "hx-on::before-request": "document.getElementById('bp-config-edit-form').innerHTML='<div class=\"text-center py-4 text-secondary\">Loading...</div>'",
26
+ "onclick": "document.getElementById('bp-config-edit-form').innerHTML='<div class=\"text-center py-4 text-secondary\">Loading...</div>'",
27
+ "data-bs-toggle": "offcanvas",
28
+ "data-bs-target": "#bp-config-edit-panel"
29
+ };
30
+ }
31
+ function configureButton(service, appId, serviceTitle, adminApiBase, label = "Configure", className = "btn btn-sm btn-outline-primary", disabledReason) {
32
+ const reason = disabledReason ?? (!service.hasConfigurableOptions ? "No configurable options" : undefined);
33
+ if (reason)
34
+ return (_jsx("span", { title: reason, children: _jsx("button", { class: className, type: "button", disabled: true, "aria-disabled": "true", children: label }) }));
35
+ return (_jsx("button", { class: className, type: "button", ...configureAttrs(service, appId, serviceTitle, adminApiBase), children: label }));
36
+ }
37
+ function renderServiceCard(service, data, tenantById) {
38
+ const title = service.title ?? service.serviceId ?? service.hostname;
39
+ const adminApiBase = `${(data.serviceBaseUrl ?? "").replace(/\/+$/, "")}${data.adminApiBase}`;
40
+ const apps = service.tenantId
41
+ ? (data.tenantApps[service.tenantId] ?? [])
42
+ : [];
43
+ const tenant = service.tenantId ? tenantById.get(service.tenantId) : undefined;
44
+ return (_jsx("div", { class: "col-12 col-lg-6", children: _jsx("div", { class: "card border-0 shadow-sm h-100", children: _jsxs("div", { class: "card-body", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start mb-2", children: [_jsxs("div", { children: [_jsx("h5", { class: "mb-0", children: title }), _jsx("div", { class: "small text-secondary font-monospace", children: service.id })] }), _jsx("span", { class: `badge ${service.scope === "platform" ? "text-bg-info" :
45
+ service.scope === "theme" ? "text-bg-warning" :
46
+ service.scope === "shared" ? "text-bg-success" :
47
+ "text-bg-primary"}`, children: service.scope })] }), service.tenantId ? _jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "Tenant:" }), " ", tenant?.title ?? service.tenantId] }) : "", service.capabilities.includes("theme") && apps.length > 0 ? _jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "Apps:" }), " ", apps.map((app) => app.title).join(", ")] }) : "", _jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "URL:" }), " ", _jsx("span", { class: "font-monospace", children: service.hostname })] }), service.serviceId ? _jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "Plugin:" }), " ", _jsx("span", { class: "font-monospace", children: service.serviceId })] }) : "", service.capabilities.length > 0 ? (_jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "Capabilities:" }), " ", service.capabilities.map((capability) => _jsx("span", { class: "badge text-bg-light border me-1", children: capability }))] })) : "", _jsxs("div", { class: "small mb-1", children: [_jsx("strong", { children: "Status:" }), " ", _jsx("span", { class: `badge ${service.enabled ? "text-bg-success" : "text-bg-secondary"}`, children: service.enabled ? "active" : "disabled" })] }), _jsxs("div", { class: "small mb-2", children: [_jsx("strong", { children: "Created:" }), " ", service.createdAt, service.lastSeenAt ? ` - Last seen: ${service.lastSeenAt}` : ""] }), _jsxs("div", { class: "d-flex gap-2 flex-wrap align-items-center", children: [apps.length > 1 ? (_jsx("div", { class: "btn-group btn-group-sm", children: service.hasConfigurableOptions ? (_jsxs(_Fragment, { children: [_jsx("button", { class: "btn btn-outline-primary dropdown-toggle", type: "button", "data-bs-toggle": "dropdown", children: "Configure" }), _jsx("ul", { class: "dropdown-menu", children: apps.map((app) => (_jsx("li", { children: _jsx("button", { type: "button", class: "dropdown-item", ...configureAttrs(service, app.id, `${title} - ${app.title}`, adminApiBase), children: app.title }) }))) })] })) : configureButton(service, undefined, title, adminApiBase, "Configure", "btn btn-outline-primary") })) : (configureButton(service, apps[0]?.id, title, adminApiBase)), service.scope === "shared" && service.tenantId ? (_jsx("button", { class: "btn btn-sm btn-outline-secondary", "hx-delete": `${data.adminApiBase}/shared-services/${encodeURIComponent(service.serviceId ?? service.id)}/activations?tenantId=${encodeURIComponent(service.tenantId)}`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", "hx-confirm": "Deactivate this shared service?", children: "Deactivate" })) : service.tenantId ? (_jsxs(_Fragment, { children: [service.serviceId && service.serviceId !== "service.betterportal.config-manager" ? (_jsx("button", { class: "btn btn-sm btn-outline-success", "hx-post": `${data.adminApiBase}/tenants/${encodeURIComponent(service.tenantId)}/services/${encodeURIComponent(service.id)}/migrate-to-shared`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", "hx-confirm": "Convert this tenant service to a shared service and rewrite app references?", children: "Convert to shared" })) : "", _jsx("button", { class: "btn btn-sm btn-outline-danger", "hx-delete": `/.well-known/bp/admin/tenants/${service.tenantId}/services/${service.id}`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", "hx-confirm": "Remove this service registration?", children: "Remove" })] })) : ""] })] }) }) }));
48
+ }
49
+ function normalizeUrl(value) {
50
+ return value.replace(/\/+$/, "");
51
+ }
52
+ function renderCatalogCard(item, data, selectedTenantId) {
53
+ const title = item.title ?? item.id;
54
+ const selectedActivation = data.sharedServiceActivations.find((activation) => activation.tenantId === selectedTenantId
55
+ && activation.sharedServiceId === item.id
56
+ && activation.enabled
57
+ && !activation.appId);
58
+ return (_jsx("div", { class: "col-12 col-lg-6 bp-catalog-card", "data-bp-catalog-id": item.id, "data-bp-catalog-url": normalizeUrl(item.baseUrl), children: _jsx("div", { class: "card border-0 shadow-sm h-100", children: _jsxs("div", { class: "card-body", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start gap-3", children: [_jsxs("div", { children: [_jsx("h5", { class: "mb-1", children: title }), _jsx("div", { class: "small text-secondary font-monospace", children: item.id })] }), _jsx("span", { class: `badge ${selectedActivation ? "text-bg-success" : item.enabled ? "text-bg-light border" : "text-bg-secondary"}`, children: selectedActivation ? "active" : item.installed ? "shared" : item.enabled ? "awaiting install" : "disabled" })] }), _jsxs("div", { class: "small mt-2", children: [_jsx("strong", { children: "URL:" }), " ", _jsx("span", { class: "font-monospace", children: item.baseUrl })] }), item.category ? _jsxs("div", { class: "small", children: [_jsx("strong", { children: "Category:" }), " ", item.category] }) : "", item.tags.length > 0 ? (_jsxs("div", { class: "small mb-3", children: [_jsx("strong", { children: "Tags:" }), " ", item.tags.map((tag) => _jsx("span", { class: "badge text-bg-light border me-1", children: tag }))] })) : _jsx("div", { class: "mb-3" }), _jsxs("div", { class: "d-flex gap-2 flex-wrap", children: [!item.installed ? (_jsx("button", { class: "btn btn-sm btn-outline-primary", type: "button", "data-bp-install-shared": item.id, "data-bp-install-url": normalizeUrl(item.baseUrl), children: "Install" })) : "", selectedActivation ? (_jsx("button", { class: "btn btn-sm btn-outline-secondary", type: "button", "hx-delete": `${data.adminApiBase}/shared-services/${encodeURIComponent(item.id)}/activations?tenantId=${encodeURIComponent(selectedTenantId)}`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", "hx-confirm": "Deactivate this shared service for the selected tenant?", children: "Deactivate" })) : (_jsx("button", { class: "btn btn-sm btn-outline-primary", type: "button", "hx-post": `${data.adminApiBase}/shared-services/${encodeURIComponent(item.id)}/activations`, "hx-vals": `{"tenantId":"${selectedTenantId}"}`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", disabled: !item.enabled || !item.installed || !selectedTenantId ? true : undefined, children: "Activate" })), _jsx("button", { class: "btn btn-sm btn-outline-danger", type: "button", "hx-delete": `${data.adminApiBase}/shared-services/${encodeURIComponent(item.id)}`, "hx-target": "#bp-services-alerts", "hx-swap": "innerHTML", "hx-confirm": "Delete this shared service definition?", children: "Delete" })] })] }) }) }));
59
+ }
60
+ export function render(data) {
61
+ const tenantById = new Map(data.tenants.map((tenant) => [tenant.id, tenant]));
62
+ const selectedTenantId = data.selectedTenantId ?? data.tenants[0]?.id ?? "";
63
+ const selectedTenant = data.tenants.find((tenant) => tenant.id === selectedTenantId);
64
+ const selectedTenantServices = data.services.filter((service) => service.tenantId === selectedTenantId);
65
+ const unassignedServices = data.services.filter((service) => !service.tenantId);
66
+ const hasPendingManifests = data.services.some((service) => service.enabled && !service.configManifestKnown);
67
+ const selectedServicesPath = selectedTenantId ? `/services?tenantId=${encodeURIComponent(selectedTenantId)}` : "/services";
68
+ const adminApiBase = data.adminApiBase;
69
+ const serviceBaseUrl = data.serviceBaseUrl ?? "";
70
+ return (_jsxs("div", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-center mb-4 gap-3", children: [_jsxs("div", { children: [_jsx("h2", { class: "mb-1", children: data.title }), _jsx("p", { class: "text-secondary mb-0", children: "Register and manage service instances per tenant" })] }), _jsxs("div", { class: "d-flex gap-2 align-items-center", children: [_jsx("select", { class: "form-select", id: "bp-services-tenant-filter", name: "tenantId", "aria-label": "Tenant", "hx-get": "/services", "hx-trigger": "change", "hx-target": "#bp-main", "hx-swap": "innerHTML", "hx-push-url": selectedServicesPath, children: data.tenants.map((tenant) => (_jsx("option", { value: tenant.id, selected: tenant.id === selectedTenantId, children: tenant.title }))) }), _jsx("button", { class: "btn btn-primary text-nowrap", id: "bp-register-service-btn", "data-bs-toggle": "offcanvas", "data-bs-target": "#bp-add-service-panel", "hx-get": selectedTenantId ? `/.well-known/bp/admin/wizard/step1?tenantId=${encodeURIComponent(selectedTenantId)}` : "/.well-known/bp/admin/wizard/step1", "hx-target": "#bp-wizard-step", "hx-swap": "outerHTML", children: "+ Register Service" }), _jsx("button", { class: "btn btn-outline-primary text-nowrap", type: "button", "data-bs-toggle": "offcanvas", "data-bs-target": "#bp-shared-service-panel", children: "+ Shared Service" })] })] }), _jsx("div", { id: "bp-services-alerts" }), data.sharedServiceCatalog.length > 0 ? (_jsxs("section", { class: "mb-4", children: [_jsx("div", { class: "d-flex justify-content-between align-items-center border-bottom pb-2 mb-3", children: _jsxs("div", { children: [_jsx("h3", { class: "h5 mb-0", children: "Shared Services" }), _jsx("div", { class: "small text-secondary", children: "Platform-managed services that can be activated for tenants" })] }) }), _jsx("div", { class: "row g-3", children: data.sharedServiceCatalog.map((item) => renderCatalogCard(item, data, selectedTenantId)) })] })) : "", hasPendingManifests ? (_jsxs("div", { class: "alert alert-secondary d-flex justify-content-between align-items-center gap-3", children: [_jsx("span", { children: "Some service manifests are still pending sync." }), _jsx("button", { class: "btn btn-sm btn-outline-secondary", type: "button", "hx-get": selectedServicesPath, "hx-target": "#bp-main", "hx-swap": "innerHTML", children: "Refresh" })] })) : "", !selectedTenant ? (_jsx("div", { class: "alert alert-secondary", children: "No tenant selected" })) : (_jsxs("div", { class: "mb-4", children: [_jsxs("section", { class: "bp-services-tenant", "data-bp-tenant-id": selectedTenant.id, children: [_jsxs("div", { class: "d-flex justify-content-between align-items-center border-bottom pb-2 mb-3", children: [_jsxs("div", { children: [_jsx("h3", { class: "h5 mb-0", children: selectedTenant.title }), _jsx("div", { class: "small text-secondary font-monospace", children: selectedTenant.id })] }), _jsxs("span", { class: "badge text-bg-secondary", children: [selectedTenantServices.length, " services"] })] }), selectedTenantServices.length === 0 ? (_jsx("div", { class: "alert alert-secondary", children: "No services registered for this tenant" })) : (_jsx("div", { class: "row g-3", children: selectedTenantServices.map((service) => renderServiceCard(service, data, tenantById)) }))] }), unassignedServices.length > 0 ? (_jsxs("section", { class: "mt-4", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-center border-bottom pb-2 mb-3", children: [_jsxs("div", { children: [_jsx("h3", { class: "h5 mb-0", children: "Platform services" }), _jsx("div", { class: "small text-secondary", children: "Shared or unscoped registrations" })] }), _jsxs("span", { class: "badge text-bg-secondary", children: [unassignedServices.length, " services"] })] }), _jsx("div", { class: "row g-3", children: unassignedServices.map((service) => renderServiceCard(service, data, tenantById)) })] })) : ""] })), _jsxs("div", { class: "offcanvas offcanvas-end", tabindex: -1, id: "bp-add-service-panel", children: [_jsxs("div", { class: "offcanvas-header", children: [_jsx("h5", { class: "offcanvas-title", children: "Register Service" }), _jsx("button", { type: "button", class: "btn-close", "data-bs-dismiss": "offcanvas", "aria-label": "Close" })] }), _jsx("div", { class: "offcanvas-body", children: _jsx("div", { id: "bp-wizard-step", children: _jsx("div", { class: "text-center py-4 text-secondary", children: "Loading..." }) }) })] }), _jsxs("div", { class: "offcanvas offcanvas-end", tabindex: -1, id: "bp-config-edit-panel", style: "width:480px;max-width:90vw;", children: [_jsxs("div", { class: "offcanvas-header", children: [_jsx("h5", { class: "offcanvas-title", children: "Configure Service" }), _jsx("button", { type: "button", class: "btn-close", "data-bs-dismiss": "offcanvas", "aria-label": "Close" })] }), _jsx("div", { class: "offcanvas-body", children: _jsx("div", { id: "bp-config-edit-form", children: _jsx("div", { class: "text-center py-4 text-secondary", children: "Loading..." }) }) })] }), _jsxs("div", { class: "offcanvas offcanvas-end", tabindex: -1, id: "bp-shared-service-panel", style: "width:480px;max-width:90vw;", children: [_jsxs("div", { class: "offcanvas-header", children: [_jsx("h5", { class: "offcanvas-title", children: "Shared Service" }), _jsx("button", { type: "button", class: "btn-close", "data-bs-dismiss": "offcanvas", "aria-label": "Close" })] }), _jsxs("div", { class: "offcanvas-body", children: [_jsxs("form", { id: "bp-shared-service-form", "data-admin-api-base": adminApiBase, "data-service-base-url": serviceBaseUrl, children: [_jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", children: "Base URL" }), _jsx("input", { class: "form-control", type: "url", name: "baseUrl", placeholder: "http://localhost:3200", required: true })] }), _jsxs("div", { class: "mb-3", children: [_jsx("label", { class: "form-label", children: "Owner" }), _jsxs("select", { class: "form-select", name: "owner", children: [_jsx("option", { value: "bp", children: "BP" }), _jsx("option", { value: "3p", children: "Third party" })] })] }), _jsx("div", { class: "alert alert-secondary small", id: "bp-shared-service-preview", children: "Manifest details are loaded from the service before it is added." }), _jsx("button", { type: "submit", class: "btn btn-primary w-100", children: "Add Shared Service" })] }), _jsx("script", { children: `
71
+ (() => {
72
+ const form = document.getElementById("bp-shared-service-form");
73
+ const alerts = document.getElementById("bp-services-alerts");
74
+ const preview = document.getElementById("bp-shared-service-preview");
75
+ const serviceBaseUrl = ${JSON.stringify(serviceBaseUrl)}.replace(/\\/+$/, "");
76
+ const adminApiBase = serviceBaseUrl + ${JSON.stringify(adminApiBase)};
77
+ const escapeHtml = (value) => String(value).replace(/[&<>"']/g, (ch) => ({
78
+ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;"
79
+ })[ch]);
80
+ const setAlert = (kind, message) => {
81
+ if (!alerts) return;
82
+ alerts.innerHTML = '<div class="alert alert-' + kind + '">' + escapeHtml(message) + '</div>';
83
+ };
84
+ const postJson = async (url, body) => {
85
+ const response = await fetch(url, {
86
+ method: "POST",
87
+ headers: { "Content-Type": "application/json", Accept: "application/json" },
88
+ body: JSON.stringify(body)
89
+ });
90
+ const data = await response.json().catch(() => ({}));
91
+ if (!response.ok) throw new Error(data.error || ("HTTP " + response.status));
92
+ return data;
93
+ };
94
+ const installShared = async (id, baseUrl) => {
95
+ setAlert("secondary", "Installing shared service...");
96
+ const install = await postJson(adminApiBase + "/services/begin-install", {
97
+ serviceUrl: baseUrl,
98
+ sharedServiceId: id
99
+ });
100
+ await postJson(baseUrl + "/.well-known/bp/install", {
101
+ setupToken: install.setupToken,
102
+ cpUrl: install.cpUrl
103
+ });
104
+ setAlert("success", "Shared service installed. Waiting for sync...");
105
+ if (window.htmx) {
106
+ window.htmx.ajax("GET", (serviceBaseUrl || "") + "/services", { target: "#bp-main", swap: "innerHTML" });
107
+ } else {
108
+ window.location.reload();
109
+ }
110
+ };
111
+ document.addEventListener("click", async (event) => {
112
+ const button = event.target?.closest?.("[data-bp-install-shared]");
113
+ if (!button) return;
114
+ event.preventDefault();
115
+ try {
116
+ await installShared(button.dataset.bpInstallShared, button.dataset.bpInstallUrl);
117
+ } catch (error) {
118
+ setAlert("danger", error instanceof Error ? error.message : String(error));
119
+ }
120
+ });
121
+ const loadManifest = async (baseUrl) => {
122
+ const response = await fetch(baseUrl + "/.well-known/bp/manifest", {
123
+ method: "GET",
124
+ headers: { Accept: "application/json" },
125
+ cache: "no-store"
126
+ });
127
+ const manifest = await response.json().catch(() => null);
128
+ if (!response.ok || !manifest || typeof manifest.pluginId !== "string" || typeof manifest.title !== "string") {
129
+ throw new Error("Could not load a valid BetterPortal manifest");
130
+ }
131
+ return manifest;
132
+ };
133
+ form?.addEventListener("submit", async (event) => {
134
+ event.preventDefault();
135
+ const fd = new FormData(form);
136
+ const baseUrl = String(fd.get("baseUrl") || "").trim().replace(/\\/+$/, "");
137
+ if (!baseUrl) {
138
+ setAlert("danger", "Base URL is required");
139
+ return;
140
+ }
141
+ try {
142
+ setAlert("secondary", "Loading service manifest...");
143
+ const manifest = await loadManifest(baseUrl);
144
+ if (preview) {
145
+ const capabilities = Array.isArray(manifest.capabilities) ? manifest.capabilities.join(", ") : "";
146
+ preview.className = "alert alert-info small";
147
+ preview.innerHTML = '<div><strong>' + escapeHtml(manifest.title) + '</strong></div>' +
148
+ '<div class="font-monospace">' + escapeHtml(manifest.pluginId) + '</div>' +
149
+ (capabilities ? '<div>' + escapeHtml(capabilities) + '</div>' : "");
150
+ }
151
+ setAlert("secondary", "Creating shared service...");
152
+ const createBody = {
153
+ baseUrl,
154
+ owner: String(fd.get("owner") || "bp"),
155
+ enabled: true,
156
+ manifest
157
+ };
158
+ const created = await postJson(adminApiBase + "/shared-services", createBody);
159
+ await installShared(created.id || manifest.pluginId, baseUrl);
160
+ } catch (error) {
161
+ setAlert("danger", error instanceof Error ? error.message : String(error));
162
+ }
163
+ });
164
+ })();
165
+ ` })] })] })] }));
166
+ }
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.tsx"],"names":[],"mappings":";AAIA,SAAS,cAAc,CACrB,OAAyC,EACzC,KAAyB,EACzB,YAAoB,EACpB,YAAoB;IAEpB,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC;QAC7B,iBAAiB,EAAE,OAAO,CAAC,EAAE;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,KAAK,EAAE,YAAY;QACnB,YAAY;QACZ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEd,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,aAAa,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3N,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,aAAa,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7H,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,WAAW;YACtB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,mCAAmC,EAAE,EAAE;QACjD,WAAW,EAAE,sBAAsB;QACnC,SAAS,EAAE,WAAW;QACtB,uBAAuB,EAAE,4HAA4H;QACrJ,SAAS,EAAE,4HAA4H;QACvI,gBAAgB,EAAE,WAAW;QAC7B,gBAAgB,EAAE,uBAAuB;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,OAAyC,EACzC,KAAyB,EACzB,YAAoB,EACpB,YAAoB,EACpB,KAAK,GAAG,WAAW,EACnB,SAAS,GAAG,gCAAgC,EAC5C,cAAuB;IAEvB,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3G,IAAI,MAAM;QAAE,OAAO,CACjB,eAAM,KAAK,EAAE,MAAM,YACjB,iBAAQ,KAAK,EAAE,SAAS,EAAE,IAAI,EAAC,QAAQ,EAAC,QAAQ,yBAAe,MAAM,YAClE,KAAK,GACC,GACJ,CACR,CAAC;IAEF,OAAO,CACL,iBAAQ,KAAK,EAAE,SAAS,EAAE,IAAI,EAAC,QAAQ,KAAK,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,YACnG,KAAK,GACC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAyC,EACzC,IAAkB,EAClB,UAAwD;IAExD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC;IACrE,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ;QAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/E,OAAO,CACL,cAAK,KAAK,EAAC,iBAAiB,YAC1B,cAAK,KAAK,EAAC,+BAA+B,YACxC,eAAK,KAAK,EAAC,WAAW,aACpB,eAAK,KAAK,EAAC,uDAAuD,aAChE,0BACE,aAAI,KAAK,EAAC,MAAM,YAAE,KAAK,GAAM,EAC7B,cAAK,KAAK,EAAC,qCAAqC,YAAE,OAAO,CAAC,EAAE,GAAO,IAC/D,EACN,eAAM,KAAK,EAAE,SACX,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;oCAC/C,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;wCAC/C,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;4CAChD,iBACF,EAAE,YAAG,OAAO,CAAC,KAAK,GAAQ,IACtB,EACL,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAK,KAAK,EAAC,YAAY,aAAC,uCAAwB,OAAE,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAO,CAAC,CAAC,CAAC,EAAE,EAClH,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,KAAK,EAAC,YAAY,aAAC,qCAAsB,OAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAO,CAAC,CAAC,CAAC,EAAE,EAChK,eAAK,KAAK,EAAC,YAAY,aAAC,oCAAqB,OAAC,eAAM,KAAK,EAAC,gBAAgB,YAAE,OAAO,CAAC,QAAQ,GAAQ,IAAM,EACzG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,eAAK,KAAK,EAAC,YAAY,aAAC,uCAAwB,OAAC,eAAM,KAAK,EAAC,gBAAgB,YAAE,OAAO,CAAC,SAAS,GAAQ,IAAM,CAAC,CAAC,CAAC,EAAE,EACvI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,eAAK,KAAK,EAAC,YAAY,aACrB,6CAA8B,EAAC,GAAG,EACjC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,eAAM,KAAK,EAAC,iCAAiC,YAAE,UAAU,GAAQ,CAAC,IACxG,CACP,CAAC,CAAC,CAAC,EAAE,EACN,eAAK,KAAK,EAAC,YAAY,aAAC,uCAAwB,OAAC,eAAM,KAAK,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,EAAE,YAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAQ,IAAM,EAC1L,eAAK,KAAK,EAAC,YAAY,aAAC,wCAAyB,OAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,IAAO,EAC5I,eAAK,KAAK,EAAC,2CAA2C,aACnD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjB,cAAK,KAAK,EAAC,wBAAwB,YAChC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAChC,8BACE,iBAAQ,KAAK,EAAC,yCAAyC,EAAC,IAAI,EAAC,QAAQ,oBAAgB,UAAU,0BAAmB,EAClH,aAAI,KAAK,EAAC,eAAe,YACtB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,uBACE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,eAAe,KAAK,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,YACrH,GAAG,CAAC,KAAK,GACH,GACN,CACN,CAAC,GACC,IACJ,CACJ,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,CAAC,GAChG,CACP,CAAC,CAAC,CAAC,CACF,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC3D,EACA,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChD,iBAAQ,KAAK,EAAC,kCAAkC,eACnC,GAAG,IAAI,CAAC,YAAY,oBAAoB,kBAAkB,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,eAC3J,qBAAqB,aACvB,WAAW,gBACR,iCAAiC,2BAErC,CACV,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CACrB,8BACG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,qCAAqC,CAAC,CAAC,CAAC,CAClF,iBAAQ,KAAK,EAAC,gCAAgC,aACnC,GAAG,IAAI,CAAC,YAAY,YAAY,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,oBAAoB,eAClI,qBAAqB,aACvB,WAAW,gBACR,6EAA6E,kCAEjF,CACV,CAAC,CAAC,CAAC,EAAE,EACN,iBAAQ,KAAK,EAAC,+BAA+B,eAChC,iCAAiC,OAAO,CAAC,QAAQ,aAAa,OAAO,CAAC,EAAE,EAAE,eAC3E,qBAAqB,aACvB,WAAW,gBACR,mCAAmC,uBAEvC,IACR,CACJ,CAAC,CAAC,CAAC,EAAE,IACF,IACF,GACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAkD,EAClD,IAAkB,EAClB,gBAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;IACpC,MAAM,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAC3E,UAAU,CAAC,QAAQ,KAAK,gBAAgB;WACrC,UAAU,CAAC,eAAe,KAAK,IAAI,CAAC,EAAE;WACtC,UAAU,CAAC,OAAO;WAClB,CAAC,UAAU,CAAC,KAAK,CACrB,CAAC;IACF,OAAO,CACL,cACE,KAAK,EAAC,iCAAiC,wBACnB,IAAI,CAAC,EAAE,yBACN,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,YAE/C,cAAK,KAAK,EAAC,+BAA+B,YACxC,eAAK,KAAK,EAAC,WAAW,aACpB,eAAK,KAAK,EAAC,wDAAwD,aACjE,0BACE,aAAI,KAAK,EAAC,MAAM,YAAE,KAAK,GAAM,EAC7B,cAAK,KAAK,EAAC,qCAAqC,YAAE,IAAI,CAAC,EAAE,GAAO,IAC5D,EACN,eAAM,KAAK,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,EAAE,YACzH,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,GACtG,IACH,EACN,eAAK,KAAK,EAAC,YAAY,aAAC,oCAAqB,OAAC,eAAM,KAAK,EAAC,gBAAgB,YAAE,IAAI,CAAC,OAAO,GAAQ,IAAM,EACrG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAK,KAAK,EAAC,OAAO,aAAC,yCAA0B,OAAE,IAAI,CAAC,QAAQ,IAAO,CAAC,CAAC,CAAC,EAAE,EACxF,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtB,eAAK,KAAK,EAAC,YAAY,aACrB,qCAAsB,EAAC,GAAG,EACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAM,KAAK,EAAC,iCAAiC,YAAE,GAAG,GAAQ,CAAC,IAC/E,CACP,CAAC,CAAC,CAAC,cAAK,KAAK,EAAC,MAAM,GAAO,EAC5B,eAAK,KAAK,EAAC,wBAAwB,aAChC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACjB,iBACE,KAAK,EAAC,gCAAgC,EACtC,IAAI,EAAC,QAAQ,4BACW,IAAI,CAAC,EAAE,yBACV,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,wBAGxC,CACV,CAAC,CAAC,CAAC,EAAE,EACL,kBAAkB,CAAC,CAAC,CAAC,CACpB,iBACE,KAAK,EAAC,kCAAkC,EACxC,IAAI,EAAC,QAAQ,eACF,GAAG,IAAI,CAAC,YAAY,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,eACnI,qBAAqB,aACvB,WAAW,gBACR,yDAAyD,2BAG7D,CACV,CAAC,CAAC,CAAC,CACF,iBACE,KAAK,EAAC,gCAAgC,EACtC,IAAI,EAAC,QAAQ,aACJ,GAAG,IAAI,CAAC,YAAY,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,aACjF,gBAAgB,gBAAgB,IAAI,eACnC,qBAAqB,aACvB,WAAW,EACnB,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,yBAG3E,CACV,EACD,iBACE,KAAK,EAAC,+BAA+B,EACrC,IAAI,EAAC,QAAQ,eACF,GAAG,IAAI,CAAC,YAAY,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,eACtE,qBAAqB,aACvB,WAAW,gBACR,wCAAwC,uBAG5C,IACL,IACF,GACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;IACrF,MAAM,sBAAsB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC;IACxG,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChF,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7G,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3H,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;IAEjD,OAAO,CACL,eAAK,KAAK,EAAC,sBAAsB,aAC/B,eAAK,KAAK,EAAC,8DAA8D,aACvE,0BACE,aAAI,KAAK,EAAC,MAAM,YAAE,IAAI,CAAC,KAAK,GAAM,EAClC,YAAG,KAAK,EAAC,qBAAqB,iEAAqD,IAC/E,EACN,eAAK,KAAK,EAAC,iCAAiC,aAC1C,iBACE,KAAK,EAAC,aAAa,EACnB,EAAE,EAAC,2BAA2B,EAC9B,IAAI,EAAC,UAAU,gBACJ,QAAQ,YACZ,WAAW,gBACP,QAAQ,eACT,UAAU,aACZ,WAAW,iBACN,oBAAoB,YAEhC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC5B,iBAAQ,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,gBAAgB,YAAG,MAAM,CAAC,KAAK,GAAU,CAC5F,CAAC,GACK,EACT,iBAAQ,KAAK,EAAC,6BAA6B,EAAC,EAAE,EAAC,yBAAyB,oBAAgB,WAAW,oBAAgB,uBAAuB,YAChI,gBAAgB,CAAC,CAAC,CAAC,+CAA+C,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC,eAAY,iBAAiB,aAAS,WAAW,mCAEjM,EACT,iBAAQ,KAAK,EAAC,qCAAqC,EAAC,IAAI,EAAC,QAAQ,oBAAgB,WAAW,oBAAgB,0BAA0B,iCAE7H,IACL,IACF,EAEN,cAAK,EAAE,EAAC,oBAAoB,GAAO,EAElC,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtC,mBAAS,KAAK,EAAC,MAAM,aACnB,cAAK,KAAK,EAAC,2EAA2E,YACpF,0BACE,aAAI,KAAK,EAAC,SAAS,gCAAqB,EACxC,cAAK,KAAK,EAAC,sBAAsB,4EAAkE,IAC/F,GACF,EACN,cAAK,KAAK,EAAC,SAAS,YACjB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,GACrF,IACE,CACX,CAAC,CAAC,CAAC,EAAE,EAEL,mBAAmB,CAAC,CAAC,CAAC,CACrB,eAAK,KAAK,EAAC,+EAA+E,aACxF,4EAA2D,EAC3D,iBACE,KAAK,EAAC,kCAAkC,EACxC,IAAI,EAAC,QAAQ,YACL,oBAAoB,eAClB,UAAU,aACZ,WAAW,wBAGZ,IACL,CACP,CAAC,CAAC,CAAC,EAAE,EAEL,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,cAAK,KAAK,EAAC,uBAAuB,mCAAyB,CAC5D,CAAC,CAAC,CAAC,CACF,eAAK,KAAK,EAAC,MAAM,aACf,mBAAS,KAAK,EAAC,oBAAoB,uBAAoB,cAAc,CAAC,EAAE,aACtE,eAAK,KAAK,EAAC,2EAA2E,aACpF,0BACE,aAAI,KAAK,EAAC,SAAS,YAAE,cAAc,CAAC,KAAK,GAAM,EAC/C,cAAK,KAAK,EAAC,qCAAqC,YAAE,cAAc,CAAC,EAAE,GAAO,IACtE,EACN,gBAAM,KAAK,EAAC,yBAAyB,aAAE,sBAAsB,CAAC,MAAM,iBAAiB,IACjF,EACL,sBAAsB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrC,cAAK,KAAK,EAAC,uBAAuB,uDAA6C,CAChF,CAAC,CAAC,CAAC,CACF,cAAK,KAAK,EAAC,SAAS,YACjB,sBAAsB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,GAClF,CACP,IACO,EACT,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC/B,mBAAS,KAAK,EAAC,MAAM,aACnB,eAAK,KAAK,EAAC,2EAA2E,aACpF,0BACE,aAAI,KAAK,EAAC,SAAS,kCAAuB,EAC1C,cAAK,KAAK,EAAC,sBAAsB,iDAAuC,IACpE,EACN,gBAAM,KAAK,EAAC,yBAAyB,aAAE,kBAAkB,CAAC,MAAM,iBAAiB,IAC7E,EACN,cAAK,KAAK,EAAC,SAAS,YACjB,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,GAC9E,IACE,CACX,CAAC,CAAC,CAAC,EAAE,IACF,CACP,EAED,eAAK,KAAK,EAAC,yBAAyB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAC,sBAAsB,aAC1E,eAAK,KAAK,EAAC,kBAAkB,aAC3B,aAAI,KAAK,EAAC,iBAAiB,iCAAsB,EACjD,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,WAAW,qBAAiB,WAAW,gBAAY,OAAO,GAAU,IAC5F,EACN,cAAK,KAAK,EAAC,gBAAgB,YACzB,cAAK,EAAE,EAAC,gBAAgB,YACtB,cAAK,KAAK,EAAC,iCAAiC,2BAAiB,GACzD,GACF,IACF,EAEN,eAAK,KAAK,EAAC,yBAAyB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAC,sBAAsB,EAAC,KAAK,EAAC,6BAA6B,aAC9G,eAAK,KAAK,EAAC,kBAAkB,aAC3B,aAAI,KAAK,EAAC,iBAAiB,kCAAuB,EAClD,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,WAAW,qBAAiB,WAAW,gBAAY,OAAO,GAAU,IAC5F,EACN,cAAK,KAAK,EAAC,gBAAgB,YACzB,cAAK,EAAE,EAAC,qBAAqB,YAC3B,cAAK,KAAK,EAAC,iCAAiC,2BAAiB,GACzD,GACF,IACF,EAEN,eAAK,KAAK,EAAC,yBAAyB,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAC,yBAAyB,EAAC,KAAK,EAAC,6BAA6B,aACjH,eAAK,KAAK,EAAC,kBAAkB,aAC3B,aAAI,KAAK,EAAC,iBAAiB,+BAAoB,EAC/C,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,WAAW,qBAAiB,WAAW,gBAAY,OAAO,GAAU,IAC5F,EACN,eAAK,KAAK,EAAC,gBAAgB,aACzB,gBACE,EAAE,EAAC,wBAAwB,yBACN,YAAY,2BACV,cAAc,aAErC,eAAK,KAAK,EAAC,MAAM,aACf,gBAAO,KAAK,EAAC,YAAY,yBAAiB,EAC1C,gBAAO,KAAK,EAAC,cAAc,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,EAAC,WAAW,EAAC,uBAAuB,EAAC,QAAQ,SAAG,IACjG,EACN,eAAK,KAAK,EAAC,MAAM,aACf,gBAAO,KAAK,EAAC,YAAY,sBAAc,EACvC,kBAAQ,KAAK,EAAC,aAAa,EAAC,IAAI,EAAC,OAAO,aACtC,iBAAQ,KAAK,EAAC,IAAI,mBAAY,EAC9B,iBAAQ,KAAK,EAAC,IAAI,4BAAqB,IAChC,IACL,EACN,cAAK,KAAK,EAAC,6BAA6B,EAAC,EAAE,EAAC,2BAA2B,iFAAuE,EAC9I,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,uBAAuB,mCAA4B,IAC1E,EACP,2BACG;;;;;2BAKc,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;0CACf,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAyFzD,GACM,IACL,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,128 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ import { type DemoScenario, type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
4
+ export declare const ResponseSchema: av.ObjectSchema<{
5
+ title: av.StringSchema;
6
+ services: av.ArraySchema<av.ObjectSchema<{
7
+ id: av.StringSchema;
8
+ hostname: av.StringSchema;
9
+ serviceId: av.OptionalSchema<av.StringSchema>;
10
+ capabilities: av.ArraySchema<av.StringSchema>;
11
+ title: av.OptionalSchema<av.StringSchema>;
12
+ description: av.OptionalSchema<av.StringSchema>;
13
+ createdAt: av.StringSchema;
14
+ lastSeenAt: av.OptionalSchema<av.StringSchema>;
15
+ enabled: av.BoolSchema;
16
+ scope: av.StringSchema;
17
+ themeId: av.OptionalSchema<av.StringSchema>;
18
+ tenantId: av.OptionalSchema<av.StringSchema>;
19
+ pushBase: av.StringSchema;
20
+ supportsCustomUi: av.BoolSchema;
21
+ configManifestKnown: av.BoolSchema;
22
+ hasConfigurableOptions: av.BoolSchema;
23
+ customUiPath: av.OptionalSchema<av.StringSchema>;
24
+ }>>;
25
+ tenants: av.ArraySchema<av.ObjectSchema<{
26
+ id: av.StringSchema;
27
+ title: av.StringSchema;
28
+ }>>;
29
+ selectedTenantId: av.OptionalSchema<av.StringSchema>;
30
+ sharedServiceCatalog: av.ArraySchema<av.ObjectSchema<{
31
+ id: av.StringSchema;
32
+ serviceId: av.OptionalSchema<av.StringSchema>;
33
+ title: av.StringSchema;
34
+ description: av.OptionalSchema<av.StringSchema>;
35
+ baseUrl: av.StringSchema;
36
+ owner: av.OptionalSchema<av.StringSchema>;
37
+ category: av.OptionalSchema<av.StringSchema>;
38
+ tags: av.ArraySchema<av.StringSchema>;
39
+ installed: av.BoolSchema;
40
+ enabled: av.BoolSchema;
41
+ }>>;
42
+ sharedServiceActivations: av.ArraySchema<av.ObjectSchema<{
43
+ id: av.StringSchema;
44
+ tenantId: av.StringSchema;
45
+ appId: av.OptionalSchema<av.StringSchema>;
46
+ sharedServiceId: av.StringSchema;
47
+ activatedAt: av.StringSchema;
48
+ enabled: av.BoolSchema;
49
+ }>>;
50
+ apps: av.ArraySchema<av.ObjectSchema<{
51
+ id: av.StringSchema;
52
+ tenantId: av.StringSchema;
53
+ title: av.StringSchema;
54
+ }>>;
55
+ tenantApps: av.RecordSchema<av.ArraySchema<av.ObjectSchema<{
56
+ id: av.StringSchema;
57
+ title: av.StringSchema;
58
+ shellServiceId: av.OptionalSchema<av.StringSchema>;
59
+ }>>>;
60
+ adminApiBase: av.StringSchema;
61
+ serviceBaseUrl: av.OptionalSchema<av.StringSchema>;
62
+ }>;
63
+ export type ResponseData = Infer<typeof ResponseSchema>;
64
+ export declare const title = "Service Registry";
65
+ export declare const description = "Manage registered service instances.";
66
+ export declare const auth: ApiAuthRequirement;
67
+ export declare const cacheHints: CacheHints;
68
+ export declare const demoScenarios: DemoScenario<ResponseData>[];
69
+ export declare const handleGet: import("@betterportal/framework").RouteHandler<Record<string, string>, Record<string, unknown>, Record<string, string>, Record<string, unknown>, {
70
+ title: string;
71
+ services: {
72
+ id: string;
73
+ hostname: string;
74
+ capabilities: string[];
75
+ createdAt: string;
76
+ enabled: boolean;
77
+ scope: string;
78
+ pushBase: string;
79
+ supportsCustomUi: boolean;
80
+ configManifestKnown: boolean;
81
+ hasConfigurableOptions: boolean;
82
+ serviceId?: string | undefined;
83
+ title?: string | undefined;
84
+ description?: string | undefined;
85
+ lastSeenAt?: string | undefined;
86
+ themeId?: string | undefined;
87
+ tenantId?: string | undefined;
88
+ customUiPath?: string | undefined;
89
+ }[];
90
+ tenants: {
91
+ id: string;
92
+ title: string;
93
+ }[];
94
+ sharedServiceCatalog: {
95
+ id: string;
96
+ title: string;
97
+ baseUrl: string;
98
+ tags: string[];
99
+ installed: boolean;
100
+ enabled: boolean;
101
+ serviceId?: string | undefined;
102
+ description?: string | undefined;
103
+ owner?: string | undefined;
104
+ category?: string | undefined;
105
+ }[];
106
+ sharedServiceActivations: {
107
+ id: string;
108
+ tenantId: string;
109
+ sharedServiceId: string;
110
+ activatedAt: string;
111
+ enabled: boolean;
112
+ appId?: string | undefined;
113
+ }[];
114
+ apps: {
115
+ id: string;
116
+ tenantId: string;
117
+ title: string;
118
+ }[];
119
+ tenantApps: Record<string, {
120
+ id: string;
121
+ title: string;
122
+ shellServiceId?: string | undefined;
123
+ }[]>;
124
+ adminApiBase: string;
125
+ selectedTenantId?: string | undefined;
126
+ serviceBaseUrl?: string | undefined;
127
+ }, unknown, Record<string, unknown>>;
128
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AA6DjC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,qBAAqB,CAAC;AACxC,eAAO,MAAM,WAAW,yCAAyC,CAAC;AAElE,eAAO,MAAM,IAAI,EAAE,kBAKlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAA4D,CAAC;AAEtF,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,YAAY,CAAC,EAMrD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAMrB,CAAC"}
@@ -0,0 +1,89 @@
1
+ import * as av from "anyvali";
2
+ import { createHandler } from "@betterportal/framework";
3
+ const RegisteredServiceItemSchema = av.object({
4
+ id: av.string().minLength(1).describe("Stable UUIDv7 service instance id."),
5
+ hostname: av.string().format("url").describe("Service origin used by the browser for direct HTMX requests."),
6
+ serviceId: av.optional(av.string()).describe("Service plugin id from the service manifest."),
7
+ capabilities: av.array(av.string()).default([]).describe("Capabilities advertised by the service manifest."),
8
+ title: av.optional(av.string()).describe("Human-readable service title from the manifest or registration."),
9
+ description: av.optional(av.string()).describe("Human-readable service description from the manifest."),
10
+ createdAt: av.string().describe("ISO timestamp when the service registration was created."),
11
+ lastSeenAt: av.optional(av.string()).describe("ISO timestamp when the service last checked in or synced."),
12
+ enabled: av.bool().describe("Whether this service registration is active."),
13
+ scope: av.string().minLength(1).describe("Registration scope: tenant, shared, platform, or theme."),
14
+ themeId: av.optional(av.string().minLength(1)).describe("Theme renderer id when the service provides a theme."),
15
+ tenantId: av.optional(av.string()).describe("Owning tenant id for tenant-scoped service registrations."),
16
+ pushBase: av.string().minLength(1).describe("Browser-visible route base used when pushing URLs for custom service UI."),
17
+ supportsCustomUi: av.bool().default(false).describe("True when the service exposes a custom configuration UI."),
18
+ configManifestKnown: av.bool().default(false).describe("True once config-manager has received this service instance manifest via sync."),
19
+ hasConfigurableOptions: av.bool().default(false).describe("True when the service has configurable schema fields or a custom configuration UI."),
20
+ customUiPath: av.optional(av.string()).describe("Service-side path for custom configuration UI, when provided.")
21
+ }, { unknownKeys: "strip" });
22
+ const AppByTenantSchema = av.object({
23
+ id: av.string().minLength(1).describe("Stable UUIDv7 app id."),
24
+ title: av.string().minLength(1).describe("Human-readable app title."),
25
+ shellServiceId: av.optional(av.string().minLength(1)).describe("Shell service instance selected by the app.")
26
+ }, { unknownKeys: "strip" });
27
+ const AppSummarySchema = av.object({
28
+ id: av.string().minLength(1).describe("Stable UUIDv7 app id."),
29
+ tenantId: av.string().minLength(1).describe("Owning tenant id."),
30
+ title: av.string().minLength(1).describe("Human-readable app title.")
31
+ }, { unknownKeys: "strip" });
32
+ const TenantSummarySchema = av.object({
33
+ id: av.string().minLength(1).describe("Stable UUIDv7 tenant id."),
34
+ title: av.string().minLength(1).describe("Human-readable tenant title.")
35
+ }, { unknownKeys: "strip" });
36
+ const SharedServiceCatalogItemSchema = av.object({
37
+ id: av.string().minLength(1),
38
+ serviceId: av.optional(av.string().minLength(1)),
39
+ title: av.string().minLength(1),
40
+ description: av.optional(av.string()),
41
+ baseUrl: av.string().minLength(1),
42
+ owner: av.optional(av.string()),
43
+ category: av.optional(av.string()),
44
+ tags: av.array(av.string()).default([]),
45
+ installed: av.bool().default(false),
46
+ enabled: av.bool().default(true)
47
+ }, { unknownKeys: "strip" });
48
+ const SharedServiceActivationSchema = av.object({
49
+ id: av.string().minLength(1),
50
+ tenantId: av.string().minLength(1),
51
+ appId: av.optional(av.string().minLength(1)),
52
+ sharedServiceId: av.string().minLength(1),
53
+ activatedAt: av.string().minLength(1),
54
+ enabled: av.bool().default(true)
55
+ }, { unknownKeys: "strip" });
56
+ export const ResponseSchema = av.object({
57
+ title: av.string().minLength(1).describe("View title for the service registry."),
58
+ services: av.array(RegisteredServiceItemSchema).describe("Registered service instances visible to the admin view."),
59
+ tenants: av.array(TenantSummarySchema).describe("Tenants available for grouping and service registration."),
60
+ selectedTenantId: av.optional(av.string().minLength(1)).describe("Tenant currently selected in the service registry."),
61
+ sharedServiceCatalog: av.array(SharedServiceCatalogItemSchema).default([]).describe("Shared service definitions from platform config."),
62
+ sharedServiceActivations: av.array(SharedServiceActivationSchema).default([]).describe("Tenant/app activations for shared services."),
63
+ apps: av.array(AppSummarySchema).default([]).describe("Apps available in the current admin context."),
64
+ tenantApps: av.record(av.array(AppByTenantSchema)).default({}).describe("Apps keyed by tenant id for configuring tenant or theme-scoped services."),
65
+ adminApiBase: av.string().minLength(1).describe("Base path for config-manager admin API calls."),
66
+ serviceBaseUrl: av.optional(av.string()).describe("Config-manager service origin for browser-mediated admin requests.")
67
+ }, { unknownKeys: "strip" });
68
+ export const title = "Service Registry";
69
+ export const description = "Manage registered service instances.";
70
+ export const auth = {
71
+ required: true,
72
+ permissions: [
73
+ { serviceId: "service.betterportal.config-manager", viewId: "services.index", permissions: ["read"] }
74
+ ]
75
+ };
76
+ export const cacheHints = { ttlSeconds: 0, varyBy: ["accept", "origin"] };
77
+ export const demoScenarios = [
78
+ {
79
+ id: "default",
80
+ title: "Default",
81
+ response: { title: "Service Registry", services: [], tenants: [], sharedServiceCatalog: [], sharedServiceActivations: [], apps: [], tenantApps: {}, adminApiBase: "/.well-known/bp/admin" }
82
+ }
83
+ ];
84
+ export const handleGet = createHandler({ response: ResponseSchema }, (ctx) => {
85
+ if (ctx.responseModel)
86
+ return ctx.responseModel;
87
+ return { title: "Service Registry", services: [], tenants: [], sharedServiceCatalog: [], sharedServiceActivations: [], apps: [], tenantApps: {}, adminApiBase: "/.well-known/bp/admin" };
88
+ });
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/services/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** @jsxImportSource jsx-htmx */
2
+ import type { HtmlRenderable } from "@betterportal/framework";
3
+ import type { ResponseData } from "../index.js";
4
+ export declare function render(data: ResponseData): HtmlRenderable;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUhD,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CA4FzD"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
+ function serviceBadge(tags) {
3
+ return tags.length > 0 ? (_jsx("div", { class: "d-flex gap-1 flex-wrap", children: tags.map((tag) => _jsx("span", { class: "badge text-bg-light border", children: tag })) })) : "";
4
+ }
5
+ export function render(data) {
6
+ return (_jsxs("div", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex flex-wrap justify-content-between align-items-start gap-3 mb-4", children: [_jsxs("div", { children: [_jsx("div", { class: "text-uppercase small text-secondary fw-semibold", children: "User Management" }), _jsx("h2", { class: "mb-2", children: data.title }), _jsxs("p", { class: "text-secondary mb-0", children: [data.tenant.title, " / ", data.app.title] })] }), _jsxs("div", { class: "d-flex gap-2 flex-wrap", children: [_jsx("a", { class: "btn btn-sm btn-outline-secondary", href: data.managementDiscoveryUrl, target: "_blank", rel: "noreferrer", children: "Management API" }), _jsx("a", { class: "btn btn-sm btn-outline-secondary", href: data.automationCatalogUrl, target: "_blank", rel: "noreferrer", children: "Automation Catalog" })] })] }), _jsx("div", { id: "bp-settings-alerts", class: "mb-3" }), _jsxs("div", { class: "row g-3 mb-4", children: [_jsx("div", { class: "col-12 col-xl-6", children: _jsx("section", { class: "card border-0 shadow-sm h-100", children: _jsxs("div", { class: "card-body", children: [_jsx("h5", { class: "mb-3", children: "Current App" }), _jsxs("dl", { class: "row small mb-0", children: [_jsx("dt", { class: "col-sm-3", children: "Tenant ID" }), _jsx("dd", { class: "col-sm-9 font-monospace", children: data.tenant.id }), _jsx("dt", { class: "col-sm-3", children: "App ID" }), _jsx("dd", { class: "col-sm-9 font-monospace", children: data.app.id }), _jsx("dt", { class: "col-sm-3", children: "Hostnames" }), _jsx("dd", { class: "col-sm-9", children: data.app.hostnames.length ? data.app.hostnames.join(", ") : "None" })] })] }) }) }), _jsx("div", { class: "col-12 col-xl-6", children: _jsx("section", { class: "card border-0 shadow-sm h-100", children: _jsxs("div", { class: "card-body", children: [_jsx("h5", { class: "mb-3", children: "Endpoints" }), _jsxs("div", { class: "list-group list-group-flush small", children: [_jsx("a", { class: "list-group-item list-group-item-action px-0", href: data.endpoints.services, target: "_blank", rel: "noreferrer", children: "Services" }), _jsxs("a", { class: "list-group-item list-group-item-action px-0", href: data.endpoints.routes, target: "_blank", rel: "noreferrer", children: ["Routes (", data.routeCount, ")"] }), _jsxs("a", { class: "list-group-item list-group-item-action px-0", href: data.endpoints.fragments, target: "_blank", rel: "noreferrer", children: ["Fragments (", data.fragmentCount, ")"] }), _jsx("a", { class: "list-group-item list-group-item-action px-0", href: data.endpoints.theme, target: "_blank", rel: "noreferrer", children: "Theme" }), _jsx("a", { class: "list-group-item list-group-item-action px-0", href: data.endpoints.webhooks, target: "_blank", rel: "noreferrer", children: "Webhooks" })] })] }) }) })] }), _jsxs("section", { children: [_jsxs("div", { class: "d-flex justify-content-between align-items-center mb-3", children: [_jsx("h5", { class: "mb-0", children: "Shared Services" }), _jsx("span", { class: "badge text-bg-secondary", children: data.sharedServices.length })] }), _jsx("div", { class: "row g-3", children: data.sharedServices.map((service) => (_jsx("div", { class: "col-12 col-xl-6", children: _jsx("article", { class: "card border-0 shadow-sm h-100", children: _jsxs("div", { class: "card-body", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start gap-3 mb-2", children: [_jsxs("div", { children: [_jsx("h6", { class: "mb-1", children: service.title }), _jsx("div", { class: "small text-secondary font-monospace", children: service.id })] }), _jsx("span", { class: `badge ${service.active ? "text-bg-success" : service.enabled ? "text-bg-light border" : "text-bg-secondary"}`, children: service.active ? "active" : service.enabled ? "available" : "disabled" })] }), service.description ? _jsx("p", { class: "small text-secondary mb-2", children: service.description }) : "", _jsxs("div", { class: "small mb-2", children: [_jsx("strong", { children: "URL:" }), " ", _jsx("span", { class: "font-monospace", children: service.baseUrl })] }), service.category ? _jsxs("div", { class: "small mb-2", children: [_jsx("strong", { children: "Category:" }), " ", service.category] }) : "", _jsx("div", { class: "mb-3", children: serviceBadge(service.tags) }), !service.active && service.enabled ? (_jsxs("form", { "hx-post": data.endpoints.activateService, "hx-target": "#bp-settings-alerts", "hx-swap": "innerHTML", children: [_jsx("input", { type: "hidden", name: "sharedServiceId", value: service.id }), _jsx("button", { class: "btn btn-sm btn-primary", type: "submit", children: "Activate" })] })) : ""] }) }) }))) })] })] }));
7
+ }
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ import { type ApiAuthRequirement, type CacheHints, type DemoScenario } from "@betterportal/framework";
4
+ export declare const ResponseSchema: av.ObjectSchema<{
5
+ title: av.StringSchema;
6
+ tenant: av.ObjectSchema<{
7
+ id: av.StringSchema;
8
+ title: av.StringSchema;
9
+ }>;
10
+ app: av.ObjectSchema<{
11
+ id: av.StringSchema;
12
+ tenantId: av.StringSchema;
13
+ title: av.StringSchema;
14
+ hostnames: av.ArraySchema<av.StringSchema>;
15
+ }>;
16
+ idsVisible: av.BoolSchema;
17
+ managementDiscoveryUrl: av.StringSchema;
18
+ automationCatalogUrl: av.StringSchema;
19
+ endpoints: av.ObjectSchema<{
20
+ current: av.StringSchema;
21
+ services: av.StringSchema;
22
+ activateService: av.StringSchema;
23
+ routes: av.StringSchema;
24
+ fragments: av.StringSchema;
25
+ theme: av.StringSchema;
26
+ webhooks: av.StringSchema;
27
+ webhookEvents: av.StringSchema;
28
+ }>;
29
+ sharedServices: av.ArraySchema<av.ObjectSchema<{
30
+ id: av.StringSchema;
31
+ serviceId: av.OptionalSchema<av.StringSchema>;
32
+ title: av.StringSchema;
33
+ description: av.OptionalSchema<av.StringSchema>;
34
+ baseUrl: av.StringSchema;
35
+ category: av.OptionalSchema<av.StringSchema>;
36
+ tags: av.ArraySchema<av.StringSchema>;
37
+ enabled: av.BoolSchema;
38
+ active: av.BoolSchema;
39
+ }>>;
40
+ routeCount: av.IntSchema;
41
+ fragmentCount: av.IntSchema;
42
+ }>;
43
+ export type ResponseData = Infer<typeof ResponseSchema>;
44
+ export declare const title = "App Settings";
45
+ export declare const description = "Manage the current BetterPortal app through the user management API.";
46
+ export declare const auth: ApiAuthRequirement;
47
+ export declare const dependencies: string[];
48
+ export declare const cacheHints: CacheHints;
49
+ export declare const demoScenarios: DemoScenario<ResponseData>[];
50
+ export declare const handleGet: import("@betterportal/framework").RouteHandler<Record<string, string>, Record<string, unknown>, Record<string, string>, Record<string, unknown>, {
51
+ title: string;
52
+ tenant: {
53
+ id: string;
54
+ title: string;
55
+ };
56
+ app: {
57
+ id: string;
58
+ tenantId: string;
59
+ title: string;
60
+ hostnames: string[];
61
+ };
62
+ idsVisible: boolean;
63
+ managementDiscoveryUrl: string;
64
+ automationCatalogUrl: string;
65
+ endpoints: {
66
+ current: string;
67
+ services: string;
68
+ activateService: string;
69
+ routes: string;
70
+ fragments: string;
71
+ theme: string;
72
+ webhooks: string;
73
+ webhookEvents: string;
74
+ };
75
+ sharedServices: {
76
+ id: string;
77
+ title: string;
78
+ baseUrl: string;
79
+ tags: string[];
80
+ enabled: boolean;
81
+ active: boolean;
82
+ serviceId?: string | undefined;
83
+ description?: string | undefined;
84
+ category?: string | undefined;
85
+ }[];
86
+ routeCount: number;
87
+ fragmentCount: number;
88
+ }, unknown, Record<string, unknown>>;
89
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-config-manager/bp-routes/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAqCjC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,iBAAiB,CAAC;AACpC,eAAO,MAAM,WAAW,yEAAyE,CAAC;AAElG,eAAO,MAAM,IAAI,EAAE,kBAKlB,CAAC;AAEF,eAAO,MAAM,YAAY,UAKxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAAuE,CAAC;AAEjG,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,YAAY,CAAC,EA0BrD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAMrB,CAAC"}