@cobaltcore-dev/aurora 1.3.0 → 2.1.0

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 (150) hide show
  1. package/dist/client/ContentHeader-fKKZVu-o.mjs +116 -0
  2. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +1 -0
  3. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs +802 -0
  4. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs.map +1 -0
  5. package/dist/client/{FiltersInput-CKI6zWnm.mjs → FiltersInput-Becwxo_J.mjs} +36 -33
  6. package/dist/client/FiltersInput-Becwxo_J.mjs.map +1 -0
  7. package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs → FloatingIpActionModals-Cq10WljB.mjs} +2 -2
  8. package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs.map → FloatingIpActionModals-Cq10WljB.mjs.map} +1 -1
  9. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +1135 -0
  10. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +1 -0
  11. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +26 -0
  12. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +1 -0
  13. package/dist/client/StorageNotFound-B-zVinVD.mjs +30 -0
  14. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +1 -0
  15. package/dist/client/_flavorId-0PioWpEp.mjs +276 -0
  16. package/dist/client/_flavorId-0PioWpEp.mjs.map +1 -0
  17. package/dist/client/_flavorId-B7fp6Nk8.mjs +22 -0
  18. package/dist/client/_flavorId-B7fp6Nk8.mjs.map +1 -0
  19. package/dist/client/{_flavorId-Dg7MS0Af.mjs → _flavorId-CgueqKTs.mjs} +4 -3
  20. package/dist/client/_flavorId-CgueqKTs.mjs.map +1 -0
  21. package/dist/client/{_floatingIpId-DNn6ABCB.mjs → _floatingIpId-B8r64AL9.mjs} +6 -6
  22. package/dist/client/{_floatingIpId-DNn6ABCB.mjs.map → _floatingIpId-B8r64AL9.mjs.map} +1 -1
  23. package/dist/client/{_floatingIpId-C9xfRWot.mjs → _floatingIpId-lEobpOER.mjs} +2 -2
  24. package/dist/client/{_floatingIpId-C9xfRWot.mjs.map → _floatingIpId-lEobpOER.mjs.map} +1 -1
  25. package/dist/client/{_imageId-8JIbFmGB.mjs → _imageId-Ccv8PedW.mjs} +4 -3
  26. package/dist/client/_imageId-Ccv8PedW.mjs.map +1 -0
  27. package/dist/client/_imageId-CiqEQB_J.mjs +558 -0
  28. package/dist/client/_imageId-CiqEQB_J.mjs.map +1 -0
  29. package/dist/client/_imageId-D9LR-02T.mjs +22 -0
  30. package/dist/client/_imageId-D9LR-02T.mjs.map +1 -0
  31. package/dist/client/{_projectId-DPzv0CCp.mjs → _projectId-BDARsteX.mjs} +4 -4
  32. package/dist/client/_projectId-BDARsteX.mjs.map +1 -0
  33. package/dist/client/{_projectId-DfeVJy0G.mjs → _projectId-CtyAHqhH.mjs} +2 -2
  34. package/dist/client/_projectId-CtyAHqhH.mjs.map +1 -0
  35. package/dist/client/_projectId-D3VOH5lN.mjs +94 -0
  36. package/dist/client/_projectId-D3VOH5lN.mjs.map +1 -0
  37. package/dist/client/{_projectId-B3wmSala.mjs → _projectId-ZBk6vka0.mjs} +83 -81
  38. package/dist/client/_projectId-ZBk6vka0.mjs.map +1 -0
  39. package/dist/client/{_securityGroupId-C6eHmrx_.mjs → _securityGroupId-BwgZnoiR.mjs} +2 -2
  40. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +1 -0
  41. package/dist/client/{_securityGroupId-DmplhDgt.mjs → _securityGroupId-Cz2NUHdB.mjs} +750 -741
  42. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +1 -0
  43. package/dist/client/{_storageType-CzZ4u9x_.mjs → _storageType-BNpP1A2N.mjs} +3 -2
  44. package/dist/client/_storageType-BNpP1A2N.mjs.map +1 -0
  45. package/dist/client/_storageType-BxSGKhAI.mjs +15 -0
  46. package/dist/client/_storageType-BxSGKhAI.mjs.map +1 -0
  47. package/dist/client/_storageType-DZYCmiLt.mjs +30 -0
  48. package/dist/client/_storageType-DZYCmiLt.mjs.map +1 -0
  49. package/dist/client/_storageType-UqAMP-8d.mjs +859 -0
  50. package/dist/client/_storageType-UqAMP-8d.mjs.map +1 -0
  51. package/dist/client/_storageType-u51_7OwJ.mjs +7 -0
  52. package/dist/client/_storageType-u51_7OwJ.mjs.map +1 -0
  53. package/dist/client/components/{Error → Errors}/RouteError.d.ts +5 -0
  54. package/dist/client/components/Errors/RouteIdLevelDefaultError.d.ts +18 -0
  55. package/dist/client/components/Errors/ServiceLevelDefaultError.d.ts +9 -0
  56. package/dist/client/components/ListToolbar/SelectedFilters.d.ts +7 -2
  57. package/dist/client/components/ListToolbar/types.d.ts +6 -0
  58. package/dist/client/components/ListToolbar/valueLabels.d.ts +11 -0
  59. package/dist/client/{flavors-B1SDOPDu.mjs → flavors-Ce3J-cFa.mjs} +2 -2
  60. package/dist/client/{flavors-B1SDOPDu.mjs.map → flavors-Ce3J-cFa.mjs.map} +1 -1
  61. package/dist/client/flavors-D5ThLaXO.mjs +666 -0
  62. package/dist/client/flavors-D5ThLaXO.mjs.map +1 -0
  63. package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -1
  64. package/dist/client/{floatingips-DrCvtXtT.mjs → floatingips-DXnRlLvV.mjs} +7 -7
  65. package/dist/client/{floatingips-DrCvtXtT.mjs.map → floatingips-DXnRlLvV.mjs.map} +1 -1
  66. package/dist/client/floatingips-HRbuLxiN.mjs +22 -0
  67. package/dist/client/floatingips-HRbuLxiN.mjs.map +1 -0
  68. package/dist/client/floatingips-nN1kQmsu.mjs +14 -0
  69. package/dist/client/floatingips-nN1kQmsu.mjs.map +1 -0
  70. package/dist/client/{images-BGQv9kKT.mjs → images-C8M3ysWR.mjs} +810 -770
  71. package/dist/client/images-C8M3ysWR.mjs.map +1 -0
  72. package/dist/client/{images-CPmMa4SQ.mjs → images-Cf5R28NR.mjs} +2 -2
  73. package/dist/client/{images-CPmMa4SQ.mjs.map → images-Cf5R28NR.mjs.map} +1 -1
  74. package/dist/client/index.js +419 -415
  75. package/dist/client/index.js.map +1 -1
  76. package/dist/client/{objects-BR3eeSNH.mjs → objects-BudUAfWY.mjs} +5478 -5519
  77. package/dist/client/objects-BudUAfWY.mjs.map +1 -0
  78. package/dist/client/objects-Dc7sKUr8.mjs +67 -0
  79. package/dist/client/objects-Dc7sKUr8.mjs.map +1 -0
  80. package/dist/client/objects-Dw7oeTq2.mjs +80 -0
  81. package/dist/client/objects-Dw7oeTq2.mjs.map +1 -0
  82. package/dist/client/objects-_g7nGIn5.mjs +25 -0
  83. package/dist/client/objects-_g7nGIn5.mjs.map +1 -0
  84. package/dist/client/objects-eBxvY6_n.mjs +78 -0
  85. package/dist/client/objects-eBxvY6_n.mjs.map +1 -0
  86. package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
  87. package/dist/client/{securitygroups-DEJQBcxm.mjs → securitygroups-67fFxiwt.mjs} +2 -2
  88. package/dist/client/{securitygroups-DEJQBcxm.mjs.map → securitygroups-67fFxiwt.mjs.map} +1 -1
  89. package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -1
  90. package/dist/client/securitygroups-DXrfyuVF.mjs +580 -0
  91. package/dist/client/securitygroups-DXrfyuVF.mjs.map +1 -0
  92. package/dist/client/securitygroups-WLB1_IM6.mjs +22 -0
  93. package/dist/client/securitygroups-WLB1_IM6.mjs.map +1 -0
  94. package/dist/client/securitygroups-o0IXZM6S.mjs +14 -0
  95. package/dist/client/securitygroups-o0IXZM6S.mjs.map +1 -0
  96. package/dist/client/serviceCatalog-B3lKWC9V.mjs +6 -0
  97. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +1 -0
  98. package/dist/client/storageProviders-CJ5rOh13.mjs +15 -0
  99. package/dist/client/storageProviders-CJ5rOh13.mjs.map +1 -0
  100. package/dist/client/trpcClient.d.ts +102 -4
  101. package/dist/client/useModalTracking-BYd37pXm.mjs +37 -0
  102. package/dist/client/useModalTracking-BYd37pXm.mjs.map +1 -0
  103. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +294 -0
  104. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +1 -0
  105. package/dist/client/utils/serviceCatalog.d.ts +9 -0
  106. package/dist/client/utils/storageProviders.d.ts +44 -0
  107. package/dist/server/index.d.ts +102 -4
  108. package/dist/server/index.js +1319 -416
  109. package/package.json +4 -4
  110. package/dist/client/ContentHeader-CPJbgYWn.mjs +0 -115
  111. package/dist/client/ContentHeader-CPJbgYWn.mjs.map +0 -1
  112. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +0 -773
  113. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +0 -1
  114. package/dist/client/FiltersInput-CKI6zWnm.mjs.map +0 -1
  115. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +0 -1152
  116. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +0 -1
  117. package/dist/client/_flavorId-Dg7MS0Af.mjs.map +0 -1
  118. package/dist/client/_flavorId-kHl-b8rI.mjs +0 -232
  119. package/dist/client/_flavorId-kHl-b8rI.mjs.map +0 -1
  120. package/dist/client/_imageId-8JIbFmGB.mjs.map +0 -1
  121. package/dist/client/_imageId-BBAlRioC.mjs +0 -574
  122. package/dist/client/_imageId-BBAlRioC.mjs.map +0 -1
  123. package/dist/client/_projectId-7Nl1MQTJ.mjs +0 -99
  124. package/dist/client/_projectId-7Nl1MQTJ.mjs.map +0 -1
  125. package/dist/client/_projectId-B3wmSala.mjs.map +0 -1
  126. package/dist/client/_projectId-DPzv0CCp.mjs.map +0 -1
  127. package/dist/client/_projectId-DfeVJy0G.mjs.map +0 -1
  128. package/dist/client/_securityGroupId-C6eHmrx_.mjs.map +0 -1
  129. package/dist/client/_securityGroupId-DmplhDgt.mjs.map +0 -1
  130. package/dist/client/_storageType-BRWWJtow.mjs +0 -14
  131. package/dist/client/_storageType-BRWWJtow.mjs.map +0 -1
  132. package/dist/client/_storageType-C5gS9eut.mjs +0 -845
  133. package/dist/client/_storageType-C5gS9eut.mjs.map +0 -1
  134. package/dist/client/_storageType-CzZ4u9x_.mjs.map +0 -1
  135. package/dist/client/_storageType-zeSZe--V.mjs +0 -7
  136. package/dist/client/_storageType-zeSZe--V.mjs.map +0 -1
  137. package/dist/client/flavors-D8_PzQUB.mjs +0 -628
  138. package/dist/client/flavors-D8_PzQUB.mjs.map +0 -1
  139. package/dist/client/images-BGQv9kKT.mjs.map +0 -1
  140. package/dist/client/objects-AERkhfiM.mjs +0 -66
  141. package/dist/client/objects-AERkhfiM.mjs.map +0 -1
  142. package/dist/client/objects-BR3eeSNH.mjs.map +0 -1
  143. package/dist/client/objects-DVccbrL1.mjs +0 -66
  144. package/dist/client/objects-DVccbrL1.mjs.map +0 -1
  145. package/dist/client/securitygroups-BjhgLBHm.mjs +0 -620
  146. package/dist/client/securitygroups-BjhgLBHm.mjs.map +0 -1
  147. package/dist/client/useModalTracking-BcOKTYRN.mjs +0 -33
  148. package/dist/client/useModalTracking-BcOKTYRN.mjs.map +0 -1
  149. package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs +0 -227
  150. package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +0 -1
