@replicated/portal-components 0.0.18 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/metadata/registry.json +2 -2
- package/components/metadata/registry.md +2 -2
- package/dist/actions/change-team.d.mts +10 -0
- package/dist/actions/change-team.d.ts +10 -0
- package/dist/actions/change-team.js +458 -0
- package/dist/actions/change-team.js.map +1 -0
- package/dist/actions/index.d.mts +4 -1
- package/dist/actions/index.d.ts +4 -1
- package/dist/actions/index.js +1232 -430
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/install-actions.d.mts +4 -0
- package/dist/actions/install-actions.d.ts +4 -0
- package/dist/actions/install-actions.js +680 -0
- package/dist/actions/install-actions.js.map +1 -0
- package/dist/actions/service-account.d.mts +4 -0
- package/dist/actions/service-account.d.ts +4 -0
- package/dist/actions/service-account.js +373 -0
- package/dist/actions/service-account.js.map +1 -0
- package/dist/actions/support-bundles.d.mts +4 -0
- package/dist/actions/support-bundles.d.ts +4 -0
- package/dist/actions/support-bundles.js +659 -0
- package/dist/actions/support-bundles.js.map +1 -0
- package/dist/actions/team-settings.d.mts +4 -0
- package/dist/actions/team-settings.d.ts +4 -0
- package/dist/actions/team-settings.js +1040 -0
- package/dist/actions/team-settings.js.map +1 -0
- package/dist/actions/trial-signup.d.mts +24 -0
- package/dist/actions/trial-signup.d.ts +24 -0
- package/dist/actions/trial-signup.js +482 -0
- package/dist/actions/trial-signup.js.map +1 -0
- package/dist/actions/user-settings.d.mts +4 -0
- package/dist/actions/user-settings.d.ts +4 -0
- package/dist/actions/user-settings.js +621 -0
- package/dist/actions/user-settings.js.map +1 -0
- package/dist/airgap-instances.d.mts +4 -1
- package/dist/airgap-instances.d.ts +4 -1
- package/dist/airgap-instances.js +177 -32
- package/dist/airgap-instances.js.map +1 -1
- package/dist/branding-BsMSywts.d.mts +36 -0
- package/dist/branding-BsMSywts.d.ts +36 -0
- package/dist/error-page.js +10 -2
- package/dist/error-page.js.map +1 -1
- package/dist/error.js +10 -2
- package/dist/error.js.map +1 -1
- package/dist/esm/actions/change-team.js +455 -0
- package/dist/esm/actions/change-team.js.map +1 -0
- package/dist/esm/actions/index.js +1200 -428
- package/dist/esm/actions/index.js.map +1 -1
- package/dist/esm/actions/install-actions.js +673 -0
- package/dist/esm/actions/install-actions.js.map +1 -0
- package/dist/esm/actions/service-account.js +371 -0
- package/dist/esm/actions/service-account.js.map +1 -0
- package/dist/esm/actions/support-bundles.js +654 -0
- package/dist/esm/actions/support-bundles.js.map +1 -0
- package/dist/esm/actions/team-settings.js +1026 -0
- package/dist/esm/actions/team-settings.js.map +1 -0
- package/dist/esm/actions/trial-signup.js +478 -0
- package/dist/esm/actions/trial-signup.js.map +1 -0
- package/dist/esm/actions/user-settings.js +615 -0
- package/dist/esm/actions/user-settings.js.map +1 -0
- package/dist/esm/airgap-instances.js +176 -32
- package/dist/esm/airgap-instances.js.map +1 -1
- package/dist/esm/error-page.js +10 -2
- package/dist/esm/error-page.js.map +1 -1
- package/dist/esm/error.js +10 -2
- package/dist/esm/error.js.map +1 -1
- package/dist/esm/helm-install-wizard.js +127 -81
- package/dist/esm/helm-install-wizard.js.map +1 -1
- package/dist/esm/index.js +706 -438
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install-actions.js +40 -5
- package/dist/esm/install-actions.js.map +1 -1
- package/dist/esm/install-card.js +9 -6
- package/dist/esm/install-card.js.map +1 -1
- package/dist/esm/install-targets.js +9 -2
- package/dist/esm/install-targets.js.map +1 -1
- package/dist/esm/instance-card.js +175 -31
- package/dist/esm/instance-card.js.map +1 -1
- package/dist/esm/join-team.js +9 -3
- package/dist/esm/join-team.js.map +1 -1
- package/dist/esm/license-card.js +24 -22
- package/dist/esm/license-card.js.map +1 -1
- package/dist/esm/license-details.js +128 -334
- package/dist/esm/license-details.js.map +1 -1
- package/dist/esm/linux-install-wizard.js +219 -133
- package/dist/esm/linux-install-wizard.js.map +1 -1
- package/dist/esm/login.js +20 -4
- package/dist/esm/login.js.map +1 -1
- package/dist/esm/middleware.js +33 -0
- package/dist/esm/middleware.js.map +1 -0
- package/dist/esm/online-instance-list.js +176 -32
- package/dist/esm/online-instance-list.js.map +1 -1
- package/dist/esm/pending-installations.js +4 -3
- package/dist/esm/pending-installations.js.map +1 -1
- package/dist/esm/release-history-panel.js +27 -14
- package/dist/esm/release-history-panel.js.map +1 -1
- package/dist/esm/saml-callback-client.js +82 -0
- package/dist/esm/saml-callback-client.js.map +1 -0
- package/dist/esm/saml-handlers.js +138 -0
- package/dist/esm/saml-handlers.js.map +1 -0
- package/dist/esm/security-card.js +53 -38
- package/dist/esm/security-card.js.map +1 -1
- package/dist/esm/service-accounts-tab.js +800 -0
- package/dist/esm/service-accounts-tab.js.map +1 -0
- package/dist/esm/support-bundle-collection-card.js +55 -25
- package/dist/esm/support-bundle-collection-card.js.map +1 -1
- package/dist/esm/support-bundles-card.js +10 -5
- package/dist/esm/support-bundles-card.js.map +1 -1
- package/dist/esm/support-card.js +37 -5
- package/dist/esm/support-card.js.map +1 -1
- package/dist/esm/team-selection.js +5 -1
- package/dist/esm/team-selection.js.map +1 -1
- package/dist/esm/team-settings-card.js +5 -2
- package/dist/esm/team-settings-card.js.map +1 -1
- package/dist/esm/team-settings.js +7 -2
- package/dist/esm/team-settings.js.map +1 -1
- package/dist/esm/top-nav-user-menu.js +5 -1
- package/dist/esm/top-nav-user-menu.js.map +1 -1
- package/dist/esm/top-nav.js +175 -62
- package/dist/esm/top-nav.js.map +1 -1
- package/dist/esm/trial-signup.js +256 -0
- package/dist/esm/trial-signup.js.map +1 -0
- package/dist/esm/update-layout.js +175 -62
- package/dist/esm/update-layout.js.map +1 -1
- package/dist/esm/updates-card.js +15 -4
- package/dist/esm/updates-card.js.map +1 -1
- package/dist/esm/upload-support-bundle-modal.js +9 -4
- package/dist/esm/upload-support-bundle-modal.js.map +1 -1
- package/dist/esm/user-settings-card.js +5 -2
- package/dist/esm/user-settings-card.js.map +1 -1
- package/dist/esm/user-settings.js +12 -6
- package/dist/esm/user-settings.js.map +1 -1
- package/dist/esm/utils/index.js +204 -13
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/fetch-license-iTyF7_GY.d.mts +81 -0
- package/dist/fetch-license-iTyF7_GY.d.ts +81 -0
- package/dist/helm-install-wizard.d.mts +12 -3
- package/dist/helm-install-wizard.d.ts +12 -3
- package/dist/helm-install-wizard.js +127 -81
- package/dist/helm-install-wizard.js.map +1 -1
- package/dist/{index-DkjaogsF.d.ts → index-DyzJ0yKD.d.mts} +194 -49
- package/dist/{index-DkjaogsF.d.mts → index-sMbq94M7.d.ts} +194 -49
- package/dist/index.d.mts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +726 -438
- package/dist/index.js.map +1 -1
- package/dist/install-actions.d.mts +5 -2
- package/dist/install-actions.d.ts +5 -2
- package/dist/install-actions.js +40 -5
- package/dist/install-actions.js.map +1 -1
- package/dist/install-card.d.mts +2 -2
- package/dist/install-card.d.ts +2 -2
- package/dist/install-card.js +9 -6
- package/dist/install-card.js.map +1 -1
- package/dist/install-targets.js +9 -2
- package/dist/install-targets.js.map +1 -1
- package/dist/instance-card.d.mts +4 -1
- package/dist/instance-card.d.ts +4 -1
- package/dist/instance-card.js +176 -31
- package/dist/instance-card.js.map +1 -1
- package/dist/join-team.js +9 -3
- package/dist/join-team.js.map +1 -1
- package/dist/license-card.d.mts +2 -2
- package/dist/license-card.d.ts +2 -2
- package/dist/license-card.js +24 -22
- package/dist/license-card.js.map +1 -1
- package/dist/license-details.js +128 -334
- package/dist/license-details.js.map +1 -1
- package/dist/linux-install-wizard.d.mts +12 -6
- package/dist/linux-install-wizard.d.ts +12 -6
- package/dist/linux-install-wizard.js +219 -133
- package/dist/linux-install-wizard.js.map +1 -1
- package/dist/login.d.mts +4 -0
- package/dist/login.d.ts +4 -0
- package/dist/login.js +20 -4
- package/dist/login.js.map +1 -1
- package/dist/middleware.d.mts +13 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.js +35 -0
- package/dist/middleware.js.map +1 -0
- package/dist/online-instance-list.d.mts +4 -1
- package/dist/online-instance-list.d.ts +4 -1
- package/dist/online-instance-list.js +177 -32
- package/dist/online-instance-list.js.map +1 -1
- package/dist/pending-installations.d.mts +8 -3
- package/dist/pending-installations.d.ts +8 -3
- package/dist/pending-installations.js +4 -3
- package/dist/pending-installations.js.map +1 -1
- package/dist/release-history-panel.js +27 -14
- package/dist/release-history-panel.js.map +1 -1
- package/dist/saml-callback-client.d.mts +36 -0
- package/dist/saml-callback-client.d.ts +36 -0
- package/dist/saml-callback-client.js +88 -0
- package/dist/saml-callback-client.js.map +1 -0
- package/dist/saml-handlers.d.mts +50 -0
- package/dist/saml-handlers.d.ts +50 -0
- package/dist/saml-handlers.js +141 -0
- package/dist/saml-handlers.js.map +1 -0
- package/dist/security-card.d.mts +4 -1
- package/dist/security-card.d.ts +4 -1
- package/dist/security-card.js +53 -38
- package/dist/security-card.js.map +1 -1
- package/dist/service-accounts-tab.d.mts +51 -0
- package/dist/service-accounts-tab.d.ts +51 -0
- package/dist/service-accounts-tab.js +802 -0
- package/dist/service-accounts-tab.js.map +1 -0
- package/dist/styles.css +380 -143
- package/dist/support-bundle-collection-card.d.mts +1 -1
- package/dist/support-bundle-collection-card.d.ts +1 -1
- package/dist/support-bundle-collection-card.js +54 -24
- package/dist/support-bundle-collection-card.js.map +1 -1
- package/dist/support-bundles-card.d.mts +5 -2
- package/dist/support-bundles-card.d.ts +5 -2
- package/dist/support-bundles-card.js +10 -5
- package/dist/support-bundles-card.js.map +1 -1
- package/dist/support-card.js +37 -5
- package/dist/support-card.js.map +1 -1
- package/dist/team-selection.js +5 -1
- package/dist/team-selection.js.map +1 -1
- package/dist/team-settings-card.js +5 -2
- package/dist/team-settings-card.js.map +1 -1
- package/dist/team-settings.js +7 -2
- package/dist/team-settings.js.map +1 -1
- package/dist/{top-nav-IRIn66wS.d.ts → top-nav-BUQAGoG1.d.mts} +14 -2
- package/dist/{top-nav-IRIn66wS.d.mts → top-nav-CEqw0KpO.d.ts} +14 -2
- package/dist/top-nav-user-menu.js +5 -1
- package/dist/top-nav-user-menu.js.map +1 -1
- package/dist/top-nav.d.mts +2 -1
- package/dist/top-nav.d.ts +2 -1
- package/dist/top-nav.js +175 -62
- package/dist/top-nav.js.map +1 -1
- package/dist/trial-signup.d.mts +31 -0
- package/dist/trial-signup.d.ts +31 -0
- package/dist/trial-signup.js +258 -0
- package/dist/trial-signup.js.map +1 -0
- package/dist/update-layout.js +175 -62
- package/dist/update-layout.js.map +1 -1
- package/dist/updates-card.js +15 -4
- package/dist/updates-card.js.map +1 -1
- package/dist/upload-support-bundle-modal.js +9 -4
- package/dist/upload-support-bundle-modal.js.map +1 -1
- package/dist/user-settings-card.js +5 -2
- package/dist/user-settings-card.js.map +1 -1
- package/dist/user-settings.js +12 -6
- package/dist/user-settings.js.map +1 -1
- package/dist/utils/index.d.mts +74 -16
- package/dist/utils/index.d.ts +74 -16
- package/dist/utils/index.js +215 -12
- package/dist/utils/index.js.map +1 -1
- package/package.json +67 -1
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { cookies } from 'next/headers';
|
|
3
|
+
import { Buffer } from 'buffer';
|
|
4
|
+
import { cache } from 'react';
|
|
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/utils/api-client.ts
|
|
180
|
+
async function authenticatedFetch(url, options = {}) {
|
|
181
|
+
const { token, ...fetchOptions } = options;
|
|
182
|
+
const headers = new Headers(fetchOptions.headers);
|
|
183
|
+
if (token) {
|
|
184
|
+
headers.set("authorization", `Bearer ${token}`);
|
|
185
|
+
}
|
|
186
|
+
const response = await fetch(url, {
|
|
187
|
+
...fetchOptions,
|
|
188
|
+
headers
|
|
189
|
+
});
|
|
190
|
+
if (response.status === 401) {
|
|
191
|
+
await handle401();
|
|
192
|
+
}
|
|
193
|
+
if (response.status === 502 || response.status === 503 || response.status === 504) {
|
|
194
|
+
await handleServerError(response.status);
|
|
195
|
+
}
|
|
196
|
+
return response;
|
|
197
|
+
}
|
|
198
|
+
async function handle401() {
|
|
199
|
+
const { redirect } = await import('next/navigation');
|
|
200
|
+
return redirect("/?expired=1");
|
|
201
|
+
}
|
|
202
|
+
function isErrorPage(url) {
|
|
203
|
+
try {
|
|
204
|
+
const urlObj = new URL(url);
|
|
205
|
+
return urlObj.pathname === "/error";
|
|
206
|
+
} catch {
|
|
207
|
+
return url === "/error" || url.startsWith("/error?");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function handleServerError(statusCode) {
|
|
211
|
+
const { redirect } = await import('next/navigation');
|
|
212
|
+
const { cookies: cookies2 } = await import('next/headers');
|
|
213
|
+
let sourceUrl;
|
|
214
|
+
try {
|
|
215
|
+
const { headers } = await import('next/headers');
|
|
216
|
+
const headersList = await headers();
|
|
217
|
+
const referer = headersList.get("referer");
|
|
218
|
+
const host = headersList.get("host");
|
|
219
|
+
const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
|
|
220
|
+
if (referer && !isErrorPage(referer)) {
|
|
221
|
+
sourceUrl = referer;
|
|
222
|
+
} else if (host && pathname) {
|
|
223
|
+
const protocol = headersList.get("x-forwarded-proto") || "https";
|
|
224
|
+
sourceUrl = `${protocol}://${host}${pathname}`;
|
|
225
|
+
}
|
|
226
|
+
if (!sourceUrl || isErrorPage(sourceUrl)) {
|
|
227
|
+
const cookieStore = await cookies2();
|
|
228
|
+
const preservedSource = cookieStore.get("portal_error_source");
|
|
229
|
+
if (preservedSource?.value) {
|
|
230
|
+
sourceUrl = decodeURIComponent(preservedSource.value);
|
|
231
|
+
cookieStore.delete("portal_error_source");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} catch (error) {
|
|
235
|
+
console.debug("[portal-components] Could not determine source URL", error);
|
|
236
|
+
}
|
|
237
|
+
const params = new URLSearchParams({ code: String(statusCode) });
|
|
238
|
+
if (sourceUrl) {
|
|
239
|
+
params.set("source", sourceUrl);
|
|
240
|
+
}
|
|
241
|
+
return redirect(`/error?${params.toString()}`);
|
|
242
|
+
}
|
|
243
|
+
var getApiOrigin = () => {
|
|
244
|
+
return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
|
|
245
|
+
};
|
|
246
|
+
var fetchCustomBrandingImpl = async () => {
|
|
247
|
+
const appSlug = process.env.PORTAL_APP_SLUG;
|
|
248
|
+
if (!appSlug) {
|
|
249
|
+
throw new Error("PORTAL_APP_SLUG is not configured");
|
|
250
|
+
}
|
|
251
|
+
const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
|
|
252
|
+
appSlug
|
|
253
|
+
)}`;
|
|
254
|
+
if (process.env.NODE_ENV !== "production") {
|
|
255
|
+
console.debug(
|
|
256
|
+
"[portal-components] fetching custom branding via %s (Enterprise Portal API)",
|
|
257
|
+
url
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
const response = await fetch(url, {
|
|
261
|
+
headers: {
|
|
262
|
+
accept: "application/json"
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
if (!response.ok) {
|
|
266
|
+
throw new Error(
|
|
267
|
+
`Custom branding request failed (${response.status} ${response.statusText})`
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
const payload = await response.json();
|
|
271
|
+
const brandingObject = {
|
|
272
|
+
logo: payload.logoUrl,
|
|
273
|
+
title: payload.title,
|
|
274
|
+
primaryColor: payload.primaryColor,
|
|
275
|
+
secondaryColor: payload.secondaryColor,
|
|
276
|
+
favicon: payload.faviconUrl,
|
|
277
|
+
supportPortalLink: payload.supportPortalLink || "",
|
|
278
|
+
background: payload.background,
|
|
279
|
+
backgroundImage: payload.backgroundImage,
|
|
280
|
+
customColor1: payload.customColor1,
|
|
281
|
+
customColor2: payload.customColor2
|
|
282
|
+
};
|
|
283
|
+
const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
|
|
284
|
+
return {
|
|
285
|
+
brandingData,
|
|
286
|
+
documentation: null
|
|
287
|
+
// Documentation not included in new API's public endpoint
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
cache(fetchCustomBrandingImpl);
|
|
291
|
+
async function listReleasesImpl() {
|
|
292
|
+
const { cookies: cookies2 } = await import('next/headers');
|
|
293
|
+
const sessionStore = await cookies2();
|
|
294
|
+
const session = sessionStore.get("portal_session");
|
|
295
|
+
const token = session?.value;
|
|
296
|
+
if (!token) {
|
|
297
|
+
throw new Error("List releases requires a session token");
|
|
298
|
+
}
|
|
299
|
+
const endpoint = `${getApiOrigin()}/enterprise-portal/releases`;
|
|
300
|
+
if (process.env.NODE_ENV !== "production") {
|
|
301
|
+
console.debug("[portal-components] fetching releases via %s (Enterprise Portal API)", endpoint);
|
|
302
|
+
}
|
|
303
|
+
const response = await authenticatedFetch(endpoint, {
|
|
304
|
+
method: "GET",
|
|
305
|
+
token,
|
|
306
|
+
headers: {
|
|
307
|
+
accept: "application/json"
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
if (!response.ok) {
|
|
311
|
+
throw new Error(
|
|
312
|
+
`List releases request failed (${response.status} ${response.statusText})`
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
const envelope = await response.json();
|
|
316
|
+
const data = envelope.data;
|
|
317
|
+
return {
|
|
318
|
+
releases: Array.isArray(data?.releases) ? data.releases : [],
|
|
319
|
+
totalCount: data?.totalCount || 0
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
traceServerAction("listReleases", listReleasesImpl);
|
|
323
|
+
|
|
324
|
+
// src/actions/install.ts
|
|
325
|
+
async function fetchChannelReleases(input, context) {
|
|
326
|
+
const { token, channelId } = input;
|
|
327
|
+
if (!token || typeof token !== "string") {
|
|
328
|
+
throw new Error("fetchChannelReleases requires a session token");
|
|
329
|
+
}
|
|
330
|
+
const origin = getApiOrigin();
|
|
331
|
+
const url = new URL(`${origin}/enterprise-portal/channel-releases`);
|
|
332
|
+
if (channelId) {
|
|
333
|
+
url.searchParams.set("channel_id", channelId);
|
|
334
|
+
}
|
|
335
|
+
if (process.env.NODE_ENV !== "production") {
|
|
336
|
+
console.debug("[portal-components] fetching channel releases via %s (Enterprise Portal API)", url.toString());
|
|
337
|
+
}
|
|
338
|
+
const response = await authenticatedFetch(url.toString(), {
|
|
339
|
+
method: "GET",
|
|
340
|
+
token,
|
|
341
|
+
headers: {
|
|
342
|
+
accept: "application/json"
|
|
343
|
+
},
|
|
344
|
+
signal: context?.signal
|
|
345
|
+
});
|
|
346
|
+
if (!response.ok) {
|
|
347
|
+
const errorText = await response.text();
|
|
348
|
+
throw new Error(
|
|
349
|
+
`Channel releases request failed (${response.status} ${response.statusText}): ${errorText}`
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
const envelope = await response.json();
|
|
353
|
+
const payload = envelope.data;
|
|
354
|
+
return {
|
|
355
|
+
channelReleases: payload?.channelReleases || []
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
async function createInstallOptions(input, context) {
|
|
359
|
+
const {
|
|
360
|
+
token,
|
|
361
|
+
installType,
|
|
362
|
+
instanceName,
|
|
363
|
+
serviceAccountId,
|
|
364
|
+
networkAvailability,
|
|
365
|
+
isMultiNode = false,
|
|
366
|
+
channelId,
|
|
367
|
+
channelReleaseSequence,
|
|
368
|
+
registryAvailability,
|
|
369
|
+
kubernetesDistribution
|
|
370
|
+
} = input;
|
|
371
|
+
if (!token || typeof token !== "string") {
|
|
372
|
+
throw new Error("createInstallOptions requires a session token");
|
|
373
|
+
}
|
|
374
|
+
if (!instanceName?.trim()) {
|
|
375
|
+
throw new Error("Instance name is required");
|
|
376
|
+
}
|
|
377
|
+
if (!serviceAccountId?.trim()) {
|
|
378
|
+
throw new Error("Service account ID is required");
|
|
379
|
+
}
|
|
380
|
+
const origin = getApiOrigin();
|
|
381
|
+
const endpoint = `${origin}/enterprise-portal/install-options?includeInstructions=true`;
|
|
382
|
+
const body = {
|
|
383
|
+
install_type: installType,
|
|
384
|
+
instance_name: instanceName.trim(),
|
|
385
|
+
service_account_id: serviceAccountId.trim(),
|
|
386
|
+
network_availability: networkAvailability,
|
|
387
|
+
is_multi_node: isMultiNode
|
|
388
|
+
};
|
|
389
|
+
if (channelId) {
|
|
390
|
+
body.channel_id = channelId;
|
|
391
|
+
}
|
|
392
|
+
if (channelReleaseSequence !== void 0) {
|
|
393
|
+
body.channel_release_sequence = channelReleaseSequence;
|
|
394
|
+
}
|
|
395
|
+
if (registryAvailability) {
|
|
396
|
+
body.registry_availability = registryAvailability;
|
|
397
|
+
}
|
|
398
|
+
if (kubernetesDistribution) {
|
|
399
|
+
body.kubernetes_distribution = kubernetesDistribution;
|
|
400
|
+
}
|
|
401
|
+
if (process.env.NODE_ENV !== "production") {
|
|
402
|
+
console.debug("[portal-components] creating install options via %s", endpoint);
|
|
403
|
+
}
|
|
404
|
+
const response = await authenticatedFetch(endpoint, {
|
|
405
|
+
method: "POST",
|
|
406
|
+
token,
|
|
407
|
+
headers: {
|
|
408
|
+
"content-type": "application/json",
|
|
409
|
+
accept: "application/json"
|
|
410
|
+
},
|
|
411
|
+
body: JSON.stringify(body),
|
|
412
|
+
signal: context?.signal
|
|
413
|
+
});
|
|
414
|
+
if (!response.ok) {
|
|
415
|
+
const errorText = await response.text();
|
|
416
|
+
throw new Error(
|
|
417
|
+
`Create install options failed (${response.status} ${response.statusText}): ${errorText}`
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
return await response.json();
|
|
421
|
+
}
|
|
422
|
+
async function getInstallOptions(input, context) {
|
|
423
|
+
const {
|
|
424
|
+
token,
|
|
425
|
+
installOptionsId,
|
|
426
|
+
includeInstructions = true,
|
|
427
|
+
privateRegistryHostname,
|
|
428
|
+
proxyUrl
|
|
429
|
+
} = input;
|
|
430
|
+
if (!token || typeof token !== "string") {
|
|
431
|
+
throw new Error("getInstallOptions requires a session token");
|
|
432
|
+
}
|
|
433
|
+
if (!installOptionsId?.trim()) {
|
|
434
|
+
throw new Error("Install options ID is required");
|
|
435
|
+
}
|
|
436
|
+
const origin = getApiOrigin();
|
|
437
|
+
const url = new URL(`${origin}/enterprise-portal/install-options/${installOptionsId.trim()}`);
|
|
438
|
+
if (includeInstructions) {
|
|
439
|
+
url.searchParams.set("includeInstructions", "true");
|
|
440
|
+
}
|
|
441
|
+
if (privateRegistryHostname) {
|
|
442
|
+
url.searchParams.set("privateRegistryHostname", privateRegistryHostname);
|
|
443
|
+
}
|
|
444
|
+
if (proxyUrl) {
|
|
445
|
+
url.searchParams.set("proxyUrl", proxyUrl);
|
|
446
|
+
}
|
|
447
|
+
if (process.env.NODE_ENV !== "production") {
|
|
448
|
+
console.debug("[portal-components] fetching install options via %s (Enterprise Portal API)", url.toString());
|
|
449
|
+
}
|
|
450
|
+
const response = await authenticatedFetch(url.toString(), {
|
|
451
|
+
method: "GET",
|
|
452
|
+
token,
|
|
453
|
+
headers: {
|
|
454
|
+
accept: "application/json"
|
|
455
|
+
},
|
|
456
|
+
signal: context?.signal
|
|
457
|
+
});
|
|
458
|
+
if (!response.ok) {
|
|
459
|
+
const errorText = await response.text();
|
|
460
|
+
throw new Error(
|
|
461
|
+
`Get install options failed (${response.status} ${response.statusText}): ${errorText}`
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
const envelope = await response.json();
|
|
465
|
+
return envelope.data;
|
|
466
|
+
}
|
|
467
|
+
async function updateInstallOptions(input, context) {
|
|
468
|
+
const {
|
|
469
|
+
token,
|
|
470
|
+
installOptionsId,
|
|
471
|
+
installType,
|
|
472
|
+
channelId,
|
|
473
|
+
channelReleaseSequence,
|
|
474
|
+
networkAvailability,
|
|
475
|
+
registryAvailability,
|
|
476
|
+
kubernetesDistribution,
|
|
477
|
+
isMultiNode,
|
|
478
|
+
serviceAccountId,
|
|
479
|
+
adminConsoleUrl,
|
|
480
|
+
status,
|
|
481
|
+
includeInstructions = true,
|
|
482
|
+
privateRegistryHostname,
|
|
483
|
+
proxyUrl
|
|
484
|
+
} = input;
|
|
485
|
+
if (!token || typeof token !== "string") {
|
|
486
|
+
throw new Error("updateInstallOptions requires a session token");
|
|
487
|
+
}
|
|
488
|
+
if (!installOptionsId?.trim()) {
|
|
489
|
+
throw new Error("Install options ID is required");
|
|
490
|
+
}
|
|
491
|
+
const origin = getApiOrigin();
|
|
492
|
+
const url = new URL(`${origin}/enterprise-portal/install-options/${installOptionsId.trim()}`);
|
|
493
|
+
if (includeInstructions) {
|
|
494
|
+
url.searchParams.set("includeInstructions", "true");
|
|
495
|
+
}
|
|
496
|
+
if (privateRegistryHostname) {
|
|
497
|
+
url.searchParams.set("privateRegistryHostname", privateRegistryHostname);
|
|
498
|
+
}
|
|
499
|
+
if (proxyUrl) {
|
|
500
|
+
url.searchParams.set("proxyUrl", proxyUrl);
|
|
501
|
+
}
|
|
502
|
+
const body = {};
|
|
503
|
+
if (installType !== void 0) {
|
|
504
|
+
body.install_type = installType;
|
|
505
|
+
}
|
|
506
|
+
if (channelId !== void 0) {
|
|
507
|
+
body.channel_id = channelId;
|
|
508
|
+
}
|
|
509
|
+
if (channelReleaseSequence !== void 0) {
|
|
510
|
+
body.channel_release_sequence = channelReleaseSequence;
|
|
511
|
+
}
|
|
512
|
+
if (networkAvailability !== void 0) {
|
|
513
|
+
body.network_availability = networkAvailability;
|
|
514
|
+
}
|
|
515
|
+
if (registryAvailability !== void 0) {
|
|
516
|
+
body.registry_availability = registryAvailability;
|
|
517
|
+
}
|
|
518
|
+
if (kubernetesDistribution !== void 0) {
|
|
519
|
+
body.kubernetes_distribution = kubernetesDistribution;
|
|
520
|
+
}
|
|
521
|
+
if (isMultiNode !== void 0) {
|
|
522
|
+
body.is_multi_node = isMultiNode;
|
|
523
|
+
}
|
|
524
|
+
if (serviceAccountId !== void 0) {
|
|
525
|
+
body.service_account_id = serviceAccountId;
|
|
526
|
+
}
|
|
527
|
+
if (adminConsoleUrl !== void 0) {
|
|
528
|
+
body.admin_console_url = adminConsoleUrl;
|
|
529
|
+
}
|
|
530
|
+
if (status !== void 0) {
|
|
531
|
+
body.status = status;
|
|
532
|
+
}
|
|
533
|
+
if (process.env.NODE_ENV !== "production") {
|
|
534
|
+
console.debug("[portal-components] updating install options via %s", url.toString());
|
|
535
|
+
}
|
|
536
|
+
const response = await authenticatedFetch(url.toString(), {
|
|
537
|
+
method: "PATCH",
|
|
538
|
+
token,
|
|
539
|
+
headers: {
|
|
540
|
+
"content-type": "application/json",
|
|
541
|
+
accept: "application/json"
|
|
542
|
+
},
|
|
543
|
+
body: JSON.stringify(body),
|
|
544
|
+
signal: context?.signal
|
|
545
|
+
});
|
|
546
|
+
if (!response.ok) {
|
|
547
|
+
const errorText = await response.text();
|
|
548
|
+
throw new Error(
|
|
549
|
+
`Update install options failed (${response.status} ${response.statusText}): ${errorText}`
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
return await response.json();
|
|
553
|
+
}
|
|
554
|
+
async function fetchPendingInstallations(input, context) {
|
|
555
|
+
const { token } = input;
|
|
556
|
+
if (typeof token !== "string" || token.trim().length === 0) {
|
|
557
|
+
throw new Error("fetchPendingInstallations requires a non-empty token");
|
|
558
|
+
}
|
|
559
|
+
const origin = getApiOrigin();
|
|
560
|
+
const queryParams = new URLSearchParams();
|
|
561
|
+
queryParams.set("status", "in_progress");
|
|
562
|
+
queryParams.set("page_size", "5");
|
|
563
|
+
queryParams.set("order_by", "created_at");
|
|
564
|
+
queryParams.set("order_direction", "desc");
|
|
565
|
+
const endpoint = `${origin}/enterprise-portal/install-options?${queryParams.toString()}`;
|
|
566
|
+
if (process.env.NODE_ENV !== "production") {
|
|
567
|
+
console.debug("[portal-components] fetching pending installations via %s (Enterprise Portal API)", endpoint);
|
|
568
|
+
}
|
|
569
|
+
const response = await authenticatedFetch(endpoint, {
|
|
570
|
+
method: "GET",
|
|
571
|
+
token,
|
|
572
|
+
headers: {
|
|
573
|
+
accept: "application/json"
|
|
574
|
+
},
|
|
575
|
+
signal: context?.signal
|
|
576
|
+
});
|
|
577
|
+
if (!response.ok) {
|
|
578
|
+
throw new Error(
|
|
579
|
+
`Pending installations request failed (${response.status} ${response.statusText})`
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
const envelope = await response.json();
|
|
583
|
+
const payload = envelope.data;
|
|
584
|
+
const installArray = payload?.install_options || [];
|
|
585
|
+
const installations = installArray.map((item) => ({
|
|
586
|
+
id: String(item.id || ""),
|
|
587
|
+
name: String(item.instance_name || "Unknown"),
|
|
588
|
+
method: item.install_type === "helm" ? "helm" : "linux",
|
|
589
|
+
startedBy: String(item.service_account_email_address || "Unknown"),
|
|
590
|
+
startedAt: String(item.started_at || (/* @__PURE__ */ new Date()).toISOString())
|
|
591
|
+
}));
|
|
592
|
+
return {
|
|
593
|
+
installations
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
async function discardInstallation(input, context) {
|
|
597
|
+
const { token, installOptionsId } = input;
|
|
598
|
+
if (typeof token !== "string" || token.trim().length === 0) {
|
|
599
|
+
throw new Error("discardInstallation requires a non-empty token");
|
|
600
|
+
}
|
|
601
|
+
if (typeof installOptionsId !== "string" || installOptionsId.trim().length === 0) {
|
|
602
|
+
throw new Error("discardInstallation requires a non-empty installOptionsId");
|
|
603
|
+
}
|
|
604
|
+
const origin = getApiOrigin();
|
|
605
|
+
const response = await authenticatedFetch(
|
|
606
|
+
`${origin}/enterprise-portal/install-options/${installOptionsId.trim()}`,
|
|
607
|
+
{
|
|
608
|
+
method: "DELETE",
|
|
609
|
+
token,
|
|
610
|
+
headers: {
|
|
611
|
+
accept: "application/json"
|
|
612
|
+
},
|
|
613
|
+
signal: context?.signal
|
|
614
|
+
}
|
|
615
|
+
);
|
|
616
|
+
if (!response.ok) {
|
|
617
|
+
const errorText = await response.text();
|
|
618
|
+
throw new Error(
|
|
619
|
+
`Discard install options failed (${response.status} ${response.statusText}): ${errorText}`
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
return {
|
|
623
|
+
success: true
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// src/actions/install-actions.ts
|
|
628
|
+
async function fetchPendingInstallationsActionImpl() {
|
|
629
|
+
const sessionStore = await cookies();
|
|
630
|
+
const session = sessionStore.get("portal_session");
|
|
631
|
+
const token = session?.value || "";
|
|
632
|
+
if (!token) {
|
|
633
|
+
return { installations: [] };
|
|
634
|
+
}
|
|
635
|
+
return fetchPendingInstallations({ token });
|
|
636
|
+
}
|
|
637
|
+
var fetchPendingInstallationsAction = traceServerAction("fetchPendingInstallationsAction", fetchPendingInstallationsActionImpl);
|
|
638
|
+
async function fetchChannelReleasesActionImpl(token, channelId) {
|
|
639
|
+
return fetchChannelReleases({ token, channelId });
|
|
640
|
+
}
|
|
641
|
+
var fetchChannelReleasesAction = traceServerAction("fetchChannelReleasesAction", fetchChannelReleasesActionImpl);
|
|
642
|
+
async function createInstallOptionsActionImpl(input) {
|
|
643
|
+
return createInstallOptions(input);
|
|
644
|
+
}
|
|
645
|
+
var createInstallOptionsAction = traceServerAction("createInstallOptionsAction", createInstallOptionsActionImpl);
|
|
646
|
+
async function getInstallOptionsActionImpl(input) {
|
|
647
|
+
return getInstallOptions({
|
|
648
|
+
...input,
|
|
649
|
+
includeInstructions: input.includeInstructions ?? true
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
var getInstallOptionsAction = traceServerAction("getInstallOptionsAction", getInstallOptionsActionImpl);
|
|
653
|
+
async function updateInstallOptionsActionImpl(input) {
|
|
654
|
+
return updateInstallOptions({
|
|
655
|
+
...input,
|
|
656
|
+
includeInstructions: input.includeInstructions ?? true
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
var updateInstallOptionsAction = traceServerAction("updateInstallOptionsAction", updateInstallOptionsActionImpl);
|
|
660
|
+
async function discardInstallationActionImpl(installOptionsId) {
|
|
661
|
+
const sessionStore = await cookies();
|
|
662
|
+
const session = sessionStore.get("portal_session");
|
|
663
|
+
const token = session?.value || "";
|
|
664
|
+
if (!token) {
|
|
665
|
+
throw new Error("Authentication required");
|
|
666
|
+
}
|
|
667
|
+
return discardInstallation({ token, installOptionsId });
|
|
668
|
+
}
|
|
669
|
+
var discardInstallationAction = traceServerAction("discardInstallationAction", discardInstallationActionImpl);
|
|
670
|
+
|
|
671
|
+
export { createInstallOptionsAction, discardInstallationAction, fetchChannelReleasesAction, fetchPendingInstallationsAction, getInstallOptionsAction, updateInstallOptionsAction };
|
|
672
|
+
//# sourceMappingURL=install-actions.js.map
|
|
673
|
+
//# sourceMappingURL=install-actions.js.map
|