@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,7 @@
1
+ /**
2
+ * Server action to log out the current user.
3
+ * Deletes the portal_session cookie and redirects to home.
4
+ */
5
+ declare const logoutAction: (_formData: FormData) => Promise<void>;
6
+
7
+ export { logoutAction };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Server action to log out the current user.
3
+ * Deletes the portal_session cookie and redirects to home.
4
+ */
5
+ declare const logoutAction: (_formData: FormData) => Promise<void>;
6
+
7
+ export { logoutAction };
@@ -0,0 +1,189 @@
1
+ 'use strict';
2
+
3
+ var headers = require('next/headers');
4
+ var navigation = require('next/navigation');
5
+
6
+ /**
7
+ * Enterprise Portal Components
8
+ * This file is generated by tsup. Do not edit manually.
9
+ */
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
15
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
16
+ }) : x)(function(x) {
17
+ if (typeof require !== "undefined") return require.apply(this, arguments);
18
+ throw Error('Dynamic require of "' + x + '" is not supported');
19
+ });
20
+ var __esm = (fn, res) => function __init() {
21
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
22
+ };
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+
37
+ // datadog/tracer.ts
38
+ var tracer_exports = {};
39
+ __export(tracer_exports, {
40
+ default: () => tracer_default
41
+ });
42
+ var rawFlag, isEnabled, tracer, getRoutePattern, tracer_default;
43
+ var init_tracer = __esm({
44
+ "datadog/tracer.ts"() {
45
+ rawFlag = String(process.env.USE_DATADOG_APM || "").toLowerCase();
46
+ isEnabled = rawFlag === "true";
47
+ process.env.DD_TRACE_ENABLED = isEnabled ? "1" : "0";
48
+ tracer = null;
49
+ if (isEnabled) {
50
+ const serviceName = process.env.DD_SERVICE || "enterprise-portal";
51
+ const environment = process.env.DD_ENV || process.env.NODE_ENV || "development";
52
+ const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || "0.0.0-dev";
53
+ const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || "127.0.0.1";
54
+ const agentPort = process.env.DD_TRACE_AGENT_PORT || "8126";
55
+ process.env.DD_SERVICE = serviceName;
56
+ process.env.DD_ENV = environment;
57
+ {
58
+ process.env.DD_VERSION = version;
59
+ }
60
+ process.env.DD_AGENT_HOST = agentHost;
61
+ process.env.DD_TRACE_AGENT_PORT = agentPort;
62
+ const dbmPropagationMode = process.env.DD_DBM_PROPAGATION_MODE || "full";
63
+ process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
64
+ try {
65
+ const ddTrace = __require("dd-trace");
66
+ tracer = ddTrace.init({
67
+ service: serviceName,
68
+ env: environment,
69
+ version,
70
+ logInjection: true,
71
+ runtimeMetrics: true,
72
+ appsec: false,
73
+ profiling: false,
74
+ startupLogs: true
75
+ // Enable for debugging
76
+ });
77
+ console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
78
+ tracer.use("dns", false);
79
+ tracer.use("net", false);
80
+ tracer.use("http", {
81
+ server: {
82
+ hooks: {
83
+ request: (span, req) => {
84
+ if (!span) return;
85
+ const url = req?.url || "";
86
+ const method = req?.method || "GET";
87
+ const path = url.split("?")[0];
88
+ if (path.startsWith("/_next/")) {
89
+ span.context()._trace.isRecording = false;
90
+ return;
91
+ }
92
+ const routePattern = getRoutePattern(path);
93
+ span.setTag("resource.name", `${method} ${routePattern}`);
94
+ span.setTag("http.route", routePattern);
95
+ }
96
+ }
97
+ }
98
+ });
99
+ } catch (err) {
100
+ console.error("[datadog] failed to initialize tracing", err);
101
+ tracer = null;
102
+ }
103
+ }
104
+ getRoutePattern = (path) => {
105
+ const routePatterns = [
106
+ // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
107
+ { pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: "/update/instance/[instanceId]$1" }
108
+ ];
109
+ for (const { pattern, replacement } of routePatterns) {
110
+ if (pattern.test(path)) {
111
+ return path.replace(pattern, replacement);
112
+ }
113
+ }
114
+ return path;
115
+ };
116
+ tracer_default = tracer;
117
+ }
118
+ });
119
+
120
+ // src/utils/observability/tracing.ts
121
+ var tracerCache = void 0;
122
+ function getTracer() {
123
+ if (tracerCache !== void 0) {
124
+ return tracerCache;
125
+ }
126
+ const rawFlag2 = String(process.env.USE_DATADOG_APM || "").toLowerCase();
127
+ const isEnabled2 = rawFlag2 === "true";
128
+ if (!isEnabled2) {
129
+ tracerCache = null;
130
+ return null;
131
+ }
132
+ try {
133
+ const tracerModule = (init_tracer(), __toCommonJS(tracer_exports));
134
+ const tracer2 = tracerModule.default || tracerModule;
135
+ if (tracer2 && typeof tracer2.trace === "function") {
136
+ tracerCache = tracer2;
137
+ return tracerCache;
138
+ }
139
+ } catch (err) {
140
+ console.warn("Failed to load tracer:", err);
141
+ }
142
+ tracerCache = null;
143
+ return null;
144
+ }
145
+ async function withTrace(name, fn) {
146
+ const activeTracer = getTracer();
147
+ if (!activeTracer) {
148
+ return fn(void 0);
149
+ }
150
+ return activeTracer.trace(name, async (span) => {
151
+ if (span) {
152
+ span.setTag("component", "application");
153
+ }
154
+ try {
155
+ const result = await fn(span);
156
+ return result;
157
+ } catch (error) {
158
+ if (span) {
159
+ span.setTag("error", error);
160
+ }
161
+ throw error;
162
+ }
163
+ });
164
+ }
165
+ function traceServerAction(name, fn) {
166
+ const spanName = name.startsWith("server.action.") ? name : `server.action.${name}`;
167
+ const traced = async (...args) => {
168
+ return withTrace(spanName, async (span) => {
169
+ if (span) {
170
+ span.setTag("component", "server-action");
171
+ }
172
+ const result = await fn(...args);
173
+ return result;
174
+ });
175
+ };
176
+ return traced;
177
+ }
178
+
179
+ // src/actions/logout.ts
180
+ async function logoutActionImpl(_formData) {
181
+ const cookieStore = await headers.cookies();
182
+ cookieStore.delete("portal_session");
183
+ navigation.redirect("/");
184
+ }
185
+ var logoutAction = traceServerAction("logoutAction", logoutActionImpl);
186
+
187
+ exports.logoutAction = logoutAction;
188
+ //# sourceMappingURL=logout-action.js.map
189
+ //# 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","cookies","redirect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAGM,OAAA,EACA,SAAA,EAIF,MAAA,EA2EE,eAAA,EAiBC,cAAA;AApGP,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAGA,IAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAE,EAAE,WAAA,EAAY;AACtE,IAAM,YAAY,OAAA,KAAY,MAAA;AAE9B,IAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,GAAmB,SAAA,GAAY,GAAA,GAAM,GAAA;AAEjD,IAAI,MAAA,GAAwB,IAAA;AAE5B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,mBAAA;AAC9C,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,IAAI,QAAA,IAAY,aAAA;AAClE,MAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,OAAA,CAAQ,IAAI,mBAAA,IAAuB,WAAA;AAE7E,MAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB,OAAA,CAAQ,IAAI,kBAAA,IAAsB,WAAA;AACjF,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,mBAAA,IAAuB,MAAA;AAErD,MAAA,OAAA,CAAQ,IAAI,UAAA,GAAa,WAAA;AACzB,MAAA,OAAA,CAAQ,IAAI,MAAA,GAAS,WAAA;AACrB,MAAa;AACX,QAAA,OAAA,CAAQ,IAAI,UAAA,GAAa,OAAA;AAAA,MAC3B;AACA,MAAA,OAAA,CAAQ,IAAI,aAAA,GAAgB,SAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,mBAAA,GAAsB,SAAA;AAElC,MAAA,MAAM,kBAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,uBAAA,IAA2B,MAAA;AAEnE,MAAA,OAAA,CAAQ,IAAI,uBAAA,GAA0B,kBAAA;AAEtC,MAAA,IAAI;AAEF,QAAA,MAAM,OAAA,GAAU,UAAQ,UAAU,CAAA;AAClC,QAAA,MAAA,GAAU,QAAQ,IAAA,CAA4B;AAAA,UAC5C,OAAA,EAAS,WAAA;AAAA,UACT,GAAA,EAAK,WAAA;AAAA,UACL,OAAA;AAAA,UACA,YAAA,EAAc,IAAA;AAAA,UACd,cAAA,EAAgB,IAAA;AAAA,UAChB,MAAA,EAAQ,KAAA;AAAA,UACR,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa;AAAA;AAAA,SACd,CAAA;AAED,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,WAAW,CAAA,MAAA,EAAS,WAAW,CAAA,UAAA,EAAa,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAG3I,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AACvB,QAAA,MAAA,CAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AAEvB,QAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AAAA,UACjB,MAAA,EAAQ;AAAA,YACN,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,CAAC,IAAA,EAAa,GAAA,KAA0B;AAC/C,gBAAA,IAAI,CAAC,IAAA,EAAM;AAEX,gBAAA,MAAM,GAAA,GAAM,KAAK,GAAA,IAAO,EAAA;AACxB,gBAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,KAAA;AAC9B,gBAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG7B,gBAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAE9B,kBAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA,CAAO,WAAA,GAAc,KAAA;AACpC,kBAAA;AAAA,gBACF;AAEA,gBAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AAEzC,gBAAA,IAAA,CAAK,OAAO,eAAA,EAAiB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AACxD,gBAAA,IAAA,CAAK,MAAA,CAAO,cAAc,YAAY,CAAA;AAAA,cACxC;AAAA;AACF;AACF,SACD,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,GAAG,CAAA;AAC3D,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAAA,IACF;AAGA,IAAM,eAAA,GAAkB,CAAC,IAAA,KAAyB;AAEhD,MAAA,MAAM,aAAA,GAAgB;AAAA;AAAA,QAEpB,EAAE,OAAA,EAAS,iCAAA,EAAmC,WAAA,EAAa,iCAAA;AAAkC,OAC/F;AAEA,MAAA,KAAA,MAAW,EAAE,OAAA,EAAS,WAAA,EAAY,IAAK,aAAA,EAAe;AACpD,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,UAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AAAA,QAC1C;AAAA,MACF;AAGA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAEA,IAAO,cAAA,GAAQ,MAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3Ff,IAAI,WAAA,GAAyC,MAAA;AAE7C,SAAS,SAAA,GAA2B;AAElC,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,MAAMA,WAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAE,EAAE,WAAA,EAAY;AACtE,EAAA,MAAMC,aAAYD,QAAAA,KAAY,MAAA;AAE9B,EAAA,IAAI,CAACC,UAAAA,EAAW;AACd,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI;AAEF,IAAA,MAAM,YAAA,IAAe,WAAA,EAAA,EAAA,YAAA,CAAA,cAAA,CAAA,CAAA;AACrB,IAAA,MAAMC,OAAAA,GAAS,aAAa,OAAA,IAAW,YAAA;AAEvC,IAAA,IAAIA,OAAAA,IAAU,OAAQA,OAAAA,CAAe,KAAA,KAAU,UAAA,EAAY;AACzD,MAAA,WAAA,GAAcA,OAAAA;AACd,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,0BAA0B,GAAG,CAAA;AAAA,EAC5C;AAEA,EAAA,WAAA,GAAc,IAAA;AACd,EAAA,OAAO,IAAA;AACT;AAeA,eAAsB,SAAA,CACpB,MACA,EAAA,EACY;AACZ,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,OAAO,IAAA,KAAgB;AACrD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,MAAA,CAAO,aAAa,aAAa,CAAA;AAAA,IACxC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAI,CAAA;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,MAAA,CAAO,SAAS,KAAY,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,MACA,EAAA,EACmB;AACnB,EAAA,MAAM,WAAW,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,GAAI,IAAA,GAAO,iBAAiB,IAAI,CAAA,CAAA;AAEjF,EAAA,MAAM,MAAA,GAA4B,UAAU,IAAA,KAAwB;AAClE,IAAA,OAAO,SAAA,CAAU,QAAA,EAAU,OAAO,IAAA,KAAS;AACzC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,MAAA,CAAO,aAAa,eAAe,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,MAAA;AACT;;;AC/FA,eAAe,iBAAiB,SAAA,EAAoC;AAClE,EAAA,MAAM,WAAA,GAAc,MAAMC,eAAA,EAAQ;AAClC,EAAA,WAAA,CAAY,OAAO,gBAAgB,CAAA;AACnC,EAAAC,mBAAA,CAAS,GAAG,CAAA;AACd;AAMO,IAAM,YAAA,GAAe,iBAAA,CAAkB,cAAA,EAAgB,gBAAgB","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,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LogoutButtonProps {
4
+ /**
5
+ * Action ID for the logout server action.
6
+ * This should be bound on the server side before passing to this component.
7
+ */
8
+ action: (formData: FormData) => void;
9
+ }
10
+ /**
11
+ * Logout button for user menu dropdown.
12
+ * Uses red styling to indicate a destructive action.
13
+ */
14
+ declare function LogoutButton({ action }: LogoutButtonProps): react_jsx_runtime.JSX.Element;
15
+
16
+ export { LogoutButton, type LogoutButtonProps };
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LogoutButtonProps {
4
+ /**
5
+ * Action ID for the logout server action.
6
+ * This should be bound on the server side before passing to this component.
7
+ */
8
+ action: (formData: FormData) => void;
9
+ }
10
+ /**
11
+ * Logout button for user menu dropdown.
12
+ * Uses red styling to indicate a destructive action.
13
+ */
14
+ declare function LogoutButton({ action }: LogoutButtonProps): react_jsx_runtime.JSX.Element;
15
+
16
+ export { LogoutButton, type LogoutButtonProps };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ /**
8
+ * Enterprise Portal Components
9
+ * This file is generated by tsup. Do not edit manually.
10
+ */
11
+
12
+ function LogoutButton({ action }) {
13
+ const [isPending, startTransition] = react.useTransition();
14
+ const handleSubmit = (event) => {
15
+ event.preventDefault();
16
+ const formData = new FormData(event.currentTarget);
17
+ startTransition(async () => {
18
+ await action(formData);
19
+ });
20
+ };
21
+ return /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxRuntime.jsx(
22
+ "button",
23
+ {
24
+ type: "submit",
25
+ disabled: isPending,
26
+ 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",
27
+ children: isPending ? "Logging out..." : "Logout"
28
+ }
29
+ ) });
30
+ }
31
+
32
+ exports.LogoutButton = LogoutButton;
33
+ //# sourceMappingURL=logout-button.js.map
34
+ //# sourceMappingURL=logout-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/logout-button.tsx"],"names":["useTransition","jsx"],"mappings":";;;;;;;;;;AAgBO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAAsB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,eAAe,CAAA,GAAIA,mBAAA,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,uBACEC,cAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,kBAAAA,cAAA;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,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface MarkdownRendererProps {
4
+ children: string;
5
+ }
6
+ /**
7
+ * Simple wrapper around ReactMarkdown for rendering markdown content.
8
+ * Used for pre/post-install instructions in the installation wizard.
9
+ */
10
+ declare function MarkdownRenderer({ children }: MarkdownRendererProps): react_jsx_runtime.JSX.Element;
11
+
12
+ export { MarkdownRenderer };
@@ -0,0 +1,12 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface MarkdownRendererProps {
4
+ children: string;
5
+ }
6
+ /**
7
+ * Simple wrapper around ReactMarkdown for rendering markdown content.
8
+ * Used for pre/post-install instructions in the installation wizard.
9
+ */
10
+ declare function MarkdownRenderer({ children }: MarkdownRendererProps): react_jsx_runtime.JSX.Element;
11
+
12
+ export { MarkdownRenderer };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var ReactMarkdown = require('react-markdown');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
10
+
11
+ /**
12
+ * Enterprise Portal Components
13
+ * This file is generated by tsup. Do not edit manually.
14
+ */
15
+
16
+ function MarkdownRenderer({ children }) {
17
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "markdown-content", children: /* @__PURE__ */ jsxRuntime.jsx(ReactMarkdown__default.default, { children }) });
18
+ }
19
+
20
+ exports.MarkdownRenderer = MarkdownRenderer;
21
+ //# sourceMappingURL=markdown-renderer.js.map
22
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/markdown-renderer.tsx"],"names":["jsx","ReactMarkdown"],"mappings":";;;;;;;;;;;;;;AAYO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,cAAA,CAACC,8BAAA,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"]}
@@ -10,9 +10,9 @@ var server = require('next/server');
10
10
  function portalMiddleware(request) {
11
11
  const url = request.nextUrl;
12
12
  const pathname = url.pathname;
13
- if (pathname === "/" && url.searchParams.get("expired") === "1") {
14
- const basePath = process.env.NEXT_PUBLIC_BASE_PATH;
15
- const redirectUrl = new URL(basePath || "/", request.url);
13
+ if (url.searchParams.get("expired") === "1") {
14
+ const loginPath = process.env.NEXT_PUBLIC_BASE_PATH ? `${process.env.NEXT_PUBLIC_BASE_PATH}/login` : "/login";
15
+ const redirectUrl = new URL(loginPath, request.url);
16
16
  const response = server.NextResponse.redirect(redirectUrl);
17
17
  response.cookies.delete("portal_session");
18
18
  return response;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware.ts"],"names":["NextResponse"],"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,GAAWA,mBAAA,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,OAAOA,mBAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAOA,oBAAa,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":["NextResponse"],"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,GAAWA,mBAAA,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,OAAOA,mBAAA,CAAa,SAAS,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAOA,oBAAa,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"]}
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Instance } from './install-actions.mjs';
3
- import { C as ChannelRelease, I as InstallOptions, S as SecurityReleaseImage, G as GetSecurityInfoDiffResult } from './index-DyzJ0yKD.mjs';
3
+ import { C as ChannelRelease, I as InstallOptions, S as SecurityReleaseImage, G as GetSecurityInfoDiffResult } from './index-JX9-CIMA.mjs';
4
4
  import './fetch-license-iTyF7_GY.mjs';
5
5
  import './actions/change-team.mjs';
6
6
  import './actions/trial-signup.mjs';
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Instance } from './install-actions.js';
3
- import { C as ChannelRelease, I as InstallOptions, S as SecurityReleaseImage, G as GetSecurityInfoDiffResult } from './index-sMbq94M7.js';
3
+ import { C as ChannelRelease, I as InstallOptions, S as SecurityReleaseImage, G as GetSecurityInfoDiffResult } from './index-DXy7RxOX.js';
4
4
  import './fetch-license-iTyF7_GY.js';
5
5
  import './actions/change-team.js';
6
6
  import './actions/trial-signup.js';
@@ -18,6 +18,7 @@ var cx__default = /*#__PURE__*/_interopDefault(cx);
18
18
 
19
19
 
20
20
  // src/utils/constants.ts
21
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
21
22
  var DEFAULT_SECONDARY_COLOR = "#6366f1";
22
23
 
23
24
  // src/utils/format.ts
@@ -271,7 +272,7 @@ function InstanceCard({
271
272
  channelReleases = [],
272
273
  installOptions = [],
273
274
  onUpdateClick,
274
- primaryColor = DEFAULT_SECONDARY_COLOR,
275
+ primaryColor = DEFAULT_PRIMARY_COLOR,
275
276
  securityData = {},
276
277
  securityDiffData = {},
277
278
  securityEnabled = false
@@ -439,7 +440,7 @@ var OnlineInstanceList = ({
439
440
  channelReleases = [],
440
441
  installOptions = [],
441
442
  onUpdateClick,
442
- primaryColor = DEFAULT_SECONDARY_COLOR,
443
+ primaryColor = DEFAULT_PRIMARY_COLOR,
443
444
  securityData = {},
444
445
  securityDiffData = {},
445
446
  securityEnabled = false,