@@ -0,0 +1,294 @@
1
+ import { K as e, L as t, M as n, P as r, Q as i, X as a, ft as o, h as s, i as c, lt as l, m as u, p as d, rt as f } from "./build-WuxXRAqf.mjs";
2
+ import { a as p } from "./trpcClient-D7gpR7YG.mjs";
3
+ import { t as m } from "./useModalTracking-BYd37pXm.mjs";
4
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
5
+ import { useEffect as _, useState as v } from "react";
6
+ import { Trans as y, useLingui as b } from "@lingui/react";
7
+ import { z as x } from "zod";
8
+ import { useForm as S, useStore as C } from "@tanstack/react-form";
9
+ //#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupToastNotifications.tsx
10
+ var w = (e) => ({
11
+ message: /*#__PURE__*/ h(y, { id: "FT6BiH" }),
12
+ description: /*#__PURE__*/ h(y, {
13
+ id: "+rAGXM",
14
+ values: { name: e }
15
+ })
16
+ }), T = (e) => ({
17
+ message: /*#__PURE__*/ h(y, { id: "xc8SHc" }),
18
+ description: /*#__PURE__*/ h(y, {
19
+ id: "K4twCt",
20
+ values: { errorMessage: e }
21
+ })
22
+ }), E = (e) => ({
23
+ message: /*#__PURE__*/ h(y, { id: "pySxXV" }),
24
+ description: /*#__PURE__*/ h(y, {
25
+ id: "/GSSFQ",
26
+ values: { name: e }
27
+ })
28
+ }), D = (e) => ({
29
+ message: /*#__PURE__*/ h(y, { id: "9PnW2j" }),
30
+ description: /*#__PURE__*/ h(y, {
31
+ id: "6x1HCw",
32
+ values: { errorMessage: e }
33
+ })
34
+ }), O = () => ({
35
+ message: /*#__PURE__*/ h(y, { id: "3qYWKy" }),
36
+ description: /*#__PURE__*/ h(y, { id: "8Xn6tg" })
37
+ }), k = (e) => ({
38
+ message: /*#__PURE__*/ h(y, { id: "3cksfP" }),
39
+ description: /*#__PURE__*/ h(y, {
40
+ id: "nqaM9R",
41
+ values: { errorMessage: e }
42
+ })
43
+ }), A = () => ({
44
+ message: /*#__PURE__*/ h(y, { id: "ygiW4d" }),
45
+ description: /*#__PURE__*/ h(y, { id: "lbxRVC" })
46
+ }), j = (e) => ({
47
+ message: /*#__PURE__*/ h(y, { id: "qToFUF" }),
48
+ description: /*#__PURE__*/ h(y, {
49
+ id: "/9TcRw",
50
+ values: { errorMessage: e }
51
+ })
52
+ }), M = (e) => ({
53
+ message: /*#__PURE__*/ h(y, { id: "CpPgKl" }),
54
+ description: /*#__PURE__*/ h(y, {
55
+ id: "3Gviib",
56
+ values: { targetTenant: e }
57
+ })
58
+ }), N = (e) => ({
59
+ message: /*#__PURE__*/ h(y, { id: "7xCEph" }),
60
+ description: /*#__PURE__*/ h(y, {
61
+ id: "tXYQKw",
62
+ values: { errorMessage: e }
63
+ })
64
+ }), P = (e) => ({
65
+ message: /*#__PURE__*/ h(y, { id: "+lwzZX" }),
66
+ description: /*#__PURE__*/ h(y, {
67
+ id: "+W6219",
68
+ values: { targetTenant: e }
69
+ })
70
+ }), F = (e) => ({
71
+ message: /*#__PURE__*/ h(y, { id: "YmvhrF" }),
72
+ description: /*#__PURE__*/ h(y, {
73
+ id: "Pc3uze",
74
+ values: { errorMessage: e }
75
+ })
76
+ }), I = ({ securityGroup: i, open: p, onClose: m, onUpdate: x, isLoading: S = !1, error: C = null }) => {
77
+ let { i18n: w, _: T } = b(), [E, D] = v({
78
+ name: i.name || "",
79
+ description: i.description || ""
80
+ }), [O, k] = v({});
81
+ _(() => {
82
+ D({
83
+ name: i.name || "",
84
+ description: i.description || ""
85
+ });
86
+ }, [i]);
87
+ let A = (e) => {
88
+ let { name: t, value: n, type: r } = e.target, i = e.target.checked;
89
+ D((e) => ({
90
+ ...e,
91
+ [t]: r === "checkbox" ? i : n
92
+ })), O[t] && k((e) => {
93
+ let n = { ...e };
94
+ return delete n[t], n;
95
+ });
96
+ }, j = () => {
97
+ let e = {};
98
+ return (!E.name || E.name.trim() === "") && (e.name = w._({ id: "lN/Z9n" })), k(e), Object.keys(e).length === 0;
99
+ }, M = async (e) => {
100
+ if (e.preventDefault(), j() && x) {
101
+ let e = {
102
+ name: E.name.trim(),
103
+ description: E.description.trim() || void 0
104
+ };
105
+ await x(i.id, e);
106
+ }
107
+ }, N = () => {
108
+ k({}), m();
109
+ };
110
+ return /*#__PURE__*/ g(a, {
111
+ open: p,
112
+ onCancel: N,
113
+ size: "large",
114
+ title: w._({ id: "yu9G3x" }),
115
+ modalFooter: /*#__PURE__*/ h(r, {
116
+ className: "flex justify-end",
117
+ children: /*#__PURE__*/ g(n, { children: [/*#__PURE__*/ h(c, {
118
+ variant: "default",
119
+ onClick: N,
120
+ disabled: S,
121
+ children: /*#__PURE__*/ h(y, { id: "dEgA5A" })
122
+ }), /*#__PURE__*/ h(c, {
123
+ variant: "primary",
124
+ onClick: (e) => {
125
+ M(e);
126
+ },
127
+ disabled: S,
128
+ "data-testid": "update-security-group-button",
129
+ children: S ? /*#__PURE__*/ h(e, { size: "small" }) : /*#__PURE__*/ h(y, { id: "Df0YHr" })
130
+ })] })
131
+ }),
132
+ children: [
133
+ C && /*#__PURE__*/ h(t, {
134
+ dismissible: !1,
135
+ variant: "error",
136
+ className: "mb-4",
137
+ children: C
138
+ }),
139
+ S && /*#__PURE__*/ h(f, {
140
+ status: "progress",
141
+ title: w._({ id: "IYS5YX" }),
142
+ className: "mt-0"
143
+ }),
144
+ !S && /*#__PURE__*/ h(o, {
145
+ className: "mb-6",
146
+ children: /*#__PURE__*/ g(d, {
147
+ className: "mb-6",
148
+ children: [/*#__PURE__*/ h(s, {
149
+ className: "mb-6",
150
+ children: /*#__PURE__*/ h(u, {
151
+ id: "name",
152
+ name: "name",
153
+ label: w._({ id: "6YtxFj" }),
154
+ value: E.name,
155
+ onChange: A,
156
+ required: !0,
157
+ errortext: O.name,
158
+ placeholder: w._({ id: "Ac6dy9" }),
159
+ disabled: S
160
+ })
161
+ }), /*#__PURE__*/ h(s, {
162
+ className: "mb-6",
163
+ children: /*#__PURE__*/ h(l, {
164
+ id: "description",
165
+ name: "description",
166
+ label: w._({ id: "Nu4oKW" }),
167
+ value: E.description,
168
+ onChange: A,
169
+ placeholder: w._({ id: "Nu4oKW" }),
170
+ disabled: S,
171
+ rows: 3
172
+ })
173
+ })]
174
+ })
175
+ })
176
+ ]
177
+ });
178
+ }, L = ({ isOpen: e, onClose: n, securityGroup: r, onDelete: s, isDeleting: c = !1, error: l = null }) => {
179
+ let { i18n: f, _: p } = b(), { trackClose: _, markSubmitted: v, resetTracking: w } = m({
180
+ isOpen: e,
181
+ actionPrefix: "network.securitygroup.delete"
182
+ }), T = x.object({ confirm: x.string().refine((e) => e === "delete", { message: f._({ id: "QytzQr" }) }) }), E = S({
183
+ defaultValues: { confirm: "" },
184
+ validators: { onSubmit: T },
185
+ onSubmit: async () => {
186
+ c || (v(), s(r.id));
187
+ }
188
+ }), D = C(E.store, (e) => e.isSubmitting || e.values.confirm !== "delete"), O = r.name || r.id;
189
+ return /*#__PURE__*/ h(a, {
190
+ open: e,
191
+ onCancel: () => {
192
+ _(), E.reset(), w(), n();
193
+ },
194
+ size: "small",
195
+ title: f._({
196
+ id: "Y+2SDm",
197
+ values: { securityGroupName: O }
198
+ }),
199
+ confirmButtonLabel: c ? f._({ id: "EF2EU9" }) : f._({ id: "bcOdok" }),
200
+ confirmButtonVariant: "primary-danger",
201
+ onConfirm: E.handleSubmit,
202
+ cancelButtonLabel: f._({ id: "dEgA5A" }),
203
+ disableConfirmButton: D || c,
204
+ disableCancelButton: c,
205
+ disableCloseButton: c,
206
+ children: /*#__PURE__*/ g(i, {
207
+ direction: "vertical",
208
+ gap: "4",
209
+ children: [
210
+ l && /*#__PURE__*/ h(t, {
211
+ variant: "error",
212
+ children: l
213
+ }),
214
+ /*#__PURE__*/ h("p", {
215
+ className: "text-theme-default",
216
+ children: /*#__PURE__*/ h(y, { id: "Qb+14I" })
217
+ }),
218
+ /*#__PURE__*/ h(o, {
219
+ className: "mb-0",
220
+ id: "delete-security-group-form",
221
+ onSubmit: (e) => {
222
+ e.preventDefault(), E.handleSubmit();
223
+ },
224
+ children: /*#__PURE__*/ h(d, { children: /*#__PURE__*/ h(E.Field, {
225
+ name: "confirm",
226
+ children: (e) => /*#__PURE__*/ h(u, {
227
+ label: f._({ id: "QytzQr" }),
228
+ id: e.name,
229
+ name: e.name,
230
+ value: e.state.value,
231
+ onChange: (t) => e.handleChange(t.target.value),
232
+ placeholder: "delete",
233
+ disabled: c,
234
+ autoComplete: "off",
235
+ autoFocus: !0,
236
+ "data-testid": "delete-confirmation-input",
237
+ required: !0
238
+ })
239
+ }) })
240
+ })
241
+ ]
242
+ })
243
+ });
244
+ };
245
+ //#endregion
246
+ //#region src/client/routes/_auth/projects/$projectId/network/securitygroups/-hooks/useSecurityGroupPermissions.ts
247
+ function R(e) {
248
+ let { data: t = {
249
+ canView: !1,
250
+ canCreate: !1,
251
+ canUpdate: !1,
252
+ canDelete: !1,
253
+ canCreateRule: !1,
254
+ canDeleteRule: !1,
255
+ canManageAccess: !1,
256
+ canViewRBAC: !1
257
+ }, isLoading: n, isError: r } = p.network.canUser.useQuery({
258
+ project_id: e || "",
259
+ permission: [
260
+ "network:security_groups:read",
261
+ "network:security_groups:create",
262
+ "network:security_groups:update",
263
+ "network:security_groups:delete",
264
+ "network:security_group_rules:create",
265
+ "network:security_group_rules:delete",
266
+ "network:rbac_policies:create",
267
+ "network:rbac_policies:delete",
268
+ "network:rbac_policies:read"
269
+ ]
270
+ }, {
271
+ enabled: !!e,
272
+ select: ([e, t, n, r, i, a, o, s, c]) => ({
273
+ canView: e,
274
+ canCreate: t,
275
+ canUpdate: n,
276
+ canDelete: r,
277
+ canCreateRule: i,
278
+ canDeleteRule: a,
279
+ canManageAccess: o && s,
280
+ canViewRBAC: c
281
+ }),
282
+ staleTime: Infinity,
283
+ gcTime: Infinity
284
+ });
285
+ return {
286
+ permissions: t,
287
+ isLoading: n,
288
+ isError: r
289
+ };
290
+ }
291
+ //#endregion
292
+ export { M as a, T as c, O as d, j as f, E as h, N as i, w as l, D as m, L as n, F as o, A as p, I as r, P as s, R as t, k as u };
293
+
294
+ //# sourceMappingURL=useSecurityGroupPermissions--hK4aR8Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSecurityGroupPermissions--hK4aR8Y.mjs","names":["getSecurityGroupDeletedToast","name","message","description","getSecurityGroupDeleteErrorToast","errorMessage","getSecurityGroupUpdatedToast","getSecurityGroupUpdateErrorToast","getSecurityGroupRuleCreatedToast","getSecurityGroupRuleCreateErrorToast","getSecurityGroupRuleDeletedToast","getSecurityGroupRuleDeleteErrorToast","getRBACPolicyAddedToast","targetTenant","getRBACPolicyAddErrorToast","getRBACPolicyDeletedToast","getRBACPolicyDeleteErrorToast","React","useState","useEffect","Modal","Form","FormRow","FormSection","TextInput","Button","ButtonRow","Spinner","ModalFooter","Textarea","Message","Status","EditSecurityGroupModal","securityGroup","open","onClose","onUpdate","isLoading","error","useLingui","properties","setProperties","name","description","errors","setErrors","handleInputChange","e","value","type","target","checked","prev","newErrors","validateForm","trim","t","Object","keys","length","handleSubmit","preventDefault","updateData","undefined","id","handleClose","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","dismissible","status","label","onChange","required","errortext","placeholder","rows","z","useForm","useStore","React","Modal","Stack","Message","Form","FormSection","TextInput","useModalTracking","DeleteSecurityGroupDialog","isOpen","onClose","securityGroup","onDelete","isDeleting","error","useLingui","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","refine","value","message","t","form","defaultValues","validators","onSubmit","id","canDelete","store","state","isSubmitting","values","securityGroupName","name","handleClose","reset","open","onCancel","size","title","confirmButtonLabel","confirmButtonVariant","onConfirm","handleSubmit","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","variant","p","className","e","preventDefault","Field","children","field","label","onChange","handleChange","target","placeholder","disabled","autoComplete","autoFocus","data-testid","required","trpcReact","useSecurityGroupPermissions","projectId","data","permissions","canView","canCreate","canUpdate","canDelete","canCreateRule","canDeleteRule","canManageAccess","canViewRBAC","isLoading","isError","network","canUser","useQuery","project_id","permission","enabled","Boolean","select","canCreateRBAC","canDeleteRBAC","staleTime","Infinity","gcTime"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupToastNotifications.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/EditSecurityGroupModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/DeleteSecurityGroupDialog.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-hooks/useSecurityGroupPermissions.ts"],"sourcesContent":["import { ReactNode } from \"react\"\nimport { NotificationOptions } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\ntype ToastReturnType = { message: ReactNode } & NotificationOptions\n\n// ── Security Group operations ──────────────────────────────────────────────\n\nexport const getSecurityGroupDeletedToast = (name: string): ToastReturnType => ({\n message: <Trans>Security Group Deleted</Trans>,\n description: <Trans>Security group \"{name}\" was successfully deleted.</Trans>,\n})\n\nexport const getSecurityGroupDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Delete Security Group</Trans>,\n description: <Trans>Could not delete security group: {errorMessage}</Trans>,\n})\n\nexport const getSecurityGroupUpdatedToast = (name: string): ToastReturnType => ({\n message: <Trans>Security Group Updated</Trans>,\n description: <Trans>Security group \"{name}\" was successfully updated.</Trans>,\n})\n\nexport const getSecurityGroupUpdateErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Update Security Group</Trans>,\n description: <Trans>Could not update security group: {errorMessage}</Trans>,\n})\n\n// ── Rule operations ────────────────────────────────────────────────────────\n\nexport const getSecurityGroupRuleCreatedToast = (): ToastReturnType => ({\n message: <Trans>Rule Created</Trans>,\n description: <Trans>Security group rule was successfully created.</Trans>,\n})\n\nexport const getSecurityGroupRuleCreateErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Create Rule</Trans>,\n description: <Trans>Could not create security group rule: {errorMessage}</Trans>,\n})\n\nexport const getSecurityGroupRuleDeletedToast = (): ToastReturnType => ({\n message: <Trans>Rule Deleted</Trans>,\n description: <Trans>Security group rule was successfully deleted.</Trans>,\n})\n\nexport const getSecurityGroupRuleDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Delete Rule</Trans>,\n description: <Trans>Could not delete security group rule: {errorMessage}</Trans>,\n})\n\n// ── RBAC Policy operations ─────────────────────────────────────────────────\n\nexport const getRBACPolicyAddedToast = (targetTenant: string): ToastReturnType => ({\n message: <Trans>Security Group Shared</Trans>,\n description: <Trans>Security group was successfully shared with project \"{targetTenant}\".</Trans>,\n})\n\nexport const getRBACPolicyAddErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Share Security Group</Trans>,\n description: <Trans>Could not share security group: {errorMessage}</Trans>,\n})\n\nexport const getRBACPolicyDeletedToast = (targetTenant: string): ToastReturnType => ({\n message: <Trans>Access Revoked</Trans>,\n description: <Trans>Access for project \"{targetTenant}\" was successfully revoked.</Trans>,\n})\n\nexport const getRBACPolicyDeleteErrorToast = (errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Revoke Access</Trans>,\n description: <Trans>Could not revoke access: {errorMessage}</Trans>,\n})\n","import React, { useState, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Button,\n ButtonRow,\n Spinner,\n ModalFooter,\n Textarea,\n Message,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport { UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\ninterface EditSecurityGroupModalProps {\n securityGroup: SecurityGroup\n open: boolean\n onClose: () => void\n onUpdate?: (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => Promise<void>\n isLoading?: boolean\n error?: string | null\n}\n\ninterface SecurityGroupProperties {\n name: string\n description: string\n}\n\nexport const EditSecurityGroupModal: React.FC<EditSecurityGroupModalProps> = ({\n securityGroup,\n open,\n onClose,\n onUpdate,\n isLoading = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const [properties, setProperties] = useState<SecurityGroupProperties>({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n })\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n // Update properties when securityGroup changes\n useEffect(() => {\n setProperties({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n })\n }, [securityGroup])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value, type } = e.target\n const checked = (e.target as HTMLInputElement).checked\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const validateForm = (): boolean => {\n const newErrors: { [key: string]: string } = {}\n\n if (!properties.name || properties.name.trim() === \"\") {\n newErrors.name = t`Security group name is required`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validateForm()) {\n return\n }\n\n if (onUpdate) {\n // Prepare base update data without stateful\n const updateData: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\"> = {\n name: properties.name.trim(),\n description: properties.description.trim() || undefined,\n }\n\n // Note: We deliberately do NOT include 'stateful' field here\n // because it requires special 'update_security_group:stateful' permission\n // which needs cloud admin role. Regular users can only update name/description.\n\n await onUpdate(securityGroup.id, updateData)\n }\n }\n\n const handleClose = () => {\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={open}\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Security Group`}\n modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={handleClose} disabled={isLoading}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary\"\n onClick={(e) => {\n handleSubmit(e)\n }}\n disabled={isLoading}\n data-testid=\"update-security-group-button\"\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Update Security Group</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n {/* Error Message */}\n {error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {error}\n </Message>\n )}\n\n {isLoading && <Status status=\"progress\" title={t`Updating Security Group...`} className=\"mt-0\" />}\n\n {!isLoading && (\n <Form className=\"mb-6\">\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-6\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n placeholder={t`Type name`}\n disabled={isLoading}\n />\n </FormRow>\n\n <FormRow className=\"mb-6\">\n <Textarea\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={properties.description}\n onChange={handleInputChange}\n placeholder={t`Description`}\n disabled={isLoading}\n rows={3}\n />\n </FormRow>\n {/* Note: Stateful checkbox is not shown here because it requires 'update_security_group:stateful' permission (cloud admin only) */}\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport React from \"react\"\nimport { Modal, Stack, Message, Form, FormSection, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\n\ninterface DeleteSecurityGroupDialogProps {\n isOpen: boolean\n securityGroup: SecurityGroup\n onClose: () => void\n onDelete: (securityGroupId: string) => void\n isDeleting?: boolean\n error?: string | null\n}\n\nexport const DeleteSecurityGroupDialog: React.FC<DeleteSecurityGroupDialogProps> = ({\n isOpen,\n onClose,\n securityGroup,\n onDelete,\n isDeleting = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"network.securitygroup.delete\",\n })\n\n const formSchema = z.object({\n confirm: z.string().refine((value) => value === \"delete\", {\n message: t`Type \"delete\" to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n confirm: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isDeleting) return\n\n markSubmitted()\n onDelete(securityGroup.id)\n },\n })\n\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.confirm !== \"delete\")\n\n const securityGroupName = securityGroup.name || securityGroup.id\n\n const handleClose = () => {\n trackClose()\n form.reset()\n resetTracking()\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"small\"\n title={t`Delete Security Group \"${securityGroupName}\"`}\n confirmButtonLabel={isDeleting ? t`Deleting...` : t`Delete Group`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={form.handleSubmit}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={canDelete || isDeleting}\n disableCancelButton={isDeleting}\n disableCloseButton={isDeleting}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {error && <Message variant=\"error\">{error}</Message>}\n\n <p className=\"text-theme-default\">\n <Trans>This action cannot be undone. The security group will be permanently deleted.</Trans>\n </p>\n\n <Form\n className=\"mb-0\"\n id=\"delete-security-group-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"confirm\"\n children={(field) => (\n <TextInput\n label={t`Type \"delete\" to confirm`}\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"delete\"\n disabled={isDeleting}\n autoComplete=\"off\"\n autoFocus\n data-testid=\"delete-confirmation-input\"\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </Stack>\n </Modal>\n )\n}\n","import { trpcReact } from \"@/client/trpcClient\"\n\nexport interface SecurityGroupPermissions {\n canView: boolean\n canCreate: boolean\n canUpdate: boolean\n canDelete: boolean\n canCreateRule: boolean\n canDeleteRule: boolean\n canManageAccess: boolean\n canViewRBAC: boolean\n}\n\n/**\n * Hook to fetch security group permissions for the current user\n * Uses React Query with infinite cache since permissions don't change during session\n */\nexport function useSecurityGroupPermissions(projectId: string) {\n const {\n data: permissions = {\n canView: false,\n canCreate: false,\n canUpdate: false,\n canDelete: false,\n canCreateRule: false,\n canDeleteRule: false,\n canManageAccess: false,\n canViewRBAC: false,\n },\n isLoading,\n isError,\n } = trpcReact.network.canUser.useQuery(\n {\n project_id: projectId || \"\",\n permission: [\n \"network:security_groups:read\",\n \"network:security_groups:create\",\n \"network:security_groups:update\",\n \"network:security_groups:delete\",\n \"network:security_group_rules:create\",\n \"network:security_group_rules:delete\",\n \"network:rbac_policies:create\",\n \"network:rbac_policies:delete\",\n \"network:rbac_policies:read\",\n ],\n },\n {\n enabled: Boolean(projectId), // Only fetch if we have a project ID\n select: ([\n canView,\n canCreate,\n canUpdate,\n canDelete,\n canCreateRule,\n canDeleteRule,\n canCreateRBAC,\n canDeleteRBAC,\n canViewRBAC,\n ]) => ({\n canView,\n canCreate,\n canUpdate,\n canDelete,\n canCreateRule,\n canDeleteRule,\n canManageAccess: canCreateRBAC && canDeleteRBAC,\n canViewRBAC,\n }),\n staleTime: Infinity, // Permissions don't change during session\n gcTime: Infinity, // Keep in cache forever (previously cacheTime)\n }\n )\n\n return {\n permissions,\n isLoading,\n isError,\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Mirrors the backend's service resolution, which matches by NAME and ignores the
3
+ * catalog type entirely (cephProcedure.ts:23 → ctx.openstack.service("ceph");
4
+ * swiftRouter.ts → service("swift"); signal-openstack session.ts:95 takes only a name).
5
+ * The old type-scoped lookups disagreed with it: Ceph lives in the catalog as
6
+ * { type: "object-store-ceph", name: "ceph" }, so serviceIndex["object-store"]["ceph"]
7
+ * never matched, and a temporary Ceph availability fallback had to paper over it.
8
+ */
9
+ export declare const hasServiceByName: (serviceIndex: Record<string, Record<string, boolean>>, name: string) => boolean;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Single source of truth for the storage provider ↔ storage-type noun mapping
3
+ * (`swift` → `containers`, `ceph` → `buckets`). Every route/component that needs
4
+ * to build or validate a `/storage/$provider/$storageType` URL should go through
5
+ * this module instead of re-hardcoding the pairing.
6
+ */
7
+ /**
8
+ * The object-storage providers. The same spelling serves as the `$provider` URL
9
+ * segment and as the OpenStack catalog service *name* the backend resolves by
10
+ * (see `serviceCatalog.ts`), so one constant covers both uses.
11
+ */
12
+ export declare const STORAGE_PROVIDER: {
13
+ readonly SWIFT: "swift";
14
+ readonly CEPH: "ceph";
15
+ };
16
+ /**
17
+ * The `$storageType` URL segment noun each provider uses.
18
+ *
19
+ * Deliberately NOT the same vocabulary as the nav / `enabledServices` service keys
20
+ * (`"containers"` / `"ceph-containers"`), which only happen to share the word
21
+ * "containers" — Ceph's nav key is `"ceph-containers"`, never `"buckets"`. Don't
22
+ * substitute one for the other.
23
+ */
24
+ export declare const STORAGE_TYPE: {
25
+ readonly CONTAINERS: "containers";
26
+ readonly BUCKETS: "buckets";
27
+ };
28
+ export declare const STORAGE_TYPE_BY_PROVIDER: {
29
+ readonly swift: "containers";
30
+ readonly ceph: "buckets";
31
+ };
32
+ export type StorageProvider = keyof typeof STORAGE_TYPE_BY_PROVIDER;
33
+ export type StorageType = (typeof STORAGE_TYPE_BY_PROVIDER)[StorageProvider];
34
+ /**
35
+ * Narrows an unknown value (typically a raw `$provider` URL segment) to a known
36
+ * `StorageProvider`. Uses `Object.hasOwn` rather than `in` — `"__proto__" in obj`
37
+ * evaluates to `true` for any object, which would let `/storage/__proto__/...`
38
+ * pass validation.
39
+ */
40
+ export declare const isStorageProvider: (value: unknown) => value is StorageProvider;
41
+ /** Returns `value` narrowed to a `StorageProvider`, or `fallback` if it isn't one. */
42
+ export declare const asStorageProvider: (value: unknown, fallback: StorageProvider) => StorageProvider;
43
+ /** The canonical storage-type noun for a given provider. */
44
+ export declare const storageTypeFor: (provider: StorageProvider) => StorageType;
@@ -965,6 +965,7 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
965
965
  tags_any?: string | undefined;
