@replicated/portal-components 0.0.11 → 0.0.13

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 (81) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/datadog/tracer.d.ts +3 -0
  4. package/datadog/tracer.js +82 -0
  5. package/datadog/tracer.ts +101 -0
  6. package/dist/actions/index.d.mts +26 -4
  7. package/dist/actions/index.d.ts +26 -4
  8. package/dist/actions/index.js +171 -124
  9. package/dist/actions/index.js.map +1 -1
  10. package/dist/airgap-instances.js.map +1 -1
  11. package/dist/esm/actions/index.js +170 -124
  12. package/dist/esm/actions/index.js.map +1 -1
  13. package/dist/esm/airgap-instances.js.map +1 -1
  14. package/dist/esm/helm-install-wizard.js +15 -9
  15. package/dist/esm/helm-install-wizard.js.map +1 -1
  16. package/dist/esm/index.js +204 -158
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/install-actions.js +42 -47
  19. package/dist/esm/install-actions.js.map +1 -1
  20. package/dist/esm/install-card.js +8 -21
  21. package/dist/esm/install-card.js.map +1 -1
  22. package/dist/esm/instance-card.js.map +1 -1
  23. package/dist/esm/license-card.js +8 -12
  24. package/dist/esm/license-card.js.map +1 -1
  25. package/dist/esm/license-details.js +21 -11
  26. package/dist/esm/license-details.js.map +1 -1
  27. package/dist/esm/linux-install-wizard.js +26 -47
  28. package/dist/esm/linux-install-wizard.js.map +1 -1
  29. package/dist/esm/online-instance-list.js.map +1 -1
  30. package/dist/esm/support-card.js +22 -55
  31. package/dist/esm/support-card.js.map +1 -1
  32. package/dist/esm/team-settings-card.js +8 -13
  33. package/dist/esm/team-settings-card.js.map +1 -1
  34. package/dist/esm/top-nav.js +69 -47
  35. package/dist/esm/top-nav.js.map +1 -1
  36. package/dist/esm/update-layout.js +69 -47
  37. package/dist/esm/update-layout.js.map +1 -1
  38. package/dist/esm/updates-card.js +8 -14
  39. package/dist/esm/updates-card.js.map +1 -1
  40. package/dist/esm/utils/index.js +14 -10
  41. package/dist/esm/utils/index.js.map +1 -1
  42. package/dist/esm/utils/observability/index.js +193 -0
  43. package/dist/esm/utils/observability/index.js.map +1 -0
  44. package/dist/helm-install-wizard.js +15 -9
  45. package/dist/helm-install-wizard.js.map +1 -1
  46. package/dist/index.d.mts +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.js +203 -156
  49. package/dist/index.js.map +1 -1
  50. package/dist/install-actions.js +43 -48
  51. package/dist/install-actions.js.map +1 -1
  52. package/dist/install-card.js +8 -21
  53. package/dist/install-card.js.map +1 -1
  54. package/dist/instance-card.js.map +1 -1
  55. package/dist/license-card.js +8 -12
  56. package/dist/license-card.js.map +1 -1
  57. package/dist/license-details.js +21 -11
  58. package/dist/license-details.js.map +1 -1
  59. package/dist/linux-install-wizard.js +26 -47
  60. package/dist/linux-install-wizard.js.map +1 -1
  61. package/dist/online-instance-list.js.map +1 -1
  62. package/dist/styles.css +2 -2
  63. package/dist/support-card.js +22 -55
  64. package/dist/support-card.js.map +1 -1
  65. package/dist/team-settings-card.js +8 -13
  66. package/dist/team-settings-card.js.map +1 -1
  67. package/dist/top-nav.js +69 -47
  68. package/dist/top-nav.js.map +1 -1
  69. package/dist/update-layout.js +69 -47
  70. package/dist/update-layout.js.map +1 -1
  71. package/dist/updates-card.js +8 -14
  72. package/dist/updates-card.js.map +1 -1
  73. package/dist/utils/index.js +14 -10
  74. package/dist/utils/index.js.map +1 -1
  75. package/dist/utils/observability/index.d.mts +13 -0
  76. package/dist/utils/observability/index.d.ts +13 -0
  77. package/dist/utils/observability/index.js +198 -0
  78. package/dist/utils/observability/index.js.map +1 -0
  79. package/instrumentation.d.ts +8 -0
  80. package/instrumentation.js +22 -0
  81. package/package.json +16 -3
