@replicated/portal-components 0.0.21 → 0.0.22

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 (182) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/change-team.js +39 -0
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +1 -1
  6. package/dist/actions/index.d.ts +1 -1
  7. package/dist/actions/index.js +40 -0
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +1 -1
  10. package/dist/actions/install-actions.d.ts +1 -1
  11. package/dist/actions/install-actions.js +39 -0
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +1 -1
  14. package/dist/actions/service-account.d.ts +1 -1
  15. package/dist/actions/service-account.js +39 -0
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +1 -1
  18. package/dist/actions/support-bundles.d.ts +1 -1
  19. package/dist/actions/support-bundles.js +39 -0
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +1 -1
  22. package/dist/actions/team-settings.d.ts +1 -1
  23. package/dist/actions/team-settings.js +39 -0
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.js +39 -0
  26. package/dist/actions/trial-signup.js.map +1 -1
  27. package/dist/actions/user-settings.d.mts +1 -1
  28. package/dist/actions/user-settings.d.ts +1 -1
  29. package/dist/actions/user-settings.js +39 -0
  30. package/dist/actions/user-settings.js.map +1 -1
  31. package/dist/airgap-instances.d.mts +1 -1
  32. package/dist/airgap-instances.d.ts +1 -1
  33. package/dist/airgap-instances.js +3 -2
  34. package/dist/airgap-instances.js.map +1 -1
  35. package/dist/esm/actions/change-team.js +39 -0
  36. package/dist/esm/actions/change-team.js.map +1 -1
  37. package/dist/esm/actions/index.js +40 -1
  38. package/dist/esm/actions/index.js.map +1 -1
  39. package/dist/esm/actions/install-actions.js +39 -0
  40. package/dist/esm/actions/install-actions.js.map +1 -1
  41. package/dist/esm/actions/service-account.js +39 -0
  42. package/dist/esm/actions/service-account.js.map +1 -1
  43. package/dist/esm/actions/support-bundles.js +39 -0
  44. package/dist/esm/actions/support-bundles.js.map +1 -1
  45. package/dist/esm/actions/team-settings.js +39 -0
  46. package/dist/esm/actions/team-settings.js.map +1 -1
  47. package/dist/esm/actions/trial-signup.js +39 -0
  48. package/dist/esm/actions/trial-signup.js.map +1 -1
  49. package/dist/esm/actions/user-settings.js +39 -0
  50. package/dist/esm/actions/user-settings.js.map +1 -1
  51. package/dist/esm/airgap-instances.js +3 -2
  52. package/dist/esm/airgap-instances.js.map +1 -1
  53. package/dist/esm/helm-install-wizard.js +414 -189
  54. package/dist/esm/helm-install-wizard.js.map +1 -1
  55. package/dist/esm/index.js +89 -64
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/install-actions.js +39 -0
  58. package/dist/esm/install-actions.js.map +1 -1
  59. package/dist/esm/instance-card.js +2 -1
  60. package/dist/esm/instance-card.js.map +1 -1
  61. package/dist/esm/license-details.js +39 -0
  62. package/dist/esm/license-details.js.map +1 -1
  63. package/dist/esm/linux-install-wizard.js +310 -166
  64. package/dist/esm/linux-install-wizard.js.map +1 -1
  65. package/dist/esm/logout-action.js +187 -0
  66. package/dist/esm/logout-action.js.map +1 -0
  67. package/dist/esm/logout-button.js +32 -0
  68. package/dist/esm/logout-button.js.map +1 -0
  69. package/dist/esm/markdown-renderer.js +16 -0
  70. package/dist/esm/markdown-renderer.js.map +1 -0
  71. package/dist/esm/middleware.js +3 -3
  72. package/dist/esm/middleware.js.map +1 -1
  73. package/dist/esm/online-instance-list.js +3 -2
  74. package/dist/esm/online-instance-list.js.map +1 -1
  75. package/dist/esm/saml-callback-client.js +5 -2
  76. package/dist/esm/saml-callback-client.js.map +1 -1
  77. package/dist/esm/saml-handlers.js +104 -0
  78. package/dist/esm/saml-handlers.js.map +1 -1
  79. package/dist/esm/support-bundle-collection-card.js +3 -2
  80. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  81. package/dist/esm/support-bundles-card.js +2 -2
  82. package/dist/esm/support-bundles-card.js.map +1 -1
  83. package/dist/esm/support-card.js +39 -0
  84. package/dist/esm/support-card.js.map +1 -1
  85. package/dist/esm/top-nav-menu-close.js +46 -0
  86. package/dist/esm/top-nav-menu-close.js.map +1 -0
  87. package/dist/esm/top-nav.js +149 -59
  88. package/dist/esm/top-nav.js.map +1 -1
  89. package/dist/esm/trial-signup.js +6 -3
  90. package/dist/esm/trial-signup.js.map +1 -1
  91. package/dist/esm/update-layout.js +149 -59
  92. package/dist/esm/update-layout.js.map +1 -1
  93. package/dist/esm/upload-support-bundle-modal.js +2 -2
  94. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  95. package/dist/esm/user-menu-dropdown.js +52 -0
  96. package/dist/esm/user-menu-dropdown.js.map +1 -0
  97. package/dist/esm/user-settings.js +5 -5
  98. package/dist/esm/user-settings.js.map +1 -1
  99. package/dist/esm/utils/index.js +39 -0
  100. package/dist/esm/utils/index.js.map +1 -1
  101. package/dist/helm-install-wizard.d.mts +18 -7
  102. package/dist/helm-install-wizard.d.ts +18 -7
  103. package/dist/helm-install-wizard.js +418 -189
  104. package/dist/helm-install-wizard.js.map +1 -1
  105. package/dist/{index-sMbq94M7.d.ts → index-DXy7RxOX.d.ts} +18 -1
  106. package/dist/{index-DyzJ0yKD.d.mts → index-JX9-CIMA.d.mts} +18 -1
  107. package/dist/index.d.mts +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +89 -64
  110. package/dist/index.js.map +1 -1
  111. package/dist/install-actions.d.mts +2 -2
  112. package/dist/install-actions.d.ts +2 -2
  113. package/dist/install-actions.js +39 -0
  114. package/dist/install-actions.js.map +1 -1
  115. package/dist/instance-card.d.mts +1 -1
  116. package/dist/instance-card.d.ts +1 -1
  117. package/dist/instance-card.js +2 -1
  118. package/dist/instance-card.js.map +1 -1
  119. package/dist/license-details.js +39 -0
  120. package/dist/license-details.js.map +1 -1
  121. package/dist/linux-install-wizard.d.mts +17 -7
  122. package/dist/linux-install-wizard.d.ts +17 -7
  123. package/dist/linux-install-wizard.js +314 -166
  124. package/dist/linux-install-wizard.js.map +1 -1
  125. package/dist/logout-action.d.mts +7 -0
  126. package/dist/logout-action.d.ts +7 -0
  127. package/dist/logout-action.js +189 -0
  128. package/dist/logout-action.js.map +1 -0
  129. package/dist/logout-button.d.mts +16 -0
  130. package/dist/logout-button.d.ts +16 -0
  131. package/dist/logout-button.js +34 -0
  132. package/dist/logout-button.js.map +1 -0
  133. package/dist/markdown-renderer.d.mts +12 -0
  134. package/dist/markdown-renderer.d.ts +12 -0
  135. package/dist/markdown-renderer.js +22 -0
  136. package/dist/markdown-renderer.js.map +1 -0
  137. package/dist/middleware.js +3 -3
  138. package/dist/middleware.js.map +1 -1
  139. package/dist/online-instance-list.d.mts +1 -1
  140. package/dist/online-instance-list.d.ts +1 -1
  141. package/dist/online-instance-list.js +3 -2
  142. package/dist/online-instance-list.js.map +1 -1
  143. package/dist/pending-installations.d.mts +1 -1
  144. package/dist/pending-installations.d.ts +1 -1
  145. package/dist/saml-callback-client.js +5 -2
  146. package/dist/saml-callback-client.js.map +1 -1
  147. package/dist/saml-handlers.js +104 -0
  148. package/dist/saml-handlers.js.map +1 -1
  149. package/dist/security-card.d.mts +1 -1
  150. package/dist/security-card.d.ts +1 -1
  151. package/dist/styles.css +39 -0
  152. package/dist/support-bundle-collection-card.js +3 -2
  153. package/dist/support-bundle-collection-card.js.map +1 -1
  154. package/dist/support-bundles-card.d.mts +2 -2
  155. package/dist/support-bundles-card.d.ts +2 -2
  156. package/dist/support-bundles-card.js +2 -2
  157. package/dist/support-bundles-card.js.map +1 -1
  158. package/dist/support-card.js +39 -0
  159. package/dist/support-card.js.map +1 -1
  160. package/dist/top-nav-menu-close.d.mts +10 -0
  161. package/dist/top-nav-menu-close.d.ts +10 -0
  162. package/dist/top-nav-menu-close.js +48 -0
  163. package/dist/top-nav-menu-close.js.map +1 -0
  164. package/dist/top-nav.js +149 -59
  165. package/dist/top-nav.js.map +1 -1
  166. package/dist/trial-signup.js +6 -3
  167. package/dist/trial-signup.js.map +1 -1
  168. package/dist/update-layout.js +149 -59
  169. package/dist/update-layout.js.map +1 -1
  170. package/dist/upload-support-bundle-modal.js +2 -2
  171. package/dist/upload-support-bundle-modal.js.map +1 -1
  172. package/dist/user-menu-dropdown.d.mts +25 -0
  173. package/dist/user-menu-dropdown.d.ts +25 -0
  174. package/dist/user-menu-dropdown.js +59 -0
  175. package/dist/user-menu-dropdown.js.map +1 -0
  176. package/dist/user-settings.js +5 -5
  177. package/dist/user-settings.js.map +1 -1
  178. package/dist/utils/index.d.mts +1 -1
  179. package/dist/utils/index.d.ts +1 -1
  180. package/dist/utils/index.js +39 -0
  181. package/dist/utils/index.js.map +1 -1
  182. package/package.json +29 -2