966
966
  not_tags?: string | undefined;
967
967
  not_tags_any?: string | undefined;
968
+ stateful?: boolean | undefined;
968
969
  searchTerm?: string | undefined;
969
970
  };
970
971
  output: {
@@ -1317,6 +1318,43 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1317
1318
  }[] | undefined;
1318
1319
  meta: object;
1319
1320
  }>;
1321
+ listProjectsWithSearch: _trpc_server.TRPCQueryProcedure<{
1322
+ input: {
1323
+ searchTerm?: string | undefined;
1324
+ };
1325
+ output: {
1326
+ id: string;
1327
+ name: string;
1328
+ enabled: boolean;
1329
+ domain_id?: string | null | undefined;
1330
+ parent_id?: string | null | undefined;
1331
+ is_domain?: boolean | null | undefined;
1332
+ tags?: string[] | null | undefined;
1333
+ options?: Record<string, string | boolean> | null | undefined;
1334
+ description?: string | null | undefined;
1335
+ links?: {
1336
+ self?: string | null | undefined;
1337
+ } | undefined;
1338
+ domain_name?: string | undefined;
1339
+ parents?: {
1340
+ project: {
1341
+ id: string;
1342
+ name: string;
1343
+ enabled: boolean;
1344
+ domain_id?: string | null | undefined;
1345
+ parent_id?: string | null | undefined;
1346
+ is_domain?: boolean | null | undefined;
1347
+ tags?: string[] | null | undefined;
1348
+ options?: Record<string, string | boolean> | null | undefined;
1349
+ description?: string | null | undefined;
1350
+ links?: {
1351
+ self?: string | null | undefined;
1352
+ } | undefined;
1353
+ };
1354
+ }[] | undefined;
1355
+ }[] | undefined;
1356
+ meta: object;
1357
+ }>;
1320
1358
  getProject: _trpc_server.TRPCQueryProcedure<{
1321
1359
  input: {
1322
1360
  projectId: string;
@@ -1515,7 +1553,11 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1515
1553
  tempUrlKey?: string | undefined;
1516
1554
  tempUrlKey2?: string | undefined;
1517
1555
  };
1518
- output: boolean;
1556
+ output: {
1557
+ created: true;
1558
+ optionsApplied: boolean;
1559
+ optionsError?: string | undefined;
1560
+ };
1519
1561
  meta: object;
1520
1562
  }>;