@@ -6,7 +6,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
6
6
  * This file is generated by tsup. Do not edit manually.
7
7
  */
8
8
 
9
- var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
9
+ var GlobeIcon = (props) => /* @__PURE__ */ jsx(
10
10
  "svg",
11
11
  {
12
12
  xmlns: "http://www.w3.org/2000/svg",
@@ -14,16 +14,14 @@ var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
14
14
  fill: "none",
15
15
  stroke: "currentColor",
16
16
  strokeWidth: 1.5,
17
+ strokeLinecap: "round",
18
+ strokeLinejoin: "round",
17
19
  "aria-hidden": "true",
18
20
  ...props,
19
- children: [
20
- /* @__PURE__ */ jsx("circle", { cx: 12, cy: 12, r: 10 }),
21
- /* @__PURE__ */ jsx("path", { d: "M2 12h20" }),
22
- /* @__PURE__ */ jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10Z" })
23
- ]
21
+ children: /* @__PURE__ */ jsx("path", { d: "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" })
24
22
  }
25
23
  );
26
- var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
24
+ var AirGapIcon = (props) => /* @__PURE__ */ jsx(
27
25
  "svg",
28
26
  {
29
27
  xmlns: "http://www.w3.org/2000/svg",
@@ -31,15 +29,11 @@ var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
31
29
  fill: "none",
32
30
  stroke: "currentColor",
33
31
  strokeWidth: 1.5,
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round",
34
34
  "aria-hidden": "true",
35
35
  ...props,
36
- children: [
37
- /* @__PURE__ */ jsx("path", { d: "m4 4 16 16" }),
38
- /* @__PURE__ */ jsx("path", { d: "M7.5 4.5a8 8 0 0 1 9 0" }),
39
- /* @__PURE__ */ jsx("path", { d: "M4.5 7.5a8 8 0 0 0 0 9" }),
40
- /* @__PURE__ */ jsx("path", { d: "M16.5 19.5a8 8 0 0 0 0-9" }),
41
- /* @__PURE__ */ jsx("path", { d: "M7 12a5 5 0 0 0 5 5" })
42
- ]
36
+ children: /* @__PURE__ */ jsx("path", { d: "M13.181 8.68a4.503 4.503 0 0 1 1.903 6.405m-9.768-2.782L3.56 14.06a4.5 4.5 0 0 0 6.364 6.365l3.129-3.129m5.614-5.615 1.757-1.757a4.5 4.5 0 0 0-6.364-6.365l-4.5 4.5c-.258.26-.479.541-.661.84m1.903 6.405a4.495 4.495 0 0 1-1.242-.88 4.483 4.483 0 0 1-1.062-1.683m6.587 2.345 5.907 5.907m-5.907-5.907L8.898 8.898M2.991 2.99 8.898 8.9" })
43
37
  }
44
38
  );