@@ -0,0 +1,187 @@
1
+ import { cookies } from 'next/headers';
2
+ import { redirect } from 'next/navigation';
3
+
4
+ /**
5
+ * Enterprise Portal Components
6
+ * This file is generated by tsup. Do not edit manually.
7
+ */
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __getOwnPropNames = Object.getOwnPropertyNames;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
13
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
14
+ }) : x)(function(x) {
15
+ if (typeof require !== "undefined") return require.apply(this, arguments);
16
+ throw Error('Dynamic require of "' + x + '" is not supported');
17
+ });
18
+ var __esm = (fn, res) => function __init() {
19
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
20
+ };
21
+ var __export = (target, all) => {
22
+ for (var name in all)
23
+ __defProp(target, name, { get: all[name], enumerable: true });
24
+ };
25
+ var __copyProps = (to, from, except, desc) => {
26
+ if (from && typeof from === "object" || typeof from === "function") {
27
+ for (let key of __getOwnPropNames(from))
28
+ if (!__hasOwnProp.call(to, key) && key !== except)
29
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
30
+ }
31
+ return to;
32
+ };
33
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
+
35
+ // datadog/tracer.ts
36
+ var tracer_exports = {};
37
+ __export(tracer_exports, {
38
+ default: () => tracer_default
39
+ });
40
+ var rawFlag, isEnabled, tracer, getRoutePattern, tracer_default;
41
+ var init_tracer = __esm({
42
+ "datadog/tracer.ts"() {
43
+ rawFlag = String(process.env.USE_DATADOG_APM || "").toLowerCase();
44
+ isEnabled = rawFlag === "true";
45
+ process.env.DD_TRACE_ENABLED = isEnabled ? "1" : "0";
46
+ tracer = null;
47
+ if (isEnabled) {
48
+ const serviceName = process.env.DD_SERVICE || "enterprise-portal";
49
+ const environment = process.env.DD_ENV || process.env.NODE_ENV || "development";
50
+ const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || "0.0.0-dev";
51
+ const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || "127.0.0.1";
52
+ const agentPort = process.env.DD_TRACE_AGENT_PORT || "8126";
53
+ process.env.DD_SERVICE = serviceName;
54
+ process.env.DD_ENV = environment;
55
+ {
56
+ process.env.DD_VERSION = version;
57
+ }
58
+ process.env.DD_AGENT_HOST = agentHost;
59
+ process.env.DD_TRACE_AGENT_PORT = agentPort;
60
+ const dbmPropagationMode = process.env.DD_DBM_PROPAGATION_MODE || "full";
61
+ process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
62
+ try {
63
+ const ddTrace = __require("dd-trace");
64
+ tracer = ddTrace.init({
65
+ service: serviceName,
66
+ env: environment,
67
+ version,
68
+ logInjection: true,
69
+ runtimeMetrics: true,
70
+ appsec: false,
71
+ profiling: false,
72
+ startupLogs: true
73
+ // Enable for debugging
74
+ });
75
+ console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
76
+ tracer.use("dns", false);
77
+ tracer.use("net", false);
78
+ tracer.use("http", {
79
+ server: {
80
+ hooks: {
81
+ request: (span, req) => {
82
+ if (!span) return;
83
+ const url = req?.url || "";
84
+ const method = req?.method || "GET";
85
+ const path = url.split("?")[0];
86
+ if (path.startsWith("/_next/")) {
87
+ span.context()._trace.isRecording = false;
88
+ return;
89
+ }
90
+ const routePattern = getRoutePattern(path);
91
+ span.setTag("resource.name", `${method} ${routePattern}`);
92
+ span.setTag("http.route", routePattern);
93
+ }
94
+ }
95
+ }
96
+ });
97
+ } catch (err) {
98
+ console.error("[datadog] failed to initialize tracing", err);
99
+ tracer = null;
100
+ }
101
+ }
102
+ getRoutePattern = (path) => {
103
+ const routePatterns = [
104
+ // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
105
+ { pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: "/update/instance/[instanceId]$1" }
106
+ ];
107
+ for (const { pattern, replacement } of routePatterns) {
108
+ if (pattern.test(path)) {
109
+ return path.replace(pattern, replacement);
110
+ }
111
+ }
112
+ return path;
113
+ };
114
+ tracer_default = tracer;
115
+ }
116
+ });
117
+
118
+ // src/utils/observability/tracing.ts
119
+ var tracerCache = void 0;
120
+ function getTracer() {
121
+ if (tracerCache !== void 0) {
122
+ return tracerCache;
123
+ }
124
+ const rawFlag2 = String(process.env.USE_DATADOG_APM || "").toLowerCase();
125
+ const isEnabled2 = rawFlag2 === "true";
126
+ if (!isEnabled2) {
127
+ tracerCache = null;
128
+ return null;
129
+ }
130
+ try {
131
+ const tracerModule = (init_tracer(), __toCommonJS(tracer_exports));
132
+ const tracer2 = tracerModule.default || tracerModule;
133
+ if (tracer2 && typeof tracer2.trace === "function") {
134
+ tracerCache = tracer2;
135
+ return tracerCache;
136
+ }
137
+ } catch (err) {
138
+ console.warn("Failed to load tracer:", err);
139
+ }
140
+ tracerCache = null;
141
+ return null;
142
+ }
143
+ async function withTrace(name, fn) {
144
+ const activeTracer = getTracer();
145
+ if (!activeTracer) {
146
+ return fn(void 0);
147
+ }
148
+ return activeTracer.trace(name, async (span) => {
149
+ if (span) {
150
+ span.setTag("component", "application");
151
+ }
152
+ try {
153
+ const result = await fn(span);
154
+ return result;
155
+ } catch (error) {
156
+ if (span) {
157
+ span.setTag("error", error);
158
+ }
159
+ throw error;
160
+ }
161
+ });
162
+ }
163
+ function traceServerAction(name, fn) {
164
+ const spanName = name.startsWith("server.action.") ? name : `server.action.${name}`;
165
+ const traced = async (...args) => {
166
+ return withTrace(spanName, async (span) => {
167
+ if (span) {
168
+ span.setTag("component", "server-action");
169
+ }
170
+ const result = await fn(...args);
171
+ return result;
172
+ });
173
+ };
174
+ return traced;
175
+ }
176
+
177
+ // src/actions/logout.ts
178
+ async function logoutActionImpl(_formData) {
179
+ const cookieStore = await cookies();
180
+ cookieStore.delete("portal_session");
181
+ redirect("/");
182
+ }
183
+ var logoutAction = traceServerAction("logoutAction", logoutActionImpl);
184
+
185
+ export { logoutAction };
186
+ //# sourceMappingURL=logout-action.js.map
187
+ //# sourceMappingURL=logout-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../datadog/tracer.ts","../../src/utils/observability/tracing.ts","../../src/actions/logout.ts"],"names":["rawFlag","isEnabled","tracer"],"mappings":"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","file":"logout-action.js","sourcesContent":["import type { Tracer, Span, init as ddTraceInit } from 'dd-trace';\nimport type { IncomingMessage } from 'http';\n\nconst rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();\nconst isEnabled = rawFlag === 'true';\n\nprocess.env.DD_TRACE_ENABLED = isEnabled ? '1' : '0';\n\nlet tracer: Tracer | null = null;\n\nif (isEnabled) {\n const serviceName = process.env.DD_SERVICE || 'enterprise-portal';\n const environment = process.env.DD_ENV || process.env.NODE_ENV || 'development';\n const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || '0.0.0-dev';\n\n const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || '127.0.0.1';\n const agentPort = process.env.DD_TRACE_AGENT_PORT || '8126';\n\n process.env.DD_SERVICE = serviceName;\n process.env.DD_ENV = environment;\n if (version) {\n process.env.DD_VERSION = version;\n }\n process.env.DD_AGENT_HOST = agentHost;\n process.env.DD_TRACE_AGENT_PORT = agentPort;\n\n const dbmPropagationMode = (process.env.DD_DBM_PROPAGATION_MODE || 'full') as 'disabled' | 'service' | 'full';\n\n process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ddTrace = require('dd-trace');\n tracer = (ddTrace.init as typeof ddTraceInit)({\n service: serviceName,\n env: environment,\n version,\n logInjection: true,\n runtimeMetrics: true,\n appsec: false,\n profiling: false,\n startupLogs: true, // Enable for debugging\n }) as Tracer;\n \n console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);\n\n // Disable low-level network instrumentation for localhost connections\n tracer.use('dns', false);\n tracer.use('net', false);\n // Configure http plugin to normalize route patterns\n tracer.use('http', {\n server: {\n hooks: {\n request: (span?: Span, req?: IncomingMessage) => {\n if (!span) return;\n\n const url = req?.url || '';\n const method = req?.method || 'GET';\n const path = url.split('?')[0];\n\n // Drop Next.js internal requests\n if (path.startsWith('/_next/')) {\n // @ts-expect-error - using internal property to drop the trace\n span.context()._trace.isRecording = false;\n return;\n }\n\n const routePattern = getRoutePattern(path);\n\n span.setTag('resource.name', `${method} ${routePattern}`);\n span.setTag('http.route', routePattern);\n }\n }\n }\n });\n } catch (err) {\n // Do not crash the app if tracing fails to initialize\n console.error('[datadog] failed to initialize tracing', err);\n tracer = null;\n }\n}\n\n// Function to convert actual paths to route patterns\nconst getRoutePattern = (path: string): string => {\n // Define route patterns for dynamic routes in enterprise portal\n const routePatterns = [\n // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)\n { pattern: /^\\/update\\/instance\\/[^/]+(.*)$/, replacement: '/update/instance/[instanceId]$1' },\n ];\n\n for (const { pattern, replacement } of routePatterns) {\n if (pattern.test(path)) {\n return path.replace(pattern, replacement);\n }\n }\n\n // Return original path if no pattern matches\n return path;\n}\n\nexport default tracer;\n","import type { Span, Tracer } from 'dd-trace';\n\n// Type for a function that has been wrapped with tracing (always returns a Promise)\ntype TracedFunction<T extends (...args: any[]) => any> = (\n ...args: Parameters<T>\n) => Promise<Awaited<ReturnType<T>>>;\n\n// Lazy-load tracer only when tracing is enabled\n// Using undefined to distinguish between \"not loaded yet\" and \"loaded but null\"\nlet tracerCache: Tracer | null | undefined = undefined;\n\nfunction getTracer(): Tracer | null {\n // Return cached result if already loaded (prevents race conditions and multiple initializations)\n if (tracerCache !== undefined) {\n return tracerCache;\n }\n\n // Check if tracing is enabled at runtime (consistent with datadog/tracer.ts and instrumentation.ts)\n const rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();\n const isEnabled = rawFlag === 'true';\n\n if (!isEnabled) {\n tracerCache = null;\n return null;\n }\n\n // Lazy load the tracer module only when needed\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tracerModule = require('../../../datadog/tracer');\n const tracer = tracerModule.default || tracerModule;\n\n if (tracer && typeof (tracer as any).trace === 'function') {\n tracerCache = tracer as Tracer;\n return tracerCache;\n }\n } catch (err) {\n console.warn('Failed to load tracer:', err);\n }\n\n tracerCache = null;\n return null;\n}\n\n/**\n * Get the currently active span from the tracer's scope.\n * This can be used to pass span context to database calls.\n */\nexport function getActiveSpan(): Span | undefined {\n const activeTracer = getTracer();\n if (!activeTracer || !activeTracer.scope) {\n return undefined;\n }\n const active = activeTracer.scope().active();\n return active || undefined;\n}\n\nexport async function withTrace<T>(\n name: string,\n fn: (span?: Span) => Promise<T> | T,\n): Promise<T> {\n const activeTracer = getTracer();\n if (!activeTracer) {\n return fn(undefined);\n }\n\n return activeTracer.trace(name, async (span?: Span) => {\n if (span) {\n span.setTag('component', 'application');\n }\n try {\n const result = await fn(span);\n return result;\n } catch (error) {\n if (span) {\n span.setTag('error', error as any);\n }\n throw error;\n }\n });\n}\n\nexport function traceServerAction<T extends (...args: any[]) => any>(\n name: string,\n fn: T,\n): TracedFunction<T> {\n const spanName = name.startsWith('server.action.') ? name : `server.action.${name}`;\n\n const traced: TracedFunction<T> = async (...args: Parameters<T>) => {\n return withTrace(spanName, async (span) => {\n if (span) {\n span.setTag('component', 'server-action');\n }\n const result = await fn(...args);\n return result;\n });\n };\n\n return traced;\n}\n\nexport function traceFunction<T extends (...args: any[]) => any>(\n name: string,\n fn: T,\n): TracedFunction<T> {\n const traced: TracedFunction<T> = async (...args: Parameters<T>) => {\n return withTrace(name, async () => {\n const result = await fn(...args);\n return result;\n });\n };\n\n return traced;\n}\n","import { cookies } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport { traceServerAction } from \"../utils/observability\";\n\nasync function logoutActionImpl(_formData: FormData): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.delete(\"portal_session\");\n redirect(\"/\");\n}\n\n/**\n * Server action to log out the current user.\n * Deletes the portal_session cookie and redirects to home.\n */\nexport const logoutAction = traceServerAction(\"logoutAction\", logoutActionImpl);\n"]}
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { useTransition } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ /**
6
+ * Enterprise Portal Components
7
+ * This file is generated by tsup. Do not edit manually.
8
+ */
9
+
10
+ function LogoutButton({ action }) {
11
+ const [isPending, startTransition] = useTransition();
12
+ const handleSubmit = (event) => {
13
+ event.preventDefault();
14
+ const formData = new FormData(event.currentTarget);
15
+ startTransition(async () => {
16
+ await action(formData);
17
+ });
18
+ };
19
+ return /* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsx(
20
+ "button",
21
+ {
22
+ type: "submit",
23
+ disabled: isPending,
24
+ className: "block w-full px-4 py-2.5 text-sm text-left text-red-600 hover:bg-red-50 transition-colors disabled:opacity-50",
25
+ children: isPending ? "Logging out..." : "Logout"
26
+ }
27
+ ) });
28
+ }
29
+
30
+ export { LogoutButton };
31
+ //# sourceMappingURL=logout-button.js.map
32
+ //# sourceMappingURL=logout-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/logout-button.tsx"],"names":[],"mappings":";;;;;;;;AAgBO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAAsB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,eAAe,CAAA,GAAI,aAAA,EAAc;AAEnD,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA4C;AAChE,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AACjD,IAAA,eAAA,CAAgB,YAAY;AAC1B,MAAA,MAAM,OAAO,QAAQ,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,kBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAU,+GAAA;AAAA,MAET,sBAAY,gBAAA,GAAmB;AAAA;AAAA,GAClC,EACF,CAAA;AAEJ","file":"logout-button.js","sourcesContent":["\"use client\";\n\nimport { useTransition } from \"react\";\n\nexport interface LogoutButtonProps {\n /** \n * Action ID for the logout server action.\n * This should be bound on the server side before passing to this component.\n */\n action: (formData: FormData) => void;\n}\n\n/**\n * Logout button for user menu dropdown.\n * Uses red styling to indicate a destructive action.\n */\nexport function LogoutButton({ action }: LogoutButtonProps) {\n const [isPending, startTransition] = useTransition();\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n startTransition(async () => {\n await action(formData);\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <button\n type=\"submit\"\n disabled={isPending}\n className=\"block w-full px-4 py-2.5 text-sm text-left text-red-600 hover:bg-red-50 transition-colors disabled:opacity-50\"\n >\n {isPending ? \"Logging out...\" : \"Logout\"}\n </button>\n </form>\n );\n}\n"]}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import ReactMarkdown from 'react-markdown';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ /**
6
+ * Enterprise Portal Components
7
+ * This file is generated by tsup. Do not edit manually.
8
+ */
9
+
10
+ function MarkdownRenderer({ children }) {
11
+ return /* @__PURE__ */ jsx("div", { className: "markdown-content", children: /* @__PURE__ */ jsx(ReactMarkdown, { children }) });
12
+ }
13
+
14
+ export { MarkdownRenderer };
15
+ //# sourceMappingURL=markdown-renderer.js.map
16
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/markdown-renderer.tsx"],"names":[],"mappings":";;;;;;;;AAYO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAe,UAAS,CAAA,EAC3B,CAAA;AAEJ","file":"markdown-renderer.js","sourcesContent":["\"use client\";\n\nimport ReactMarkdown from \"react-markdown\";\n\ninterface MarkdownRendererProps {\n children: string;\n}\n\n/**\n * Simple wrapper around ReactMarkdown for rendering markdown content.\n * Used for pre/post-install instructions in the installation wizard.\n */\nexport function MarkdownRenderer({ children }: MarkdownRendererProps) {\n return (\n <div className=\"markdown-content\">\n <ReactMarkdown>{children}</ReactMarkdown>\n </div>\n );\n}\n"]}
@@ -8,9 +8,9 @@ import { NextResponse } from 'next/server';
8
8
  function portalMiddleware(request) {
9
9
  const url = request.nextUrl;
10
10
  const pathname = url.pathname;
11
- if (pathname === "/" && url.searchParams.get("expired") === "1") {
12
- const basePath = process.env.NEXT_PUBLIC_BASE_PATH;
13
- const redirectUrl = new URL(basePath || "/", request.url);
11
+ if (url.searchParams.get("expired") === "1") {
12
+ const loginPath = process.env.NEXT_PUBLIC_BASE_PATH ? `${process.env.NEXT_PUBLIC_BASE_PATH}/login` : "/login";
13
+ const redirectUrl = new URL(loginPath, request.url);
14
14
  const response = NextResponse.redirect(redirectUrl);
15
15
  response.cookies.delete("portal_session");
16
16
  return response;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware.ts"],"names":[],"mappings":";;;;;;;AAWO,SAAS,iBAAiB,OAAA,EAAsB;AACrD,EAAA,MAAM,MAAM,OAAA,CAAQ,OAAA;AACpB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,IAAI,aAAa,GAAA,IAAO,GAAA,CAAI,aAAa,GAAA,CAAI,SAAS,MAAM,GAAA,EAAK;AAE/D,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,qBAAA;AAC7B,IAAA,MAAM,cAAc,IAAI,GAAA,CAAI,QAAA,IAAY,GAAA,EAAK,QAAQ,GAAG,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA;AAGlD,IAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAExC,IAAA,OAAO,QAAA;AAAA,EACT;AAIA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,eAAA;AAC5B,EAAA,IAAI,OAAA,KAAY,QAAA,KAAa,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,IAAM,SAAS,UAAA,CAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAA,EAAI;AAElF,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,qBAAA;AAC7B,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,IAAK,GAAA;AAC1D,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,EAAG,WAAW,CAAA,CAAA,GAAK,WAAA;AAE1D,IAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,QAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,cAAA,EAAgB,QAAQ,GAAG,CAAA;AAClD,IAAA,MAAA,CAAO,SAAS,GAAA,CAAI,MAAA;AACpB,IAAA,OAAO,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,aAAa,IAAA,EAAK;AAC3B","file":"middleware.js","sourcesContent":["import { NextResponse } from \"next/server\";\nimport type { NextRequest } from \"next/server\";\n\n/**\n * Shared middleware for enterprise portal applications.\n * \n * Handles:\n * - Expired session redirects (deletes cookie and redirects to root)\n * - App slug prefix redirects (/{appSlug}/path → /path)\n * - Respects NEXT_PUBLIC_BASE_PATH for reverse proxy scenarios\n */\nexport function portalMiddleware(request: NextRequest) {\n const url = request.nextUrl;\n const pathname = url.pathname;\n\n // Check if this is a logout/expired session redirect\n if (pathname === \"/\" && url.searchParams.get(\"expired\") === \"1\") {\n // Redirect to the app's root (respecting basePath for proxied scenarios)\n const basePath = process.env.NEXT_PUBLIC_BASE_PATH;\n const redirectUrl = new URL(basePath || \"/\", request.url);\n const response = NextResponse.redirect(redirectUrl);\n \n // Delete the expired session cookie\n response.cookies.delete(\"portal_session\");\n \n return response;\n }\n\n // Handle app slug prefix: /{appSlug}/... → /...\n // Redirect to remove the app slug prefix from the URL (respecting basePath for proxied scenarios)\n const appSlug = process.env.PORTAL_APP_SLUG;\n if (appSlug && (pathname === `/${appSlug}` || pathname.startsWith(`/${appSlug}/`))) {\n // Redirect /{appSlug} → /, /{appSlug}/invite → /invite, etc.\n const basePath = process.env.NEXT_PUBLIC_BASE_PATH;\n const newPathname = pathname.slice(appSlug.length + 1) || \"/\";\n const fullPath = basePath ? `${basePath}${newPathname}` : newPathname;\n // Remove trailing slash unless it's the root path\n const normalizedPath = fullPath.length > 1 ? fullPath.replace(/\\/$/, '') : fullPath;\n const newUrl = new URL(normalizedPath, request.url);\n newUrl.search = url.search;\n return NextResponse.redirect(newUrl);\n }\n\n return NextResponse.next();\n}\n\n/**\n * Note: The middleware config matcher cannot be exported from this module.\n * Next.js requires it to be defined as a static object literal in each\n * template's middleware.ts file for build-time analysis.\n * \n * Recommended config for templates:\n * \n * export const config = {\n * matcher: [\n * \"/((?!api|_next/static|_next/image|favicon.ico).*)\",\n * ],\n * };\n */\n"]}
1
+ {"version":3,"sources":["../../src/middleware.ts"],"names":[],"mappings":";;;;;;;AAWO,SAAS,iBAAiB,OAAA,EAAsB;AACrD,EAAA,MAAM,MAAM,OAAA,CAAQ,OAAA;AACpB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAS,MAAM,GAAA,EAAK;AAG3C,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,qBAAA,GAC1B,GAAG,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,MAAA,CAAA,GACpC,QAAA;AACJ,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,SAAA,EAAW,QAAQ,GAAG,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA;AAGlD,IAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAExC,IAAA,OAAO,QAAA;AAAA,EACT;AAIA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,eAAA;AAC5B,EAAA,IAAI,OAAA,KAAY,QAAA,KAAa,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,IAAM,SAAS,UAAA,CAAW,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA,CAAA,EAAI;AAElF,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,qBAAA;AAC7B,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,IAAK,GAAA;AAC1D,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,EAAG,WAAW,CAAA,CAAA,GAAK,WAAA;AAE1D,IAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,QAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,cAAA,EAAgB,QAAQ,GAAG,CAAA;AAClD,IAAA,MAAA,CAAO,SAAS,GAAA,CAAI,MAAA;AACpB,IAAA,OAAO,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,aAAa,IAAA,EAAK;AAC3B","file":"middleware.js","sourcesContent":["import { NextResponse } from \"next/server\";\nimport type { NextRequest } from \"next/server\";\n\n/**\n * Shared middleware for enterprise portal applications.\n * \n * Handles:\n * - Expired session redirects (deletes cookie and redirects to root)\n * - App slug prefix redirects (/{appSlug}/path → /path)\n * - Respects NEXT_PUBLIC_BASE_PATH for reverse proxy scenarios\n */\nexport function portalMiddleware(request: NextRequest) {\n const url = request.nextUrl;\n const pathname = url.pathname;\n\n // Check if this is a logout/expired session redirect\n if (url.searchParams.get(\"expired\") === \"1\") {\n // Delete the expired session cookie and redirect to login\n // Respect basePath for reverse proxy scenarios\n const loginPath = process.env.NEXT_PUBLIC_BASE_PATH \n ? `${process.env.NEXT_PUBLIC_BASE_PATH}/login` \n : \"/login\";\n const redirectUrl = new URL(loginPath, request.url);\n const response = NextResponse.redirect(redirectUrl);\n \n // Delete the expired session cookie\n response.cookies.delete(\"portal_session\");\n \n return response;\n }\n\n // Handle app slug prefix: /{appSlug}/... → /...\n // Redirect to remove the app slug prefix from the URL (respecting basePath for proxied scenarios)\n const appSlug = process.env.PORTAL_APP_SLUG;\n if (appSlug && (pathname === `/${appSlug}` || pathname.startsWith(`/${appSlug}/`))) {\n // Redirect /{appSlug} → /, /{appSlug}/invite → /invite, etc.\n const basePath = process.env.NEXT_PUBLIC_BASE_PATH;\n const newPathname = pathname.slice(appSlug.length + 1) || \"/\";\n const fullPath = basePath ? `${basePath}${newPathname}` : newPathname;\n // Remove trailing slash unless it's the root path\n const normalizedPath = fullPath.length > 1 ? fullPath.replace(/\\/$/, '') : fullPath;\n const newUrl = new URL(normalizedPath, request.url);\n newUrl.search = url.search;\n return NextResponse.redirect(newUrl);\n }\n\n return NextResponse.next();\n}\n\n/**\n * Note: The middleware config matcher cannot be exported from this module.\n * Next.js requires it to be defined as a static object literal in each\n * template's middleware.ts file for build-time analysis.\n * \n * Recommended config for templates:\n * \n * export const config = {\n * matcher: [\n * \"/((?!api|_next/static|_next/image|favicon.ico).*)\",\n * ],\n * };\n */\n"]}
@@ -11,6 +11,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
11
11
 
12
12
 
13
13
  // src/utils/constants.ts
14
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
14
15
  var DEFAULT_SECONDARY_COLOR = "#6366f1";
15
16
 
16
17
  // src/utils/format.ts
@@ -264,7 +265,7 @@ function InstanceCard({
264
265
  channelReleases = [],
265
266
  installOptions = [],
266
267
  onUpdateClick,
267
- primaryColor = DEFAULT_SECONDARY_COLOR,
268
+ primaryColor = DEFAULT_PRIMARY_COLOR,
268
269
  securityData = {},
269
270
  securityDiffData = {},
270
271
  securityEnabled = false
@@ -432,7 +433,7 @@ var OnlineInstanceList = ({
432
433
  channelReleases = [],
433
434
  installOptions = [],
434
435
  onUpdateClick,
435
- primaryColor = DEFAULT_SECONDARY_COLOR,
436
+ primaryColor = DEFAULT_PRIMARY_COLOR,
436
437
  securityData = {},
437
438
  securityDiffData = {},
438
439
  securityEnabled = false,