1521
1563
  getContainerMetadata: _trpc_server.TRPCQueryProcedure<{
@@ -1885,6 +1927,31 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
1885
1927
  }[];
1886
1928
  meta: object;
1887
1929
  }>;
1930
+ head: _trpc_server.TRPCQueryProcedure<{
1931
+ input: {
1932
+ project_id: string;
1933
+ bucketName: string;
1934
+ };
1935
+ output: {
1936
+ exists: true;
1937
+ };
1938
+ meta: object;
1939
+ }>;
1940
+ getState: _trpc_server.TRPCQueryProcedure<{
1941
+ input: {
1942
+ project_id: string;
1943
+ bucketName: string;
1944
+ };
1945
+ output: {
1946
+ status: "Enabled" | "Suspended" | "Unversioned";
1947
+ isVersioningEnabled: boolean;
1948
+ isEmpty: boolean;
1949
+ hasOnlyDeleteMarkers: boolean;
1950
+ hasOldVersionsOrDeleteMarkers: boolean;
1951
+ isPartialScan: boolean;
1952
+ };
1953
+ meta: object;
1954
+ }>;
1888
1955
  create: _trpc_server.TRPCMutationProcedure<{
1889
1956
  input: {
1890
1957
  project_id: string;
@@ -2051,6 +2118,24 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
2051
2118
  };
2052
2119
  meta: object;
2053
2120
  }>;