45
39
  var baseCardClass = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/updates-card.tsx"],"names":[],"mappings":"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","file":"updates-card.js","sourcesContent":["import type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst GlobeIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <circle cx={12} cy={12} r={10} />\n <path d=\"M2 12h20\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10Z\" />\n </svg>\n);\n\nconst AirGapIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m4 4 16 16\" />\n <path d=\"M7.5 4.5a8 8 0 0 1 9 0\" />\n <path d=\"M4.5 7.5a8 8 0 0 0 0 9\" />\n <path d=\"M16.5 19.5a8 8 0 0 0 0-9\" />\n <path d=\"M7 12a5 5 0 0 0 5 5\" />\n </svg>\n);\n\nconst baseCardClass =\n \"flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]\";\nconst headingClass = \"text-lg font-semibold text-gray-900\";\nconst contentClass = \"mt-4 flex-1 space-y-3\";\nconst itemClass = \"flex items-center gap-3 text-sm text-gray-600\";\nconst iconClass = \"h-5 w-5 text-gray-500\";\nconst footerClass =\n \"mt-6 flex justify-end text-sm font-semibold text-primary hover:text-primary/80\";\nconst badgeClass =\n \"ml-2 inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-blue-500 px-1.5 text-xs font-medium text-white\";\n\nexport interface UpdatesCardProps {\n /** Number of active online instances (checked in within 24 hours) */\n onlineActiveCount?: number;\n /** Number of air gap instances */\n airgapCount?: number;\n /** Number of updates available for online instances */\n onlineUpdates?: number;\n /** Number of updates available for airgap instances */\n airgapUpdates?: number;\n}\n\nconst Badge = ({ count }: { count: number }) => (\n <span className={badgeClass} aria-label={`${count} updates available`}>\n {count}\n </span>\n);\n\nexport const UpdatesCard = ({\n onlineActiveCount = 0,\n airgapCount = 0,\n onlineUpdates = 0,\n airgapUpdates = 0\n}: UpdatesCardProps) => (\n <section className={baseCardClass} aria-labelledby=\"updates-card-heading\">\n <header>\n <h2 id=\"updates-card-heading\" className={headingClass}>\n Updates\n </h2>\n </header>\n <div className={contentClass}>\n <div className={itemClass}>\n <GlobeIcon className={iconClass} />\n <span>\n {onlineActiveCount} Active Online {onlineActiveCount === 1 ? \"instance\" : \"instances\"}\n </span>\n {onlineUpdates > 0 && <Badge count={onlineUpdates} />}\n </div>\n <div className={itemClass}>\n <AirGapIcon className={iconClass} />\n <span>\n {airgapCount} Air gap {airgapCount === 1 ? \"instance\" : \"instances\"}\n </span>\n {airgapUpdates > 0 && <Badge count={airgapUpdates} />}\n </div>\n </div>\n <footer className={footerClass}>\n <Link href=\"/update\">View updates →</Link>\n </footer>\n </section>\n);\n\nUpdatesCard.displayName = \"UpdatesCard\";\n"]}
