@burdenoff/microfe-devportal 2026.916.8 → 2026.917.2

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 (35) hide show
  1. package/dist/devportal/components/ManifestViewer.d.ts +12 -0
  2. package/dist/devportal/components/ManifestViewer.d.ts.map +1 -0
  3. package/dist/devportal/components/ManifestViewer.js +58 -0
  4. package/dist/devportal/components/ManifestViewer.js.map +1 -0
  5. package/dist/devportal/components/index.d.ts +1 -0
  6. package/dist/devportal/components/index.d.ts.map +1 -1
  7. package/dist/devportal/components/index.js +1 -0
  8. package/dist/devportal/hooks/index.d.ts +1 -0
  9. package/dist/devportal/hooks/index.d.ts.map +1 -1
  10. package/dist/devportal/hooks/index.js +1 -0
  11. package/dist/devportal/hooks/useProducts.d.ts +18 -0
  12. package/dist/devportal/hooks/useProducts.d.ts.map +1 -0
  13. package/dist/devportal/hooks/useProducts.js +14 -0
  14. package/dist/devportal/hooks/useProducts.js.map +1 -0
  15. package/dist/devportal/pages/AdminReviewPage.d.ts.map +1 -1
  16. package/dist/devportal/pages/AdminReviewPage.js +54 -64
  17. package/dist/devportal/pages/AdminReviewPage.js.map +1 -1
  18. package/dist/devportal/pages/ApplicationVersionsPage.d.ts.map +1 -1
  19. package/dist/devportal/pages/ApplicationVersionsPage.js +304 -272
  20. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  21. package/dist/devportal/pages/CreateApplicationPage.d.ts.map +1 -1
  22. package/dist/devportal/pages/CreateApplicationPage.js +137 -156
  23. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  24. package/dist/devportal/pages/EditApplicationPage.d.ts.map +1 -1
  25. package/dist/devportal/pages/EditApplicationPage.js +271 -290
  26. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  27. package/dist/generated/global-operations.d.ts +39 -0
  28. package/dist/generated/global-operations.d.ts.map +1 -1
  29. package/dist/generated/global-operations.js +72 -54
  30. package/dist/generated/global-operations.js.map +1 -1
  31. package/dist/translations/en.d.ts +4 -1
  32. package/dist/translations/en.d.ts.map +1 -1
  33. package/dist/translations/en.js +5 -2
  34. package/dist/translations/en.js.map +1 -1
  35. package/package.json +1 -1
@@ -9,23 +9,32 @@ import { InputField as ue } from "../components/FormField.js";
9
9
  import { ConfirmDialog as i } from "../components/ConfirmDialog.js";
10
10
  import { PermissionGuard as de } from "../components/PermissionGuard.js";
11
11
  import { MarkdownEditor as a } from "../components/MarkdownEditor.js";
12
+ import { ManifestViewer as fe } from "../components/ManifestViewer.js";
12
13
  import "../components/index.js";
13
- import { useDevportalPermission as fe } from "../hooks/usePermission.js";
14
+ import { useDevportalPermission as o } from "../hooks/usePermission.js";
14
15
  import "../hooks/index.js";
15
16
  import { DEVPORTAL_PERMISSIONS as pe } from "../constants/permissions.js";
16
17
  import me from "../../node_modules/date-fns/format.js";
17
18
  import { usePackageUpload as he } from "../hooks/usePackageUpload.js";
18
- import { useCallback as o, useEffect as ge, useMemo as s, useRef as c, useState as l } from "react";
19
- import { AlertCircle as u, Archive as _e, CheckCircle as ve, Clock as ye, Loader2 as d, Package as be, Plus as xe, Send as f, Upload as p, XCircle as Se } from "lucide-react";
20
- import { useParams as Ce } from "react-router";
19
+ import { useCallback as s, useEffect as ge, useMemo as c, useRef as l, useState as u } from "react";
20
+ import { AlertCircle as d, Archive as _e, CheckCircle as ve, Clock as ye, Loader2 as be, Package as xe, Plus as Se, Send as f, Upload as p, XCircle as Ce } from "lucide-react";
21
+ import { useParams as we } from "react-router";
21
22
  import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
22
- import { useI18n as we } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
23
+ import { useI18n as Te } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
23
24
  //#region src/devportal/pages/ApplicationVersionsPage.tsx