2121
+ deleteNonCurrentVersions: _trpc_server.TRPCMutationProcedure<{
2122
+ input: {
2123
+ project_id: string;
2124
+ containerName: string;
2125
+ };
2126
+ output: {
2127
+ errors: {
2128
+ key: string;
2129
+ versionId?: string | undefined;
2130
+ code?: string | undefined;
2131
+ message?: string | undefined;
2132
+ }[];
2133
+ deletedCount: number;
2134
+ errorCount: number;
2135
+ isPartial: boolean;
2136
+ };
2137
+ meta: object;
2138
+ }>;
2054
2139
  createFolder: _trpc_server.TRPCMutationProcedure<{
2055
2140
  input: {
2056
2141
  project_id: string;
@@ -2245,14 +2330,16 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
2245
2330
  input: {
2246
2331
  project_id: string;
2247
2332
  bucket: string;
2248
- folders: string[];
2333
+ prefix?: string | undefined;
2334
+ folders?: string[] | undefined;
2249
2335
  };
2250
2336
  output: {
2251
2337
  prefix: string;
2252
2338
  hasDeletedContent: boolean;
2253
2339
  isFolderDeleted: boolean;
2254
- folderDeleteMarkerVersionId?: string;
2255
- folderMarkerVersionId?: string;
2340
+ isPartialScan: boolean;
2341
+ folderDeleteMarkerVersionId?: string | undefined;
2342
+ folderMarkerVersionId?: string | undefined;
2256
2343
  }[];
2257
2344
  meta: object;
2258
2345
  }>;
@@ -3194,6 +3281,16 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
3194
3281
  output: string[];
3195
3282
  meta: object;
3196
3283
  }>;
3284
+ getComputeApiVersion: _trpc_server.TRPCQueryProcedure<{
3285
+ input: {
3286
+ project_id: string;
3287
+ };
3288
+ output: {
3289
+ version: string;
3290
+ supportsDescription: boolean;
3291
+ };
3292
+ meta: object;
3293
+ }>;
3197
3294
  getFlavorById: _trpc_server.TRPCQueryProcedure<{
3198
3295
  input: {
3199
3296
  project_id: string;
@@ -3262,6 +3359,7 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
3262
3359
  rxtx_factor?: number | undefined;
3263
3360
  "OS-FLV-EXT-DATA:ephemeral"?: number | undefined;
3264
3361
  "os-flavor-access:is_public"?: boolean | undefined;
3362
+ description?: string | undefined;
3265
3363
  };
3266
3364
  };
3267
3365
  output: {