1
+ {"version":3,"sources":["../../src/components/updates-card.tsx"],"names":[],"mappings":"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","file":"updates-card.js","sourcesContent":["import type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst GlobeIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418\" />\n </svg>\n);\n\nconst AirGapIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M13.181 8.68a4.503 4.503 0 0 1 1.903 6.405m-9.768-2.782L3.56 14.06a4.5 4.5 0 0 0 6.364 6.365l3.129-3.129m5.614-5.615 1.757-1.757a4.5 4.5 0 0 0-6.364-6.365l-4.5 4.5c-.258.26-.479.541-.661.84m1.903 6.405a4.495 4.495 0 0 1-1.242-.88 4.483 4.483 0 0 1-1.062-1.683m6.587 2.345 5.907 5.907m-5.907-5.907L8.898 8.898M2.991 2.99 8.898 8.9\" />\n </svg>\n);\n\nconst baseCardClass =\n \"flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]\";\nconst headingClass = \"text-lg font-semibold text-gray-900\";\nconst contentClass = \"mt-4 flex-1 space-y-3\";\nconst itemClass = \"flex items-center gap-3 text-sm text-gray-600\";\nconst iconClass = \"h-5 w-5 text-gray-500\";\nconst footerClass =\n \"mt-6 flex justify-end text-sm font-semibold text-primary hover:text-primary/80\";\nconst badgeClass =\n \"ml-2 inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-blue-500 px-1.5 text-xs font-medium text-white\";\n\nexport interface UpdatesCardProps {\n /** Number of active online instances (checked in within 24 hours) */\n onlineActiveCount?: number;\n /** Number of air gap instances */\n airgapCount?: number;\n /** Number of updates available for online instances */\n onlineUpdates?: number;\n /** Number of updates available for airgap instances */\n airgapUpdates?: number;\n}\n\nconst Badge = ({ count }: { count: number }) => (\n <span className={badgeClass} aria-label={`${count} updates available`}>\n {count}\n </span>\n);\n\nexport const UpdatesCard = ({\n onlineActiveCount = 0,\n airgapCount = 0,\n onlineUpdates = 0,\n airgapUpdates = 0\n}: UpdatesCardProps) => (\n <section className={baseCardClass} aria-labelledby=\"updates-card-heading\">\n <header>\n <h2 id=\"updates-card-heading\" className={headingClass}>\n Updates\n </h2>\n </header>\n <div className={contentClass}>\n <div className={itemClass}>\n <GlobeIcon className={iconClass} />\n <span>\n {onlineActiveCount} Active Online {onlineActiveCount === 1 ? \"instance\" : \"instances\"}\n </span>\n {onlineUpdates > 0 && <Badge count={onlineUpdates} />}\n </div>\n <div className={itemClass}>\n <AirGapIcon className={iconClass} />\n <span>\n {airgapCount} Air gap {airgapCount === 1 ? \"instance\" : \"instances\"}\n </span>\n {airgapUpdates > 0 && <Badge count={airgapUpdates} />}\n </div>\n </div>\n <footer className={footerClass}>\n <Link href=\"/update\">View updates →</Link>\n </footer>\n </section>\n);\n\nUpdatesCard.displayName = \"UpdatesCard\";\n"]}
@@ -103,12 +103,12 @@ var fetchCustomBrandingImpl = async () => {
103
103
  if (!appSlug) {
104
104
  throw new Error("PORTAL_APP_SLUG is not configured");
105
105
  }
106
- const url = `${getApiOrigin()}/v3/custom-branding?app_slug=${encodeURIComponent(
106
+ const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
107
107
  appSlug
108
108
  )}`;
109
109
  if (process.env.NODE_ENV !== "production") {
110
110
  console.debug(
111
- "[portal-components] fetching custom branding via %s",
111
+ "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
112
112
  url
113
113
  );
114
114
  }
@@ -123,13 +123,18 @@ var fetchCustomBrandingImpl = async () => {
123
123
  );
124
124
  }
125
125
  const payload = await response.json();
126
- const brandingData = payload?.branding_data;
127
- if (typeof brandingData !== "string") {
128
- throw new Error("Custom branding response missing branding_data string");
129
- }
126
+ const brandingObject = {
127
+ logo: payload.logoUrl,
128
+ title: payload.appName,
129
+ customColor1: payload.primaryColor,
130
+ customColor2: payload.secondaryColor,
131
+ favicon: payload.faviconUrl
132
+ };
133
+ const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
130
134
  return {
131
135
  brandingData,
132
- documentation: payload?.documentation ?? null
136
+ documentation: null
137
+ // Documentation not included in new API's public endpoint
133
138
  };
134
139
  };
135
140
  cache(fetchCustomBrandingImpl);
@@ -140,10 +145,9 @@ async function validateSession(token) {
140
145
  return false;
141
146
  }
142
147
  try {
143
- const endpoint = `${getApiOrigin()}/v3/license`;
148
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user`;
144
149
  const response = await fetch(endpoint, {
145
- method: "HEAD",
146
- // Use HEAD to avoid downloading response body
150
+ method: "GET",
147
151
  headers: {
148
152
  authorization: `Bearer ${token}`
149
153
  },