24
- var Te = () => {
25
- let { t: Te } = we(), _ = (e, t) => {
26
- let n = Te(e);
25
+ var _ = (e) => {
26
+ if (e.trim()) try {
27
+ let t = JSON.parse(e);
28
+ if (typeof t.nodeVersion == "string" && t.nodeVersion.trim()) return t.nodeVersion.trim();
29
+ let n = t.identity;
30
+ if (n && typeof n.version == "string" && n.version.trim()) return n.version.trim();
31
+ if (typeof t.version == "string" && t.version.trim()) return t.version.trim();
32
+ } catch {}
33
+ }, Ee = () => {
34
+ let { t: Ee } = Te(), v = (e, t) => {
35
+ let n = Ee(e);
27
36
  return n === e ? t : n;
28
- }, { allowed: v } = fe(pe.APP_VERSION_CREATE), { allowed: y } = fe(pe.APP_VERSION_PUBLISH), { allowed: b } = fe(pe.APP_VERSION_DEPRECATE), { appId: x } = Ce(), { workspacesGatewayUrl: Ee, authToken: De, workspaceId: Oe, getWorkspaceToken: ke } = e(), { upload: S, uploading: C, progress: Ae, error: w } = he(Ee, De, Oe, ke), je = c(null), Me = c(null), Ne = c(null), Pe = c(null), [Fe, T] = l(null), [Ie, E] = l(null), [Le, D] = l(!1), [O, k] = l(null), [A, j] = l({
37
+ }, { allowed: De } = o(pe.APP_VERSION_CREATE), { allowed: y } = o(pe.APP_VERSION_PUBLISH), { allowed: b } = o(pe.APP_VERSION_DEPRECATE), { appId: x } = we(), { workspacesGatewayUrl: Oe, authToken: ke, workspaceId: Ae, getWorkspaceToken: je } = e(), { upload: S, uploading: C, progress: Me, error: w } = he(Oe, ke, Ae, je), Ne = l(null), Pe = l(null), Fe = l(null), Ie = l(null), [Le, Re] = u(null), [ze, T] = u(null), [Be, E] = u(!1), [D, O] = u(null), [k, A] = u({
29
38
  version: "",
30
39
  releaseNotes: "",
31
40
  changelog: "",
@@ -33,18 +42,22 @@ var Te = () => {
33
42
  packageSize: "",
34
43
  manifestJson: "",
35
44
  requiredScopes: ""
36
- }), [Re, M] = l(null), [ze, N] = l(null), [Be, P] = l(null), [Ve, F] = l(null), [I, He] = l(/* @__PURE__ */ new Set()), [L, Ue] = l(null), [R, z] = l(""), We = o((e) => {
45
+ }), [Ve, j] = u(null), [He, M] = u(null), [Ue, N] = u(null), [We, P] = u(null), [F, I] = u(/* @__PURE__ */ new Set()), [L, Ge] = u(null), [R, z] = u(""), Ke = s((e) => {
37
46
  let t = e.target.files?.[0];
38
47
  if (!t) return;
39
48
  let n = new FileReader();
40
49
  n.onload = (e) => {
41
50
  let n = e.target?.result;
42
- typeof n == "string" && (j((e) => ({
43
- ...e,
44
- manifestJson: n
45
- })), T(t.name));
51
+ if (typeof n == "string") {
52
+ let e = _(n);
53
+ A((t) => ({
54
+ ...t,
55
+ manifestJson: n,
56
+ ...e ? { version: e } : {}
57
+ })), Re(t.name);
58
+ }
46
59
  }, n.readAsText(t), e.target.value = "";
47
- }, []), [Ge, B] = l(null), { data: V } = te({
60
+ }, []), [qe, B] = u(null), { data: V } = te({
48
61
  variables: { id: x ?? "" },
49
62
  skip: !x,
50
63
  fetchPolicy: "cache-first"
@@ -53,67 +66,67 @@ var Te = () => {
53
66
  "PARSER",
54
67
  "WIDGET",
55
68
  "DASHBOARD"
56
- ].includes(V?.application?.appType ?? ""), Ke = !W && !U, G = V?.application, qe = G?.pricingDetails ?? {}, Je = G?.pricingType === "FREE" || G?.pricingType === "PAID" && typeof qe.price == "number" && qe.price > 0, Ye = !!G?.shortDescription?.trim() && !!G?.privacyPolicyUrl?.trim() && !!G?.termsOfServiceUrl?.trim(), K = Je && Ye, q = [...Ye ? [] : ["Complete your store listing (short description, privacy policy, terms of service)"], ...Je ? [] : ["Set pricing in the Pricing tab"]];
69
+ ].includes(V?.application?.appType ?? ""), Je = !W && !U, G = V?.application, Ye = G?.pricingDetails ?? {}, Xe = G?.pricingType === "FREE" || G?.pricingType === "PAID" && typeof Ye.price == "number" && Ye.price > 0, Ze = !!G?.shortDescription?.trim() && !!G?.privacyPolicyUrl?.trim() && !!G?.termsOfServiceUrl?.trim(), K = Xe && Ze, Qe = [...Ze ? [] : ["Complete your store listing (short description, privacy policy, terms of service)"], ...Xe ? [] : ["Set pricing in the Pricing tab"]];
57
70
  ge(() => {
58
71
  let e = V?.application?.name;
59
72
  if (!x || !e) return;
60
73
  let t = window.__breadcrumbRegistry;
61
74
  return t?.register(x, e), () => t?.unregister(x);
62
75
  }, [x, V?.application?.name]);
63
- let { data: J, loading: Xe, error: Ze } = ne({
76
+ let { data: q, loading: $e, error: et } = ne({
64
77
  variables: { applicationId: x },
65
78
  skip: !x,
66
79
  fetchPolicy: "cache-and-network"
67
- }), [Qe, { loading: $e }] = r({ refetchQueries: ["GetApplicationVersions"] }), [et, { loading: tt }] = ae({ refetchQueries: ["GetApplicationVersions"] }), [nt] = re({ refetchQueries: ["GetApplicationVersions"] }), [rt] = ee({ refetchQueries: ["GetApplicationVersions"] }), [it] = n({ refetchQueries: ["GetApplicationVersions"] }), [at] = ie({ refetchQueries: ["GetApplicationVersions"] }), Y = s(() => J?.application?.versions?.edges?.map((e) => e.node) ?? [], [J?.application?.versions]), X = s(() => Y.filter((e) => I.has(e.id)), [Y, I]), Z = s(() => X.filter((e) => e.status === "draft" || e.status === "rejected"), [X]), Q = s(() => Y.some((e) => e.status === "pending_review"), [Y]), $ = s(() => X.filter((e) => e.status?.toUpperCase() === "PUBLISHED" && !e.isLatest), [X]), ot = Y.length > 0 && Y.every((e) => I.has(e.id)), st = Y.some((e) => I.has(e.id)) && !ot, ct = async () => {
68
- if (!x || !A.version.trim()) return;
69
- P(null);
80
+ }), [tt, { loading: nt }] = r({ refetchQueries: ["GetApplicationVersions"] }), [rt, { loading: it }] = ae({ refetchQueries: ["GetApplicationVersions"] }), [at] = re({ refetchQueries: ["GetApplicationVersions"] }), [ot] = ee({ refetchQueries: ["GetApplicationVersions"] }), [st] = n({ refetchQueries: ["GetApplicationVersions"] }), [ct] = ie({ refetchQueries: ["GetApplicationVersions"] }), J = c(() => q?.application?.versions?.edges?.map((e) => e.node) ?? [], [q?.application?.versions]), Y = c(() => J.filter((e) => F.has(e.id)), [J, F]), X = c(() => Y.filter((e) => e.status === "draft" || e.status === "rejected"), [Y]), Z = c(() => J.some((e) => e.status === "pending_review"), [J]), Q = c(() => Y.filter((e) => e.status?.toUpperCase() === "PUBLISHED" && !e.isLatest), [Y]), lt = J.length > 0 && J.every((e) => F.has(e.id)), ut = J.some((e) => F.has(e.id)) && !lt, dt = async () => {
81
+ if (!x || !k.version.trim()) return;
82
+ N(null);
70
83
  let e;
71
84
  if (W) {
72
- if (!A.manifestJson.trim()) {
73
- P(H ? "Workflow Definition (JSON) is required — paste the {nodes, edges} object." : "Manifest (JSON) is required.");
85
+ if (!k.manifestJson.trim()) {
86
+ N(H ? "Workflow Definition (JSON) is required — paste the {nodes, edges} object." : "Manifest (JSON) is required.");
74
87
  return;
75
88
  }
76
89
  try {
77
- e = JSON.parse(A.manifestJson);
90
+ e = JSON.parse(k.manifestJson);
78
91
  } catch {
79
- P(H ? "Invalid JSON in Workflow Definition — please check your input." : "Invalid JSON in Manifest — please check your input.");
92
+ N(H ? "Invalid JSON in Workflow Definition — please check your input." : "Invalid JSON in Manifest — please check your input.");
80
93
  return;
81
94
  }
82
95
  } else if (U) {
83
- if (!A.packageUrl) {
84
- P("Package zip is required for Node versions — upload a .zip file before creating.");
96
+ if (!k.packageUrl) {
97
+ N("Package zip is required for Node versions — upload a .zip file before creating.");
85
98
  return;
86
99
  }
87
- if (!A.manifestJson.trim()) {
88
- P("manifest.json is required for Node versions — upload or paste your manifest before creating.");
100
+ if (!k.manifestJson.trim()) {
101
+ N("manifest.json is required for Node versions — upload or paste your manifest before creating.");
89
102
  return;
90
103
  }
91
104
  try {
92
- e = JSON.parse(A.manifestJson);
105
+ e = JSON.parse(k.manifestJson);
93
106
  } catch {
94
- P("Invalid JSON in manifest — please check your input.");
107
+ N("Invalid JSON in manifest — please check your input.");
95
108
  return;
96
109
  }
97
- } else if (A.manifestJson.trim()) try {
98
- e = JSON.parse(A.manifestJson);
110
+ } else if (k.manifestJson.trim()) try {
111
+ e = JSON.parse(k.manifestJson);
99
112
  } catch {
100
- P("Invalid JSON in manifest — please check your input.");
113
+ N("Invalid JSON in manifest — please check your input.");
101
114
  return;
102
115
  }
103
- let t = Ke && A.requiredScopes.trim() ? A.requiredScopes.split(",").map((e) => e.trim()).filter(Boolean) : void 0;
116
+ let t = Je && k.requiredScopes.trim() ? k.requiredScopes.split(",").map((e) => e.trim()).filter(Boolean) : void 0;
104
117
  try {
105
- await Qe({ variables: {
118
+ await tt({ variables: {
106
119
  applicationId: x,
107
120
  input: {
108
- version: A.version,
109
- releaseNotes: A.releaseNotes || void 0,
110
- changelog: A.changelog || void 0,
111
- packageUrl: A.packageUrl || void 0,
112
- packageSize: A.packageSize || void 0,
121
+ version: k.version,
122
+ releaseNotes: k.releaseNotes || void 0,
123
+ changelog: k.changelog || void 0,
124
+ packageUrl: k.packageUrl || void 0,
125
+ packageSize: k.packageSize || void 0,
113
126
  manifest: e,
114
127
  requiredScopes: t
115
128
  }
116
- } }), D(!1), T(null), j({
129
+ } }), E(!1), Re(null), A({
117
130
  version: "",
118
131
  releaseNotes: "",
119
132
  changelog: "",
@@ -121,100 +134,100 @@ var Te = () => {
121
134
  packageSize: "",
122
135
  manifestJson: "",
123
136
  requiredScopes: ""
124
- }), N(_("devportal.versionCreatedSuccess", "Version created successfully"));
137
+ }), M(v("devportal.versionCreatedSuccess", "Version created successfully"));
125
138
  } catch (e) {
126
- M(e instanceof Error ? e.message : _("devportal.versionCreateFailed", "Failed to create version"));
139
+ j(e instanceof Error ? e.message : v("devportal.versionCreateFailed", "Failed to create version"));
127
140
  }
128
- }, lt = o(async (e) => {
141
+ }, ft = s(async (e) => {
129
142
  let t = e.target.files?.[0];
130
143
  if (t) {
131
144
  e.target.value = "";
132
145
  try {
133
146
  let e = await S(t);
134
- j((n) => ({
147
+ A((n) => ({
135
148
  ...n,
136
149
  packageUrl: e.downloadUrl,
137
150
  packageSize: String(t.size)
138
151
  }));
139
152
  } catch {}
140
153
  }
141
- }, [S]), ut = o(async (e) => {
154
+ }, [S]), pt = s(async (e) => {
142
155
  let t = e.target.files?.[0];
143
156
  if (t) {
144
157
  e.target.value = "";
145
158
  try {
146
159
  let e = await S(t);
147
- k((n) => n && {
160
+ O((n) => n && {
148
161
  ...n,
149
162
  newPackageUrl: e.downloadUrl,
150
163
  newPackageSize: String(t.size)
151
164
  });
152
165
  } catch {}
153
166
  }
154
- }, [S]), dt = o((e) => {
167
+ }, [S]), mt = s((e) => {
155
168
  let t = e.target.files?.[0];
156
169
  if (!t) return;
157
170
  let n = new FileReader();
158
171
  n.onload = (e) => {
159
172
  let n = e.target?.result;
160
- typeof n == "string" && (k((e) => e && {
173
+ typeof n == "string" && (O((e) => e && {
161
174
  ...e,
162
175
  manifestJson: n
163
- }), E(t.name));
176
+ }), T(t.name));
164
177
  }, n.readAsText(t), e.target.value = "";
165
- }, []), ft = async () => {
166
- if (!O) return;
167
- F(null);
168
- let e = O.manifestJson.trim() !== O.originalManifestJson.trim(), t;
169
- if (e && O.manifestJson.trim()) try {
170
- t = JSON.parse(O.manifestJson);
178
+ }, []), ht = async () => {
179
+ if (!D) return;
180
+ P(null);
181
+ let e = D.manifestJson.trim() !== D.originalManifestJson.trim(), t;
182
+ if (e && D.manifestJson.trim()) try {
183
+ t = JSON.parse(D.manifestJson);
171
184
  } catch {
172
- F("Invalid JSON in manifest — please check your input.");
185
+ P("Invalid JSON in manifest — please check your input.");
173
186
  return;
174
187
  }
175
188
  let n = {};
176
- O.releaseNotes.trim() && (n.releaseNotes = O.releaseNotes), O.changelog.trim() && (n.changelog = O.changelog), O.newPackageUrl && (n.packageUrl = O.newPackageUrl, n.packageSize = O.newPackageSize), t && (n.manifest = t);
189
+ D.releaseNotes.trim() && (n.releaseNotes = D.releaseNotes), D.changelog.trim() && (n.changelog = D.changelog), D.newPackageUrl && (n.packageUrl = D.newPackageUrl, n.packageSize = D.newPackageSize), t && (n.manifest = t);
177
190
  try {
178
- await et({ variables: {
179
- id: O.versionId,
191
+ await rt({ variables: {
192
+ id: D.versionId,
180
193
  input: n
181
- } }), k(null), E(null), N(_("devportal.versionUpdatedSuccess", "Version updated successfully"));
194
+ } }), O(null), T(null), M(v("devportal.versionUpdatedSuccess", "Version updated successfully"));
182
195
  } catch (e) {
183
- M(e instanceof Error ? e.message : _("devportal.versionUpdateFailed", "Failed to update version"));
196
+ j(e instanceof Error ? e.message : v("devportal.versionUpdateFailed", "Failed to update version"));
184
197
  }
185
- }, pt = async (e) => {
186
- M(null), N(null);
198
+ }, gt = async (e) => {
199
+ j(null), M(null);
187
200
  try {
188
- await nt({ variables: { id: e } }), N(_("devportal.versionSubmittedSuccess", "Version submitted for review — you'll be notified when approved"));
201
+ await at({ variables: { id: e } }), M(v("devportal.versionSubmittedSuccess", "Version submitted for review — you'll be notified when approved"));
189
202
  } catch (e) {
190
- M(e instanceof Error ? e.message : _("devportal.versionPublishFailed", "Failed to submit version for review"));
203
+ j(e instanceof Error ? e.message : v("devportal.versionPublishFailed", "Failed to submit version for review"));
191
204
  }
192
- }, mt = async (e) => {
193
- M(null), N(null);
205
+ }, _t = async (e) => {
206
+ j(null), M(null);
194
207
  try {
195
- await rt({ variables: { id: e } }), N(_("devportal.versionDeprecatedSuccess", "Version deprecated successfully"));
208
+ await ot({ variables: { id: e } }), M(v("devportal.versionDeprecatedSuccess", "Version deprecated successfully"));
196
209
  } catch (e) {
197
- M(e instanceof Error ? e.message : _("devportal.versionDeprecateFailed", "Failed to deprecate version"));
210
+ j(e instanceof Error ? e.message : v("devportal.versionDeprecateFailed", "Failed to deprecate version"));
198
211
  }
199
- }, ht = async () => {
212
+ }, vt = async () => {
200
213
  if (!(!L || !R.trim())) {
201
- M(null), N(null);
214
+ j(null), M(null);
202
215
  try {
203
- await at({ variables: {
216
+ await ct({ variables: {
204
217
  id: L.versionId,
205
218
  reason: R
206
- } }), N(_("devportal.versionRejectedSuccess", "Version rejected — developer has been notified")), Ue(null), z("");
219
+ } }), M(v("devportal.versionRejectedSuccess", "Version rejected — developer has been notified")), Ge(null), z("");
207
220
  } catch (e) {
208
- M(e instanceof Error ? e.message : _("devportal.versionRejectFailed", "Failed to reject version"));
221
+ j(e instanceof Error ? e.message : v("devportal.versionRejectFailed", "Failed to reject version"));
209
222
  }
210
223
  }
211
- }, gt = (e) => e.status === "published" && e.isLatest ? /* @__PURE__ */ h(ve, {
224
+ }, yt = (e) => e.status === "published" && e.isLatest ? /* @__PURE__ */ h(ve, {
212
225
  size: 16,
213
226
  className: "text-status-success-text"
214
227
  }) : e.status === "pending_review" ? /* @__PURE__ */ h(f, {
215
228
  size: 16,
216
229
  className: "text-status-info-text"
217
- }) : e.status === "rejected" ? /* @__PURE__ */ h(Se, {
230
+ }) : e.status === "rejected" ? /* @__PURE__ */ h(Ce, {
218
231
  size: 16,
219
232
  className: "text-status-error-text"
220
233
  }) : e.status === "draft" ? /* @__PURE__ */ h(ye, {
@@ -223,95 +236,105 @@ var Te = () => {
223
236
  }) : e.status === "deprecated" ? /* @__PURE__ */ h(_e, {
224
237
  size: 16,
225
238
  className: "text-text-secondary"
226
- }) : /* @__PURE__ */ h(be, {
239
+ }) : /* @__PURE__ */ h(xe, {
227
240
  size: 16,
228
241
  className: "text-accent-blue"
229
- }), _t = (e, t) => {
230
- He((n) => {
242
+ }), bt = (e, t) => {
243
+ I((n) => {
231
244
  let r = new Set(n);
232
245
  return t ? r.add(e) : r.delete(e), r;
233
246
  });
234
- }, vt = (e) => {
235
- He((t) => {
247
+ }, xt = (e) => {
248
+ I((t) => {
236
249
  let n = new Set(t);
237
- return Y.forEach((t) => {
250
+ return J.forEach((t) => {
238
251
  e ? n.add(t.id) : n.delete(t.id);
239
252
  }), n;
240
253
  });
241
- }, yt = () => He(/* @__PURE__ */ new Set());
242
- return Xe && !J ? /* @__PURE__ */ h(oe, {
243
- title: _("devportal.versionManagement", "Version Management"),
244
- description: _("devportal.versionManagementDescription", "Manage your application versions"),
254
+ }, $ = () => I(/* @__PURE__ */ new Set()), St = async () => {
255
+ if (X.length === 0) return;
256
+ j(null);
257
+ let e = await Promise.allSettled(X.map((e) => at({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
258
+ M(`Published ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), $(), B(null);
259
+ }, Ct = async () => {
260
+ if (Q.length === 0) return;
261
+ j(null);
262
+ let e = await Promise.allSettled(Q.map((e) => ot({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
263
+ M(`Deprecated ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), $(), B(null);
264
+ }, wt = _(k.manifestJson);
265
+ return $e && !q ? /* @__PURE__ */ h(oe, {
266
+ title: v("devportal.versionManagement", "Version Management"),
267
+ description: v("devportal.versionManagementDescription", "Manage your application versions"),
245
268
  backLink: `/apps/${x}`,
246
- backLabel: _("devportal.backToApplication", "Back to Application"),
269
+ backLabel: v("devportal.backToApplication", "Back to Application"),
247
270
  children: /* @__PURE__ */ h("div", {
248
271
  className: "flex items-center justify-center py-16",
249
- children: /* @__PURE__ */ h(d, { className: "h-8 w-8 animate-spin text-text-secondary" })
272
+ children: /* @__PURE__ */ h(be, { className: "h-8 w-8 animate-spin text-text-secondary" })
250
273
  })
251
- }) : Ze && !J ? /* @__PURE__ */ h(oe, {
252
- title: _("devportal.versionManagement", "Version Management"),
253
- description: _("devportal.versionManagementDescription", "Manage your application versions"),
274
+ }) : et && !q ? /* @__PURE__ */ h(oe, {
275
+ title: v("devportal.versionManagement", "Version Management"),
276
+ description: v("devportal.versionManagementDescription", "Manage your application versions"),
254
277
  backLink: `/apps/${x}`,
255
- backLabel: _("devportal.backToApplication", "Back to Application"),
278
+ backLabel: v("devportal.backToApplication", "Back to Application"),
256
279
  children: /* @__PURE__ */ h(t, {
257
- icon: /* @__PURE__ */ h(u, {
280
+ icon: /* @__PURE__ */ h(d, {
258
281
  size: 32,
259
282
  className: "text-status-error-text"
260
283
  }),
261
- title: _("devportal.failedToLoadVersions", "Failed to load versions"),
262
- description: Ze.message || _("devportal.versionsLoadError", "An error occurred while loading versions")
284
+ title: v("devportal.failedToLoadVersions", "Failed to load versions"),
285
+ description: et.message || v("devportal.versionsLoadError", "An error occurred while loading versions")
263
286
  })
264
287
  }) : /* @__PURE__ */ h(de, {
265
288
  authOnly: !0,
266
289
  children: /* @__PURE__ */ g(oe, {
267
- title: _("devportal.versionManagement", "Version Management"),
268
- description: _("devportal.versionManagementDescription", "Manage your application versions"),
269
- purpose: H ? _("devportal.versionManagementPurposeWorkflow", "Versions track releases of your workflow. Create a version for each significant change and paste the workflow definition JSON. No zip is needed — the manifest is the workflow.") : U ? _("devportal.versionManagementPurposeNode", "Versions are the releases of your node that users install. Upload a new zip whenever the node implementation changes, and update the manifest if the node's inputs, outputs, or operations change. Bump the version for any change users will see.") : W ? _("devportal.versionManagementPurposeManifestOnly", "Versions track releases of this item. Create a version for each significant change and paste the manifest JSON. No zip is needed.") : _("devportal.versionManagementPurposeIntegration", "Versions track permission and webhook changes for your integration. No zip or manifest is needed — create a new version whenever you add or change required scopes so users can review and accept the updated permissions."),
290
+ title: v("devportal.versionManagement", "Version Management"),
291
+ description: v("devportal.versionManagementDescription", "Manage your application versions"),
292
+ purpose: H ? v("devportal.versionManagementPurposeWorkflow", "Versions track releases of your workflow. Create a version for each significant change and paste the workflow definition JSON. No zip is needed — the manifest is the workflow.") : U ? v("devportal.versionManagementPurposeNode", "Versions are the releases of your node that users install. Upload a new zip whenever the node implementation changes, and update the manifest if the node's inputs, outputs, or operations change. Bump the version for any change users will see.") : W ? v("devportal.versionManagementPurposeManifestOnly", "Versions track releases of this item. Create a version for each significant change and paste the manifest JSON. No zip is needed.") : v("devportal.versionManagementPurposeIntegration", "Versions track permission and webhook changes for your integration. No zip or manifest is needed — create a new version whenever you add or change required scopes so users can review and accept the updated permissions."),
270
293
  backLink: `/apps/${x}`,
271
- backLabel: _("devportal.backToApplication", "Back to Application"),
294
+ backLabel: v("devportal.backToApplication", "Back to Application"),
272
295
  actions: /* @__PURE__ */ g("button", {
273
296
  onClick: () => {
274
- P(null), D(!0);
297
+ N(null), E(!0);
275
298
  },
276
- disabled: !v,
277
- "aria-disabled": !v,
299
+ disabled: !De,
300
+ "aria-disabled": !De,
278
301
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
279
- children: [/* @__PURE__ */ h(xe, { size: 16 }), _("devportal.newVersion", "New Version")]
302
+ children: [/* @__PURE__ */ h(Se, { size: 16 }), v("devportal.newVersion", "New Version")]
280
303
  }),
281
304
  children: [
282
- Re && /* @__PURE__ */ g("div", {
305
+ Ve && /* @__PURE__ */ g("div", {
283
306
  className: "rounded-lg border border-border-subtle bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
284
307
  children: [
285
- /* @__PURE__ */ h(u, {
308
+ /* @__PURE__ */ h(d, {
286
309
  size: 16,
287
310
  className: "flex-shrink-0"
288
311
  }),
289
- Re,
312
+ Ve,
290
313
  /* @__PURE__ */ h("button", {
291
- onClick: () => M(null),
314
+ onClick: () => j(null),
292
315
  className: "ml-auto text-status-error-text hover:text-status-error-text",
293
- children: _("devportal.dismiss", "Dismiss")
316
+ children: v("devportal.dismiss", "Dismiss")
294
317
  })
295
318
  ]
296
319
  }),
297
- ze && /* @__PURE__ */ g("div", {
320
+ He && /* @__PURE__ */ g("div", {
298
321
  className: "rounded-lg border border-border-subtle bg-status-success-bg-subtle p-3 flex items-center gap-2 text-sm text-status-success-text",
299
322
  children: [
300
323
  /* @__PURE__ */ h(ve, {
301
324
  size: 16,
302
325
  className: "flex-shrink-0"
303
326
  }),
304
- ze,
327
+ He,
305
328
  /* @__PURE__ */ h("button", {
306
- onClick: () => N(null),
329
+ onClick: () => M(null),
307
330
  className: "ml-auto text-status-success-text hover:text-status-success-text",
308
- children: _("devportal.dismiss", "Dismiss")
331
+ children: v("devportal.dismiss", "Dismiss")
309
332
  })
310
333
  ]
311
334
  }),
312
335
  G && !K && /* @__PURE__ */ g("div", {
313
336
  className: "flex items-start gap-3 rounded-lg border border-status-warning-bg bg-status-warning-bg-subtle px-4 py-3 text-sm text-status-warning-text",
314
- children: [/* @__PURE__ */ h(u, {
337
+ children: [/* @__PURE__ */ h(d, {
315
338
  size: 16,
316
339
  className: "mt-0.5 shrink-0"
317
340
  }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
@@ -319,10 +342,10 @@ var Te = () => {
319
342
  children: "Complete your app setup before submitting for review"
320
343
  }), /* @__PURE__ */ h("ul", {
321
344
  className: "mt-1 list-disc pl-4 text-xs opacity-80",
322
- children: q.map((e) => /* @__PURE__ */ h("li", { children: e }, e))
345
+ children: Qe.map((e) => /* @__PURE__ */ h("li", { children: e }, e))
323
346
  })] })]
324
347
  }),
325
- G && G.status !== "PUBLISHED" && Y.some((e) => e.status === "draft") && /* @__PURE__ */ g("div", {
348
+ G && G.status !== "PUBLISHED" && J.some((e) => e.status === "draft") && /* @__PURE__ */ g("div", {
326
349
  className: "flex items-start gap-3 rounded-lg border border-status-info-bg bg-status-info-bg-subtle px-4 py-3 text-sm text-status-info-text",
327
350
  children: [/* @__PURE__ */ h(f, {
328
351
  size: 16,
@@ -339,20 +362,20 @@ var Te = () => {
339
362
  ]
340
363
  })] })]
341
364
  }),
342
- G && Q && /* @__PURE__ */ g("div", {
365
+ G && Z && /* @__PURE__ */ g("div", {
343
366
  className: "flex items-start gap-3 rounded-lg border border-status-warning-bg bg-status-warning-bg-subtle px-4 py-3 text-sm text-status-warning-text",
344
367
  children: [/* @__PURE__ */ h(f, {
345
368
  size: 16,
346
369
  className: "mt-0.5 shrink-0"
347
370
  }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
348
371
  className: "font-medium",
349
- children: _("devportal.versionAlreadyPending", "A version is already pending review")
372
+ children: v("devportal.versionAlreadyPending", "A version is already pending review")
350
373
  }), /* @__PURE__ */ h("p", {
351
374
  className: "mt-1 text-xs opacity-80",
352
- children: _("devportal.versionAlreadyPendingDetail", "Submitting another version is disabled until it's approved or rejected.")
375
+ children: v("devportal.versionAlreadyPendingDetail", "Submitting another version is disabled until it's approved or rejected.")
353
376
  })] })]
354
377
  }),
355
- Y.length > 0 && /* @__PURE__ */ h("div", {
378
+ J.length > 0 && /* @__PURE__ */ h("div", {
356
379
  className: "rounded-card border border-border-seam bg-bg-surface p-4",
357
380
  children: /* @__PURE__ */ g("div", {
358
381
  className: "flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",
@@ -361,100 +384,100 @@ var Te = () => {
361
384
  children: [/* @__PURE__ */ g("div", {
362
385
  className: "flex items-center gap-2",
363
386
  children: [/* @__PURE__ */ h(ce, {
364
- checked: ot,
365
- indeterminate: st,
366
- onChange: vt,
387
+ checked: lt,
388
+ indeterminate: ut,
389
+ onChange: xt,
367
390
  ariaLabel: "Select all visible versions"
368
391
  }), /* @__PURE__ */ h("span", {
369
392
  className: "text-sm font-medium",
370
- children: _("devportal.selectAllVisible", "Select all visible")
393
+ children: v("devportal.selectAllVisible", "Select all visible")
371
394
  })]
372
- }), I.size > 0 && /* @__PURE__ */ h("button", {
373
- onClick: yt,
395
+ }), F.size > 0 && /* @__PURE__ */ h("button", {
396
+ onClick: $,
374
397
  className: "text-sm text-text-secondary hover:text-text-primary",
375
- children: _("devportal.clearSelection", "Clear selection")
398
+ children: v("devportal.clearSelection", "Clear selection")
376
399
  })]
377
400
  }), /* @__PURE__ */ g("div", {
378
401
  className: "flex flex-wrap items-center gap-2",
379
402
  children: [
380
403
  /* @__PURE__ */ g("span", {
381
404
  className: "rounded-full bg-bg-sunken px-3 py-1 text-sm font-medium text-text-secondary",
382
- children: [I.size, " selected"]
405
+ children: [F.size, " selected"]
383
406
  }),
384
407
  /* @__PURE__ */ g("button", {
385
408
  onClick: () => B("publish"),
386
- disabled: Z.length === 0 || !y || !K || Q,
387
- "aria-disabled": !y || !K || Q,
388
- title: Q ? _("devportal.versionAlreadyPending", "A version is already pending review") : K ? void 0 : q.join(" · "),
409
+ disabled: X.length === 0 || !y || !K || Z,
410
+ "aria-disabled": !y || !K || Z,
411
+ title: Z ? v("devportal.versionAlreadyPending", "A version is already pending review") : K ? void 0 : Qe.join(" · "),
389
412
  className: "rounded-md border border-status-success-bg px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle disabled:cursor-not-allowed disabled:opacity-50",
390
- children: [_("devportal.submitForReview", "Submit for Review"), Z.length > 0 ? ` (${Z.length})` : ""]
413
+ children: [v("devportal.submitForReview", "Submit for Review"), X.length > 0 ? ` (${X.length})` : ""]
391
414
  }),
392
415
  /* @__PURE__ */ g("button", {
393
416
  onClick: () => B("deprecate"),
394
- disabled: $.length === 0 || !b,
417
+ disabled: Q.length === 0 || !b,
395
418
  "aria-disabled": !b,
396
419
  className: "rounded-md border border-status-warning-bg px-3 py-2 text-sm font-medium text-status-warning-text hover:bg-status-warning-bg-subtle disabled:cursor-not-allowed disabled:opacity-50",
397
- children: [_("devportal.deprecateSelected", "Deprecate Selected"), $.length > 0 ? ` (${$.length})` : ""]
420
+ children: [v("devportal.deprecateSelected", "Deprecate Selected"), Q.length > 0 ? ` (${Q.length})` : ""]
398
421
  })
399
422
  ]
400
423
  })]
401
424
  })
402
425
  }),
403
- Y.length > 0 ? /* @__PURE__ */ h(le, {
404
- data: Y,
426
+ J.length > 0 ? /* @__PURE__ */ h(le, {
427
+ data: J,
405
428
  keyField: "id",
406
429
  columns: [
407
430
  {
408
431
  key: "select",
409
432
  header: /* @__PURE__ */ h(ce, {
410
- checked: ot,
411
- indeterminate: st,
412
- onChange: vt,
433
+ checked: lt,
434
+ indeterminate: ut,
435
+ onChange: xt,
413
436
  ariaLabel: "Select all visible versions"
414
437
  }),
415
438
  className: "w-12",
416
439
  render: (e) => /* @__PURE__ */ h("div", {
417
440
  onClick: (e) => e.stopPropagation(),
418
441
  children: /* @__PURE__ */ h(ce, {
419
- checked: I.has(e.id),
420
- onChange: (t) => _t(e.id, t),
442
+ checked: F.has(e.id),
443
+ onChange: (t) => bt(e.id, t),
421
444
  ariaLabel: `Select version ${e.version}`
422
445
  })
423
446
  })
424
447
  },
425
448
  {
426
449
  key: "version",
427
- header: _("devportal.version", "Version"),
450
+ header: v("devportal.version", "Version"),
428
451
  render: (e) => /* @__PURE__ */ g("div", {
429
452
  className: "flex items-center gap-2",
430
453
  children: [
431
- gt(e),
454
+ yt(e),
432
455
  /* @__PURE__ */ h("span", {
433
456
  className: "font-mono font-medium",
434
457
  children: e.version
435
458
  }),
436
459
  e.isLatest && /* @__PURE__ */ h("span", {
437
460
  className: "rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs text-status-success-text",
438
- children: _("devportal.latest", "Latest")
461
+ children: v("devportal.latest", "Latest")
439
462
  }),
440
463
  !e.isStable && /* @__PURE__ */ h("span", {
441
464
  className: "rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-xs text-status-warning-text",
442
- children: _("devportal.beta", "Beta")
465
+ children: v("devportal.beta", "Beta")
443
466
  })
444
467
  ]
445
468
  })
446
469
  },
447
470
  {
448
471
  key: "releaseNotes",
449
- header: _("devportal.releaseNotes", "Release Notes"),
472
+ header: v("devportal.releaseNotes", "Release Notes"),
450
473
  render: (e) => /* @__PURE__ */ h("p", {
451
474
  className: "max-w-md truncate text-sm text-text-secondary",
452
- children: e.releaseNotes || _("devportal.noReleaseNotes", "No release notes")
475
+ children: e.releaseNotes || v("devportal.noReleaseNotes", "No release notes")
453
476
  })
454
477
  },
455
478
  {
456
479
  key: "status",
457
- header: _("devportal.status", "Status"),
480
+ header: v("devportal.status", "Status"),
458
481
  render: (e) => /* @__PURE__ */ g("div", {
459
482
  className: "space-y-1",
460
483
  children: [
@@ -472,9 +495,20 @@ var Te = () => {
472
495
  },
473
496
  {
474
497
  key: "publishedAt",
475
- header: _("devportal.published", "Published"),
498
+ header: v("devportal.published", "Published"),
476
499
  render: (e) => e.publishedAt ? me(new Date(e.publishedAt), "MMM d, yyyy") : "-"
477
500
  },
501
+ {
502
+ key: "manifest",
503
+ header: v("devportal.manifest", "Manifest"),
504
+ render: (e) => e.manifest ? /* @__PURE__ */ h(fe, {
505
+ manifest: e.manifest,
506
+ tr: v
507
+ }) : /* @__PURE__ */ h("span", {
508
+ className: "text-xs text-text-secondary",
509
+ children: v("devportal.noManifest", "No manifest")
510
+ })
511
+ },
478
512
  {
479
513
  key: "actions",
480
514
  header: "",
@@ -482,11 +516,11 @@ var Te = () => {
482
516
  render: (e) => /* @__PURE__ */ g("div", {
483
517
  className: "flex flex-wrap gap-2",
484
518
  children: [
485
- (e.status === "draft" || e.status === "rejected") && v && /* @__PURE__ */ h("button", {
519
+ (e.status === "draft" || e.status === "rejected") && De && /* @__PURE__ */ h("button", {
486
520
  className: "inline-flex items-center gap-1 text-xs text-text-secondary hover:text-text-primary hover:underline",
487
521
  onClick: () => {
488
522
  let t = e.manifest ? JSON.stringify(e.manifest, null, 2) : "";
489
- k({
523
+ O({
490
524
  versionId: e.id,
491
525
  version: e.version,
492
526
  hasExistingZip: !!e.packageUrl,
@@ -496,24 +530,24 @@ var Te = () => {
496
530
  originalManifestJson: t,
497
531
  releaseNotes: e.releaseNotes ?? "",
498
532
  changelog: e.changelog ?? ""
499
- }), E(null), F(null);
533
+ }), T(null), P(null);
500
534
  },
501
535
  children: "Edit"
502
536
  }),
503
537
  (e.status === "draft" || e.status === "rejected") && G?.status === "PUBLISHED" && /* @__PURE__ */ g("button", {
504
538
  className: "inline-flex items-center gap-1 text-xs text-primary hover:underline disabled:opacity-50 disabled:cursor-not-allowed",
505
- disabled: !y || !K || Q,
506
- "aria-disabled": !y || !K || Q,
507
- title: Q ? _("devportal.versionAlreadyPending", "A version is already pending review") : K ? void 0 : q.join(" · "),
508
- onClick: () => pt(e.id),
509
- children: [/* @__PURE__ */ h(f, { size: 11 }), _("devportal.submitForReview", "Submit for Review")]
539
+ disabled: !y || !K || Z,
540
+ "aria-disabled": !y || !K || Z,
541
+ title: Z ? v("devportal.versionAlreadyPending", "A version is already pending review") : K ? void 0 : Qe.join(" · "),
542
+ onClick: () => gt(e.id),
543
+ children: [/* @__PURE__ */ h(f, { size: 11 }), v("devportal.submitForReview", "Submit for Review")]
510
544
  }),
511
545
  e.status === "published" && !e.isLatest && /* @__PURE__ */ h("button", {
512
546
  className: "text-xs text-status-warning-text hover:underline disabled:opacity-50",
513
547
  disabled: !b,
514
548
  "aria-disabled": !b,
515
- onClick: () => mt(e.id),
516
- children: _("devportal.deprecate", "Deprecate")
549
+ onClick: () => _t(e.id),
550
+ children: v("devportal.deprecate", "Deprecate")
517
551
  })
518
552
  ]
519
553
  })
@@ -521,43 +555,44 @@ var Te = () => {
521
555
  ]
522
556
  }) : /* @__PURE__ */ h(t, {
523
557
  illustration: "empty-data",
524
- title: _("devportal.noVersionsYet", "No versions yet"),
525
- description: _("devportal.noVersionsYetDescription", "Create your first version to start distributing your app"),
558
+ title: v("devportal.noVersionsYet", "No versions yet"),
559
+ description: v("devportal.noVersionsYetDescription", "Create your first version to start distributing your app"),
526
560
  action: /* @__PURE__ */ g("button", {
527
561
  onClick: () => {
528
- P(null), D(!0);
562
+ N(null), E(!0);
529
563
  },
530
564
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
531
- children: [/* @__PURE__ */ h(xe, { size: 16 }), _("devportal.createVersion", "Create Version")]
565
+ children: [/* @__PURE__ */ h(Se, { size: 16 }), v("devportal.createVersion", "Create Version")]
532
566
  })
533
567
  }),
534
- Le && /* @__PURE__ */ h(i, {
535
- open: Le,
568
+ Be && /* @__PURE__ */ h(i, {
569
+ open: Be,
536
570
  onOpenChange: (e) => {
537
- D(e), e || P(null);
571
+ E(e), e || N(null);
538
572
  },
539
- onConfirm: ct,
540
- title: _("devportal.createNewVersion", "Create New Version"),
541
- confirmLabel: $e ? _("devportal.creating", "Creating...") : _("devportal.createVersion", "Create Version"),
573
+ onConfirm: dt,
574
+ title: v("devportal.createNewVersion", "Create New Version"),
575
+ confirmLabel: nt ? v("devportal.creating", "Creating...") : v("devportal.createVersion", "Create Version"),
542
576
  children: /* @__PURE__ */ g("div", {
543
577
  className: "space-y-4",
544
578
  children: [
545
- Be && /* @__PURE__ */ g("div", {
579
+ Ue && /* @__PURE__ */ g("div", {
546
580
  className: "rounded-lg border border-status-error-bg bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
547
- children: [/* @__PURE__ */ h(u, {
581
+ children: [/* @__PURE__ */ h(d, {
548
582
  size: 14,
549
583
  className: "flex-shrink-0"
550
- }), Be]
584
+ }), Ue]
551
585
  }),
552
586
  /* @__PURE__ */ h(ue, {
553
- label: _("devportal.versionNumber", "Version Number"),
554
- value: A.version,
555
- onChange: (e) => j({
556
- ...A,
587
+ label: v("devportal.versionNumber", "Version Number"),
588
+ value: k.version,
589
+ onChange: (e) => A({
590
+ ...k,
557
591
  version: e.target.value
558
592
  }),
559
593
  placeholder: "e.g., 2.2.0",
560
- hint: _("devportal.versionHint", "Use semantic versioning (major.minor.patch)"),
594
+ hint: wt ? v("devportal.versionHintAutoFilled", "Filled in from the manifest's version — edit it there if this is wrong.") : v("devportal.versionHint", "Use semantic versioning (major.minor.patch). Upload a manifest.json/manifest with a version to fill this in automatically."),
595
+ readOnly: !!wt,
561
596
  required: !0
562
597
  }),
563
598
  W && /* @__PURE__ */ g("div", {
@@ -578,11 +613,15 @@ var Te = () => {
578
613
  rows: 10,
579
614
  required: !0,
580
615
  placeholder: H ? "{\n \"nodes\": [],\n \"edges\": []\n}" : "{\n \"manifestVersion\": \"1.0\",\n \"identity\": { \"name\": \"My Item\", \"version\": \"1.0.0\" }\n}",
581
- value: A.manifestJson,
582
- onChange: (e) => j({
583
- ...A,
584
- manifestJson: e.target.value
585
- }),
616
+ value: k.manifestJson,
617
+ onChange: (e) => {
618
+ let t = _(e.target.value);
619
+ A({
620
+ ...k,
621
+ manifestJson: e.target.value,
622
+ ...t ? { version: t } : {}
623
+ });
624
+ },
586
625
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
587
626
  }),
588
627
  /* @__PURE__ */ h("p", {
@@ -613,33 +652,33 @@ var Te = () => {
613
652
  className: "flex gap-2 items-center",
614
653
  children: [
615
654
  /* @__PURE__ */ h("input", {
616
- ref: je,
655
+ ref: Ne,
617
656
  type: "file",
618
657
  accept: ".zip",
619
658
  className: "hidden",
620
- onChange: lt
659
+ onChange: ft
621
660
  }),
622
661
  /* @__PURE__ */ h("button", {
623
662
  type: "button",
624
663
  disabled: C,
625
- onClick: () => je.current?.click(),
664
+ onClick: () => Ne.current?.click(),
626
665
  className: "inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
627
666
  children: C ? /* @__PURE__ */ g(m, { children: [
628
- /* @__PURE__ */ h(d, {
667
+ /* @__PURE__ */ h(be, {
629
668
  size: 14,
630
669
  className: "animate-spin"
631
670
  }),
632
671
  " ",
633
672
  "Uploading… ",
634
- Ae,
673
+ Me,
635
674
  "%"
636
675
  ] }) : /* @__PURE__ */ g(m, { children: [
637
676
  /* @__PURE__ */ h(p, { size: 14 }),
638
677
  " ",
639
- A.packageUrl ? "Replace zip" : "Upload zip"
678
+ k.packageUrl ? "Replace zip" : "Upload zip"
640
679
  ] })
641
680
  }),
642
- A.packageUrl && !C && /* @__PURE__ */ h("span", {
681
+ k.packageUrl && !C && /* @__PURE__ */ h("span", {
643
682
  className: "text-xs text-status-success-text",
644
683
  children: "✓ Uploaded"
645
684
  })
@@ -673,20 +712,20 @@ var Te = () => {
673
712
  }), /* @__PURE__ */ g("div", {
674
713
  className: "flex items-center gap-2",
675
714
  children: [
676
- Fe && /* @__PURE__ */ g("span", {
715
+ Le && /* @__PURE__ */ g("span", {
677
716
  className: "text-xs text-status-success-text",
678
- children: ["✓ ", Fe]
717
+ children: ["✓ ", Le]
679
718
  }),
680
719
  /* @__PURE__ */ h("input", {
681
- ref: Me,
720
+ ref: Pe,
682
721
  type: "file",
683
722
  accept: ".json,application/json",
684
723
  className: "hidden",
685
- onChange: We
724
+ onChange: Ke
686
725
  }),
687
726
  /* @__PURE__ */ g("button", {
688
727
  type: "button",
689
- onClick: () => Me.current?.click(),
728
+ onClick: () => Pe.current?.click(),
690
729
  className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-2.5 py-1 text-xs font-medium hover:bg-bg-sunken transition-colors",
691
730
  children: [/* @__PURE__ */ h(p, { size: 12 }), "Upload manifest.json"]
692
731
  })
@@ -696,11 +735,14 @@ var Te = () => {
696
735
  /* @__PURE__ */ h("textarea", {
697
736
  rows: 5,
698
737
  placeholder: "{\n \"manifestVersion\": \"1.0\",\n \"itemType\": \"node\",\n \"identity\": { \"version\": \"1.0.0\", \"displayName\": \"My Node\" }\n}",
699
- value: A.manifestJson,
738
+ value: k.manifestJson,
700
739
  onChange: (e) => {
701
- T(null), j({
702
- ...A,
703
- manifestJson: e.target.value
740
+ Re(null);
741
+ let t = _(e.target.value);
742
+ A({
743
+ ...k,
744
+ manifestJson: e.target.value,
745
+ ...t ? { version: t } : {}
704
746
  });
705
747
  },
706
748
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
@@ -715,7 +757,7 @@ var Te = () => {
715
757
  })
716
758
  ]
717
759
  }),
718
- Ke && /* @__PURE__ */ g("div", {
760
+ Je && /* @__PURE__ */ g("div", {
719
761
  className: "space-y-1",
720
762
  children: [
721
763
  /* @__PURE__ */ g("label", {
@@ -731,9 +773,9 @@ var Te = () => {
731
773
  }),
732
774
  /* @__PURE__ */ h("input", {
733
775
  type: "text",
734
- value: A.requiredScopes,
735
- onChange: (e) => j({
736
- ...A,
776
+ value: k.requiredScopes,
777
+ onChange: (e) => A({
778
+ ...k,
737
779
  requiredScopes: e.target.value
738
780
  }),
739
781
  placeholder: "e.g. read:contacts, write:messages",
@@ -746,23 +788,23 @@ var Te = () => {
746
788
  ]
747
789
  }),
748
790
  /* @__PURE__ */ h(a, {
749
- label: _("devportal.releaseNotes", "Release Notes"),
750
- value: A.releaseNotes,
751
- onChange: (e) => j({
752
- ...A,
791
+ label: v("devportal.releaseNotes", "Release Notes"),
792
+ value: k.releaseNotes,
793
+ onChange: (e) => A({
794
+ ...k,
753
795
  releaseNotes: e
754
796
  }),
755
- placeholder: _("devportal.releaseNotesPlaceholder", "What changed in this release?"),
797
+ placeholder: v("devportal.releaseNotesPlaceholder", "What changed in this release?"),
756
798
  rows: 3
757
799
  }),
758
800
  /* @__PURE__ */ h(a, {
759
- label: _("devportal.changelog", "Changelog"),
760
- value: A.changelog,
761
- onChange: (e) => j({
762
- ...A,
801
+ label: v("devportal.changelog", "Changelog"),
802
+ value: k.changelog,
803
+ onChange: (e) => A({
804
+ ...k,
763
805
  changelog: e
764
806
  }),
765
- placeholder: _("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
807
+ placeholder: v("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
766
808
  rows: 3
767
809
  })
768
810
  ]
@@ -771,12 +813,12 @@ var Te = () => {
771
813
  L && /* @__PURE__ */ h(i, {
772
814
  open: !!L,
773
815
  onOpenChange: (e) => {
774
- e || (Ue(null), z(""));
816
+ e || (Ge(null), z(""));
775
817
  },
776
- onConfirm: ht,
818
+ onConfirm: vt,
777
819
  title: `Reject version ${L.version}`,
778
820
  confirmLabel: "Reject Version",
779
- cancelLabel: _("devportal.cancel", "Cancel"),
821
+ cancelLabel: v("devportal.cancel", "Cancel"),
780
822
  variant: "danger",
781
823
  children: /* @__PURE__ */ g("div", {
782
824
  className: "space-y-3",
@@ -805,23 +847,23 @@ var Te = () => {
805
847
  })]
806
848
  })
807
849
  }),
808
- O && /* @__PURE__ */ h(i, {
809
- open: !!O,
850
+ D && /* @__PURE__ */ h(i, {
851
+ open: !!D,
810
852
  onOpenChange: (e) => {
811
- e || (k(null), E(null), F(null));
853
+ e || (O(null), T(null), P(null));
812
854
  },
813
- onConfirm: ft,
814
- title: `Edit Version ${O.version}`,
815
- confirmLabel: tt ? "Saving…" : "Save Changes",
855
+ onConfirm: ht,
856
+ title: `Edit Version ${D.version}`,
857
+ confirmLabel: it ? "Saving…" : "Save Changes",
816
858
  children: /* @__PURE__ */ g("div", {
817
859
  className: "space-y-4",
818
860
  children: [
819
- Ve && /* @__PURE__ */ g("div", {
861
+ We && /* @__PURE__ */ g("div", {
820
862
  className: "rounded-lg border border-status-error-bg bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
821
- children: [/* @__PURE__ */ h(u, {
863
+ children: [/* @__PURE__ */ h(d, {
822
864
  size: 14,
823
865
  className: "flex-shrink-0"
824
- }), Ve]
866
+ }), We]
825
867
  }),
826
868
  /* @__PURE__ */ h("div", {
827
869
  className: "rounded-lg border border-status-info-bg bg-status-info-bg-subtle px-3 py-2 text-xs text-status-info-text",
@@ -838,33 +880,33 @@ var Te = () => {
838
880
  className: "flex gap-2 items-center",
839
881
  children: [
840
882
  /* @__PURE__ */ h("input", {
841
- ref: Ne,
883
+ ref: Fe,
842
884
  type: "file",
843
885
  accept: ".zip",
844
886
  className: "hidden",
845
- onChange: ut
887
+ onChange: pt
846
888
  }),
847
889
  /* @__PURE__ */ h("button", {
848
890
  type: "button",
849
891
  disabled: C,
850
- onClick: () => Ne.current?.click(),
892
+ onClick: () => Fe.current?.click(),
851
893
  className: "inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
852
894
  children: C ? /* @__PURE__ */ g(m, { children: [
853
- /* @__PURE__ */ h(d, {
895
+ /* @__PURE__ */ h(be, {
854
896
  size: 14,
855
897
  className: "animate-spin"
856
898
  }),
857
899
  " ",
858
900
  "Uploading… ",
859
- Ae,
901
+ Me,
860
902
  "%"
861
- ] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(p, { size: 14 }), O.newPackageUrl ? "Replace zip again" : O.hasExistingZip ? "Replace zip" : "Upload zip"] })
903
+ ] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(p, { size: 14 }), D.newPackageUrl ? "Replace zip again" : D.hasExistingZip ? "Replace zip" : "Upload zip"] })
862
904
  }),
863
- O.newPackageUrl && !C && /* @__PURE__ */ h("span", {
905
+ D.newPackageUrl && !C && /* @__PURE__ */ h("span", {
864
906
  className: "text-xs text-status-success-text",
865
907
  children: "✓ New zip ready"
866
908
  }),
867
- !O.newPackageUrl && O.hasExistingZip && /* @__PURE__ */ h("span", {
909
+ !D.newPackageUrl && D.hasExistingZip && /* @__PURE__ */ h("span", {
868
910
  className: "text-xs text-text-secondary",
869
911
  children: "Current zip kept"
870
912
  })
@@ -893,20 +935,20 @@ var Te = () => {
893
935
  }), /* @__PURE__ */ g("div", {
894
936
  className: "flex items-center gap-2",
895
937
  children: [
896
- Ie && /* @__PURE__ */ g("span", {
938
+ ze && /* @__PURE__ */ g("span", {
897
939
  className: "text-xs text-status-success-text",
898
- children: ["✓ ", Ie]
940
+ children: ["✓ ", ze]
899
941
  }),
900
942
  /* @__PURE__ */ h("input", {
901
- ref: Pe,
943
+ ref: Ie,
902
944
  type: "file",
903
945
  accept: ".json,application/json",
904
946
  className: "hidden",
905
- onChange: dt
947
+ onChange: mt
906
948
  }),
907
949
  /* @__PURE__ */ g("button", {
908
950
  type: "button",
909
- onClick: () => Pe.current?.click(),
951
+ onClick: () => Ie.current?.click(),
910
952
  className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-2.5 py-1 text-xs font-medium hover:bg-bg-sunken transition-colors",
911
953
  children: [/* @__PURE__ */ h(p, { size: 12 }), " Upload manifest.json"]
912
954
  })
@@ -915,9 +957,9 @@ var Te = () => {
915
957
  }), /* @__PURE__ */ h("textarea", {
916
958
  rows: 5,
917
959
  placeholder: "{\n \"manifestVersion\": \"1.0\",\n \"itemType\": \"node\",\n \"identity\": { \"version\": \"1.0.0\", \"displayName\": \"My Node\" }\n}",
918
- value: O.manifestJson,
960
+ value: D.manifestJson,
919
961
  onChange: (e) => {
920
- E(null), k((t) => t && {
962
+ T(null), O((t) => t && {
921
963
  ...t,
922
964
  manifestJson: e.target.value
923
965
  });
@@ -940,8 +982,8 @@ var Te = () => {
940
982
  }), /* @__PURE__ */ h("textarea", {
941
983
  rows: 10,
942
984
  placeholder: H ? "{\n \"nodes\": [],\n \"edges\": []\n}" : "{\n \"manifestVersion\": \"1.0\",\n \"identity\": { \"name\": \"My Item\", \"version\": \"1.0.0\" }\n}",
943
- value: O.manifestJson,
944
- onChange: (e) => k((t) => t && {
985
+ value: D.manifestJson,
986
+ onChange: (e) => O((t) => t && {
945
987
  ...t,
946
988
  manifestJson: e.target.value
947
989
  }),
@@ -949,60 +991,50 @@ var Te = () => {
949
991
  })]
950
992
  }),
951
993
  /* @__PURE__ */ h(a, {
952
- label: _("devportal.releaseNotes", "Release Notes"),
953
- value: O.releaseNotes,
954
- onChange: (e) => k((t) => t && {
994
+ label: v("devportal.releaseNotes", "Release Notes"),
995
+ value: D.releaseNotes,
996
+ onChange: (e) => O((t) => t && {
955
997
  ...t,
956
998
  releaseNotes: e
957
999
  }),
958
- placeholder: _("devportal.releaseNotesPlaceholder", "What changed in this release?"),
1000
+ placeholder: v("devportal.releaseNotesPlaceholder", "What changed in this release?"),
959
1001
  rows: 3
960
1002
  }),
961
1003
  /* @__PURE__ */ h(a, {
962
- label: _("devportal.changelog", "Changelog"),
963
- value: O.changelog,
964
- onChange: (e) => k((t) => t && {
1004
+ label: v("devportal.changelog", "Changelog"),
1005
+ value: D.changelog,
1006
+ onChange: (e) => O((t) => t && {
965
1007
  ...t,
966
1008
  changelog: e
967
1009
  }),
968
- placeholder: _("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
1010
+ placeholder: v("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
969
1011
  rows: 3
970
1012
  })
971
1013
  ]
972
1014
  })
973
1015
  }),
974
1016
  /* @__PURE__ */ h(i, {
975
- open: Ge === "publish",
1017
+ open: qe === "publish",
976
1018
  onOpenChange: (e) => {
977
1019
  e || B(null);
978
1020
  },
979
- onConfirm: async () => {
980
- if (Z.length === 0) return;
981
- M(null);
982
- let e = await Promise.allSettled(Z.map((e) => nt({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
983
- N(`Published ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), yt(), B(null);
984
- },
985
- title: _("devportal.submitSelectedVersions", "Submit selected versions for review"),
986
- description: `Submit ${Z.length} selected version${Z.length === 1 ? "" : "s"} for platform review?`,
987
- confirmLabel: _("devportal.submitForReview", "Submit for Review"),
988
- cancelLabel: _("devportal.cancel", "Cancel"),
1021
+ onConfirm: St,
1022
+ title: v("devportal.submitSelectedVersions", "Submit selected versions for review"),
1023
+ description: `Submit ${X.length} selected version${X.length === 1 ? "" : "s"} for platform review?`,
1024
+ confirmLabel: v("devportal.submitForReview", "Submit for Review"),
1025
+ cancelLabel: v("devportal.cancel", "Cancel"),
989
1026
  variant: "success"
990
1027
  }),
991
1028
  /* @__PURE__ */ h(i, {
992
- open: Ge === "deprecate",
1029
+ open: qe === "deprecate",
993
1030
  onOpenChange: (e) => {
994
1031
  e || B(null);
995
1032
  },
996
- onConfirm: async () => {
997
- if ($.length === 0) return;
998
- M(null);
999
- let e = await Promise.allSettled($.map((e) => rt({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
1000
- N(`Deprecated ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), yt(), B(null);
1001
- },
1002
- title: _("devportal.deprecateSelectedVersions", "Deprecate selected versions"),
1003
- description: `${_("devportal.deprecate", "Deprecate")} ${$.length} selected version${$.length === 1 ? "" : "s"}? ${_("devportal.deprecateVersionsWarning", "Deprecated versions remain visible but should no longer be promoted.")}`,
1004
- confirmLabel: _("devportal.deprecate", "Deprecate"),
1005
- cancelLabel: _("devportal.cancel", "Cancel"),
1033
+ onConfirm: Ct,
1034
+ title: v("devportal.deprecateSelectedVersions", "Deprecate selected versions"),
1035
+ description: `${v("devportal.deprecate", "Deprecate")} ${Q.length} selected version${Q.length === 1 ? "" : "s"}? ${v("devportal.deprecateVersionsWarning", "Deprecated versions remain visible but should no longer be promoted.")}`,
1036
+ confirmLabel: v("devportal.deprecate", "Deprecate"),
1037
+ cancelLabel: v("devportal.cancel", "Cancel"),
1006
1038
  variant: "warning"
1007
1039
  })
1008
1040
  ]
@@ -1010,6 +1042,6 @@ var Te = () => {
1010
1042
  });
1011
1043
  };
1012
1044
  //#endregion
1013
- export { Te as ApplicationVersionsPage };
1045
+ export { Ee as ApplicationVersionsPage };
1014
1046
 
1015
1047
  //# sourceMappingURL=ApplicationVersionsPage.js.map