@kong-ui-public/entities-plugins 9.247.3 → 9.247.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entities-plugins.es.js +3093 -3090
- package/dist/entities-plugins.umd.js +59 -59
- package/dist/filler/cypress/index.js +61 -61
- package/dist/filler/{field-walker-B9V32Dwy.js → field-walker-DP5ZupX8.js} +1465 -1426
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/foreign.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/record.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/form-context.d.ts +0 -2
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/form-context.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/render-rules.d.ts +9 -3
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/render-rules.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/schema.d.ts.map +1 -1
- package/dist/filler/playwright/index.js +110 -111
- package/dist/freeform/index.js +986 -983
- package/dist/freeform/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components/free-form/shared/ObjectField.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/composables/form-context.d.ts +0 -2
- package/dist/types/components/free-form/shared/composables/form-context.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/composables/render-rules.d.ts +9 -3
- package/dist/types/components/free-form/shared/composables/render-rules.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/composables/schema.d.ts.map +1 -1
- package/package.json +16 -16
package/dist/freeform/index.js
CHANGED
|
@@ -1,92 +1,89 @@
|
|
|
1
|
-
import { toValue as
|
|
2
|
-
import { marked as
|
|
3
|
-
import
|
|
4
|
-
import { get as
|
|
5
|
-
import { createInjectionState as
|
|
6
|
-
import { AUTOFILL_SLOT as
|
|
7
|
-
import { createI18n as
|
|
8
|
-
import { KTextArea as
|
|
9
|
-
import { AddIcon as
|
|
1
|
+
import { toValue as E, computed as w, ref as re, watch as te, onBeforeUnmount as vt, reactive as Xe, toRef as j, useSlots as Ae, provide as Pe, inject as we, toRaw as Qe, onUnmounted as bt, defineComponent as U, useAttrs as ye, openBlock as _, createBlock as I, unref as o, mergeProps as z, createSlots as W, renderList as oe, withCtx as x, renderSlot as D, normalizeProps as Fe, guardReactiveProps as Ze, createPropsRestProxy as se, resolveComponent as F, withDirectives as G, createElementBlock as K, createVNode as V, createElementVNode as B, resolveDynamicComponent as ie, createCommentVNode as N, Fragment as ee, vShow as J, useCssVars as _t, useTemplateRef as et, normalizeClass as Te, createTextVNode as pe, toDisplayString as ce, withModifiers as Ce, nextTick as Re, Transition as At, useId as wt, useModel as $e, onBeforeMount as kt, mergeModels as Ve, withKeys as Ne } from "vue";
|
|
2
|
+
import { marked as St } from "marked";
|
|
3
|
+
import Tt from "dompurify";
|
|
4
|
+
import { get as tt, isEqual as fe, omit as Ct, cloneDeep as ze, isFunction as He, set as Pt, uniqueId as It, upperFirst as Lt } from "lodash-es";
|
|
5
|
+
import { createInjectionState as qt } from "@vueuse/core";
|
|
6
|
+
import { AUTOFILL_SLOT as at } from "@kong-ui-public/forms";
|
|
7
|
+
import { createI18n as nt, i18nTComponent as it } from "@kong-ui-public/i18n";
|
|
8
|
+
import { KTextArea as Mt, KInput as xt, KCheckbox as Rt, KCard as Ke, KLabel as $t, KMultiselect as Vt, KSelect as Kt, KInputSwitch as jt } from "@kong/kongponents";
|
|
9
|
+
import { AddIcon as je, CloseIcon as ot, TrashIcon as Et, ChevronRightIcon as Ot } from "@kong/icons";
|
|
10
10
|
import { KUI_ICON_SIZE_30 as Dt } from "@kong/design-tokens";
|
|
11
|
-
function
|
|
12
|
-
return e.map((
|
|
11
|
+
function Ft(e) {
|
|
12
|
+
return e.map((r) => ({ value: r, label: `${r}` }));
|
|
13
13
|
}
|
|
14
|
-
const
|
|
15
|
-
function
|
|
14
|
+
const Be = "*", Ue = "#", ue = "$", Ie = ".";
|
|
15
|
+
function $(...e) {
|
|
16
16
|
return e.join(Ie);
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
return
|
|
18
|
+
function Ee(...e) {
|
|
19
|
+
return $(ue, ...e);
|
|
20
20
|
}
|
|
21
|
-
function
|
|
22
|
-
return e.startsWith(
|
|
21
|
+
function We(e) {
|
|
22
|
+
return e.startsWith($(ue, ""));
|
|
23
23
|
}
|
|
24
|
-
function
|
|
25
|
-
return e.split(Ie).filter((
|
|
24
|
+
function Z(e) {
|
|
25
|
+
return e.split(Ie).filter((r) => r !== "");
|
|
26
26
|
}
|
|
27
27
|
function me(e) {
|
|
28
|
-
const
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
function Ut(e) {
|
|
32
|
-
return e.startsWith(de) && (e = x(...ie(e).slice(1))), e;
|
|
28
|
+
const r = Z(e);
|
|
29
|
+
return r[r.length - 1];
|
|
33
30
|
}
|
|
34
|
-
function
|
|
31
|
+
function rt(e, r, t, n = "") {
|
|
35
32
|
if (e == null || typeof e != "object") return;
|
|
36
|
-
const
|
|
37
|
-
for (const a of
|
|
38
|
-
const c = n ?
|
|
39
|
-
|
|
33
|
+
const s = Array.isArray(e) ? e.map((a, c) => String(c)) : Object.keys(e);
|
|
34
|
+
for (const a of s) {
|
|
35
|
+
const c = n ? $(n, a) : a;
|
|
36
|
+
r(c) ? e[a] = t(c) : rt(e[a], r, t, c);
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
|
-
function
|
|
43
|
-
const
|
|
44
|
-
return
|
|
39
|
+
function Bt(e) {
|
|
40
|
+
const r = E(e);
|
|
41
|
+
return r ? r.type === "set" && r.elements.type === "string" && !r.elements.one_of : !1;
|
|
45
42
|
}
|
|
46
|
-
function
|
|
43
|
+
function st(e, r) {
|
|
47
44
|
return [...e].sort((t, n) => {
|
|
48
|
-
const
|
|
45
|
+
const s = Object.keys(t)[0], a = Object.keys(n)[0], c = r.indexOf(s), d = r.indexOf(a);
|
|
49
46
|
return c === -1 && d === -1 ? 0 : c === -1 ? 1 : d === -1 ? -1 : c - d;
|
|
50
47
|
});
|
|
51
48
|
}
|
|
52
|
-
function
|
|
49
|
+
function lt(e, r) {
|
|
53
50
|
const t = /* @__PURE__ */ new Map();
|
|
54
51
|
e.forEach((i) => {
|
|
55
52
|
const m = Object.keys(i)[0];
|
|
56
53
|
t.set(m, i);
|
|
57
54
|
});
|
|
58
55
|
const n = /* @__PURE__ */ new Map();
|
|
59
|
-
|
|
60
|
-
i.forEach((
|
|
61
|
-
n.has(
|
|
56
|
+
r.forEach((i, m) => {
|
|
57
|
+
i.forEach((h, l) => {
|
|
58
|
+
n.has(h) || n.set(h, []), n.get(h).push({ bundleIndex: m, position: l });
|
|
62
59
|
});
|
|
63
60
|
});
|
|
64
|
-
const
|
|
61
|
+
const s = /* @__PURE__ */ new Set(), a = [], c = /* @__PURE__ */ new Set(), d = (i) => {
|
|
65
62
|
const m = n.get(i);
|
|
66
63
|
if (!m) return !0;
|
|
67
|
-
for (const { bundleIndex:
|
|
68
|
-
const u =
|
|
64
|
+
for (const { bundleIndex: h, position: l } of m) {
|
|
65
|
+
const u = r[h];
|
|
69
66
|
for (let f = 0; f < l; f++) {
|
|
70
|
-
const
|
|
71
|
-
if (t.has(
|
|
67
|
+
const b = u[f];
|
|
68
|
+
if (t.has(b) && !s.has(b))
|
|
72
69
|
return !1;
|
|
73
70
|
}
|
|
74
71
|
}
|
|
75
72
|
return !0;
|
|
76
73
|
}, p = (i) => {
|
|
77
|
-
if (
|
|
74
|
+
if (s.has(i)) return;
|
|
78
75
|
const m = t.get(i);
|
|
79
76
|
if (!m) return;
|
|
80
|
-
a.push(m),
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
83
|
-
for (const { bundleIndex: u, position: f } of
|
|
84
|
-
const
|
|
85
|
-
for (let
|
|
86
|
-
const
|
|
87
|
-
if (!
|
|
88
|
-
const
|
|
89
|
-
|
|
77
|
+
a.push(m), s.add(i), c.delete(i);
|
|
78
|
+
const h = n.get(i);
|
|
79
|
+
if (h)
|
|
80
|
+
for (const { bundleIndex: u, position: f } of h) {
|
|
81
|
+
const b = r[u];
|
|
82
|
+
for (let C = f + 1; C < b.length; C++) {
|
|
83
|
+
const g = b[C];
|
|
84
|
+
if (!s.has(g)) {
|
|
85
|
+
const y = t.get(g);
|
|
86
|
+
y && (a.push(y), s.add(g), c.delete(g));
|
|
90
87
|
}
|
|
91
88
|
}
|
|
92
89
|
}
|
|
@@ -96,37 +93,37 @@ function ut(e, s) {
|
|
|
96
93
|
};
|
|
97
94
|
for (const i of e) {
|
|
98
95
|
const m = Object.keys(i)[0];
|
|
99
|
-
|
|
96
|
+
s.has(m) || (d(m) ? p(m) : c.add(m));
|
|
100
97
|
}
|
|
101
98
|
return a;
|
|
102
99
|
}
|
|
103
|
-
function
|
|
104
|
-
const
|
|
100
|
+
function Ut(e) {
|
|
101
|
+
const r = Z(e);
|
|
105
102
|
let t = { parent: null };
|
|
106
|
-
for (
|
|
107
|
-
const n =
|
|
108
|
-
t.path = t.parent?.path ?
|
|
103
|
+
for (r.pop(); r.length; ) {
|
|
104
|
+
const n = r.shift();
|
|
105
|
+
t.path = t.parent?.path ? $(t.parent.path, n) : n, t = { parent: t };
|
|
109
106
|
}
|
|
110
107
|
return t;
|
|
111
108
|
}
|
|
112
|
-
function
|
|
113
|
-
return
|
|
109
|
+
function ut(e) {
|
|
110
|
+
return w(() => Ut(E(e)));
|
|
114
111
|
}
|
|
115
|
-
const
|
|
112
|
+
const Ge = /* @__PURE__ */ Symbol("free-form-field-path"), Oe = /* @__PURE__ */ Symbol("free-form-field-renderer-slots"), Je = /* @__PURE__ */ Symbol("free-form-field-reset-label-path-setting"), ke = "free-form-field-renderers-slot", Nt = {
|
|
116
113
|
tooltipAttributes: {
|
|
117
114
|
maxWidth: "300px",
|
|
118
115
|
placement: "top"
|
|
119
116
|
}
|
|
120
117
|
};
|
|
121
|
-
function
|
|
118
|
+
function zt(e, r = "") {
|
|
122
119
|
const t = {}, n = e;
|
|
123
|
-
return Array.isArray(n.fields) ? Object.assign(t, Le(n,
|
|
120
|
+
return Array.isArray(n.fields) ? Object.assign(t, Le(n, r)) : e.type === "array" && e.elements ? Object.assign(t, qe(e, r)) : e.type === "map" && e.values && Object.assign(t, Me(e, r)), t;
|
|
124
121
|
}
|
|
125
|
-
function Le(e,
|
|
122
|
+
function Le(e, r = "") {
|
|
126
123
|
const t = {};
|
|
127
124
|
if (Array.isArray(e.fields))
|
|
128
125
|
for (const n of e.fields) {
|
|
129
|
-
const
|
|
126
|
+
const s = Object.keys(n)[0], a = n[s], c = r ? $(r, s) : s;
|
|
130
127
|
if (t[c] = a, a.type === "record" && Array.isArray(a.fields)) {
|
|
131
128
|
const d = Le(a, c);
|
|
132
129
|
Object.assign(t, d);
|
|
@@ -140,103 +137,108 @@ function Le(e, s = "") {
|
|
|
140
137
|
}
|
|
141
138
|
return t;
|
|
142
139
|
}
|
|
143
|
-
function qe(e,
|
|
140
|
+
function qe(e, r = "") {
|
|
144
141
|
const t = {};
|
|
145
142
|
if (e.elements) {
|
|
146
|
-
const n = e.elements,
|
|
147
|
-
if (t[
|
|
148
|
-
const a = Le(n,
|
|
143
|
+
const n = e.elements, s = $(r, Be);
|
|
144
|
+
if (t[s] = n, n.type === "record" && Array.isArray(n.fields)) {
|
|
145
|
+
const a = Le(n, s);
|
|
149
146
|
Object.assign(t, a);
|
|
150
147
|
} else if (n.type === "array" && n.elements) {
|
|
151
|
-
const a = qe(n,
|
|
148
|
+
const a = qe(n, s);
|
|
152
149
|
Object.assign(t, a);
|
|
153
150
|
} else if (n.type === "map" && n.values) {
|
|
154
|
-
const a = Me(n,
|
|
151
|
+
const a = Me(n, s);
|
|
155
152
|
Object.assign(t, a);
|
|
156
153
|
}
|
|
157
154
|
}
|
|
158
155
|
return t;
|
|
159
156
|
}
|
|
160
|
-
function Me(e,
|
|
161
|
-
const t = {}, n =
|
|
157
|
+
function Me(e, r = "") {
|
|
158
|
+
const t = {}, n = $(r, Ue);
|
|
162
159
|
if (t[n] = e.values, e.values.type === "record" && Array.isArray(e.values.fields)) {
|
|
163
|
-
const
|
|
164
|
-
Object.assign(t,
|
|
160
|
+
const s = Le(e.values, n);
|
|
161
|
+
Object.assign(t, s);
|
|
165
162
|
} else if ((e.values.type === "array" || e.values.type === "set") && e.values.elements) {
|
|
166
|
-
const
|
|
167
|
-
Object.assign(t,
|
|
163
|
+
const s = qe(e.values, n);
|
|
164
|
+
Object.assign(t, s);
|
|
168
165
|
} else if (e.values.type === "map" && e.values.values) {
|
|
169
|
-
const
|
|
170
|
-
Object.assign(t,
|
|
166
|
+
const s = Me(e.values, n);
|
|
167
|
+
Object.assign(t, s);
|
|
171
168
|
}
|
|
172
169
|
return t;
|
|
173
170
|
}
|
|
174
|
-
function
|
|
175
|
-
const t =
|
|
176
|
-
for (let
|
|
177
|
-
const a = t[
|
|
178
|
-
d?.type === "map" ? n.push(
|
|
171
|
+
function he(e, r) {
|
|
172
|
+
const t = Z(e), n = [];
|
|
173
|
+
for (let s = 0; s < t.length; s++) {
|
|
174
|
+
const a = t[s], c = n.length > 0 ? $(...n) : "", d = c ? r[c] : void 0;
|
|
175
|
+
d?.type === "map" ? n.push(Ue) : d?.type === "array" ? n.push(Be) : n.push(a);
|
|
179
176
|
}
|
|
180
|
-
return
|
|
177
|
+
return $(...n);
|
|
181
178
|
}
|
|
182
|
-
function
|
|
183
|
-
const
|
|
179
|
+
function Ht(e) {
|
|
180
|
+
const r = E(e), t = w(() => r ? zt(r) : {});
|
|
184
181
|
function n(l) {
|
|
185
182
|
if (l) {
|
|
186
|
-
let u =
|
|
187
|
-
return u.startsWith(`${
|
|
183
|
+
let u = he(l, t.value || {});
|
|
184
|
+
return u.startsWith(`${ue}${Ie}`) && (u = u.slice(2)), t.value?.[u];
|
|
188
185
|
}
|
|
189
|
-
return
|
|
186
|
+
return r;
|
|
190
187
|
}
|
|
191
|
-
function
|
|
188
|
+
function s(l, u = !1) {
|
|
192
189
|
const f = n(l);
|
|
193
|
-
|
|
190
|
+
if (!f)
|
|
191
|
+
return null;
|
|
192
|
+
if (f.default !== void 0)
|
|
193
|
+
return f.default;
|
|
194
|
+
if (!f.auto)
|
|
195
|
+
return u || f.required ? f.type === "record" ? a(f, l) : f.type === "array" ? [] : f.type === "map" ? {} : null : null;
|
|
194
196
|
}
|
|
195
197
|
function a(l, u) {
|
|
196
198
|
const f = {};
|
|
197
199
|
if (Array.isArray(l.fields))
|
|
198
|
-
for (const
|
|
199
|
-
const
|
|
200
|
-
|
|
200
|
+
for (const b of l.fields) {
|
|
201
|
+
const C = Object.keys(b)[0], g = u ? `${u}.${C}` : C, y = s(g, !1);
|
|
202
|
+
y !== void 0 && (f[C] = y);
|
|
201
203
|
}
|
|
202
204
|
return f;
|
|
203
205
|
}
|
|
204
206
|
function c(l) {
|
|
205
|
-
return l ?
|
|
207
|
+
return l ? s(l, !0) : a(n(), "");
|
|
206
208
|
}
|
|
207
209
|
function d(l) {
|
|
208
|
-
const u = n(l), f = u?.description ?
|
|
210
|
+
const u = n(l), f = u?.description ? Tt.sanitize(St.parse(u.description, { async: !1 })) : void 0;
|
|
209
211
|
return {
|
|
210
|
-
...
|
|
212
|
+
...Nt,
|
|
211
213
|
"data-testid": `ff-label-${l}`,
|
|
212
214
|
info: f
|
|
213
215
|
};
|
|
214
216
|
}
|
|
215
217
|
function p(l) {
|
|
216
218
|
const u = n(l);
|
|
217
|
-
return
|
|
219
|
+
return Ft(u?.one_of || u.elements?.one_of || []);
|
|
218
220
|
}
|
|
219
221
|
function i(l) {
|
|
220
222
|
const u = n(l), f = u?.default;
|
|
221
|
-
let
|
|
223
|
+
let b = null;
|
|
222
224
|
if (u?.type === "foreign" && f?.id)
|
|
223
|
-
|
|
225
|
+
b = f.id;
|
|
224
226
|
else {
|
|
225
227
|
if (f == null || typeof f == "object" || f === "")
|
|
226
228
|
return null;
|
|
227
229
|
if (Array.isArray(f)) {
|
|
228
230
|
if (f.length === 0)
|
|
229
231
|
return null;
|
|
230
|
-
|
|
232
|
+
b = f.join(", ");
|
|
231
233
|
} else
|
|
232
|
-
|
|
234
|
+
b = f.toString();
|
|
233
235
|
}
|
|
234
|
-
return `Default: ${
|
|
236
|
+
return `Default: ${b}`;
|
|
235
237
|
}
|
|
236
238
|
function m() {
|
|
237
239
|
return t.value;
|
|
238
240
|
}
|
|
239
|
-
function
|
|
241
|
+
function h(l) {
|
|
240
242
|
return n(l)?.required ? c(l) : null;
|
|
241
243
|
}
|
|
242
244
|
return {
|
|
@@ -246,354 +248,356 @@ function Gt(e) {
|
|
|
246
248
|
getSelectItems: p,
|
|
247
249
|
getLabelAttributes: d,
|
|
248
250
|
getPlaceholder: i,
|
|
249
|
-
getEmptyOrDefault:
|
|
251
|
+
getEmptyOrDefault: h
|
|
250
252
|
};
|
|
251
253
|
}
|
|
252
254
|
const De = /* @__PURE__ */ Symbol("ff-render-rule-exact-match");
|
|
253
|
-
function
|
|
255
|
+
function Vn(e) {
|
|
254
256
|
return { [De]: e };
|
|
255
257
|
}
|
|
256
|
-
function
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
258
|
+
function Wt(e, r) {
|
|
259
|
+
return typeof r == "object" && r !== null && De in r ? fe(e, r[De]) : Array.isArray(r) ? r.some((n) => fe(e, n)) : fe(e, r);
|
|
260
|
+
}
|
|
261
|
+
function Gt(e, r) {
|
|
262
|
+
const t = re({}), n = re({});
|
|
263
|
+
function s(g, y) {
|
|
264
|
+
const A = g.map((v) => Z(v).length), T = A[0];
|
|
265
|
+
if (!A.every((v) => v === T)) {
|
|
266
|
+
const v = g.map((k, P) => ` - '${k}' is at level ${A[P]}`).join(`
|
|
262
267
|
`);
|
|
263
268
|
throw new Error(
|
|
264
269
|
`${y}: Fields must be at the same level. Found mixed levels:
|
|
265
|
-
${
|
|
270
|
+
${v}`
|
|
266
271
|
);
|
|
267
272
|
}
|
|
268
273
|
}
|
|
269
|
-
function a(
|
|
270
|
-
for (const [y,
|
|
271
|
-
if (!
|
|
272
|
-
for (const
|
|
273
|
-
if (new Set(
|
|
274
|
-
const
|
|
274
|
+
function a(g) {
|
|
275
|
+
for (const [y, A] of Object.entries(g)) {
|
|
276
|
+
if (!A.bundles) continue;
|
|
277
|
+
for (const v of A.bundles)
|
|
278
|
+
if (new Set(v).size !== v.length) {
|
|
279
|
+
const P = v.filter((M, L) => v.indexOf(M) !== L);
|
|
275
280
|
throw new Error(
|
|
276
|
-
`Self-cycle detected in bundle: field '${
|
|
281
|
+
`Self-cycle detected in bundle: field '${P[0]}' appears multiple times in [${v.join(", ")}]`
|
|
277
282
|
);
|
|
278
283
|
}
|
|
279
|
-
const
|
|
280
|
-
for (const
|
|
281
|
-
for (let
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
+
const T = /* @__PURE__ */ new Map();
|
|
285
|
+
for (const v of A.bundles)
|
|
286
|
+
for (let k = 1; k < v.length; k++) {
|
|
287
|
+
const P = v[k], M = v[k - 1];
|
|
288
|
+
T.has(P) || T.set(P, /* @__PURE__ */ new Set()), T.get(P).add(M);
|
|
284
289
|
}
|
|
285
|
-
for (const
|
|
286
|
-
let
|
|
287
|
-
if (
|
|
288
|
-
const
|
|
290
|
+
for (const v of T.keys()) {
|
|
291
|
+
let k = function(L) {
|
|
292
|
+
if (M.includes(L)) {
|
|
293
|
+
const R = [...M, L].join(" -> ");
|
|
289
294
|
throw new Error(
|
|
290
295
|
`Circular bundle detected in path '${y}':
|
|
291
|
-
${
|
|
296
|
+
${R}`
|
|
292
297
|
);
|
|
293
298
|
}
|
|
294
|
-
if (
|
|
295
|
-
|
|
296
|
-
const
|
|
297
|
-
if (
|
|
298
|
-
for (const
|
|
299
|
-
|
|
300
|
-
|
|
299
|
+
if (P.has(L)) return;
|
|
300
|
+
P.add(L), M.push(L);
|
|
301
|
+
const S = T.get(L);
|
|
302
|
+
if (S)
|
|
303
|
+
for (const R of S)
|
|
304
|
+
k(R);
|
|
305
|
+
M.pop();
|
|
301
306
|
};
|
|
302
|
-
const
|
|
303
|
-
|
|
307
|
+
const P = /* @__PURE__ */ new Set(), M = [];
|
|
308
|
+
k(v);
|
|
304
309
|
}
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
|
-
function c(
|
|
308
|
-
for (const [y,
|
|
309
|
-
if (
|
|
310
|
-
for (const
|
|
311
|
-
let
|
|
312
|
-
if (
|
|
313
|
-
const
|
|
312
|
+
function c(g) {
|
|
313
|
+
for (const [y, A] of Object.entries(g))
|
|
314
|
+
if (A.dependencies)
|
|
315
|
+
for (const T of Object.keys(A.dependencies)) {
|
|
316
|
+
let v = function(M) {
|
|
317
|
+
if (P.includes(M)) {
|
|
318
|
+
const S = [...P, M].join(" -> ");
|
|
314
319
|
throw new Error(
|
|
315
320
|
`Circular dependency detected in path '${y}':
|
|
316
|
-
${
|
|
321
|
+
${S}`
|
|
317
322
|
);
|
|
318
323
|
}
|
|
319
|
-
if (
|
|
320
|
-
|
|
321
|
-
const
|
|
322
|
-
if (
|
|
323
|
-
const [
|
|
324
|
-
|
|
324
|
+
if (k.has(M)) return;
|
|
325
|
+
k.add(M), P.push(M);
|
|
326
|
+
const L = A.dependencies[M];
|
|
327
|
+
if (L) {
|
|
328
|
+
const [S] = L;
|
|
329
|
+
A.dependencies[S] && v(S);
|
|
325
330
|
}
|
|
326
|
-
|
|
331
|
+
P.pop();
|
|
327
332
|
};
|
|
328
|
-
const
|
|
329
|
-
|
|
333
|
+
const k = /* @__PURE__ */ new Set(), P = [];
|
|
334
|
+
v(T);
|
|
330
335
|
}
|
|
331
336
|
}
|
|
332
|
-
function d(
|
|
333
|
-
const
|
|
334
|
-
return
|
|
337
|
+
function d(g, y) {
|
|
338
|
+
const A = g.map((v) => y ? $(y, v) : v), T = Z(A[0]);
|
|
339
|
+
return T.pop(), $(...T);
|
|
335
340
|
}
|
|
336
|
-
function p(
|
|
337
|
-
if (!y) return
|
|
338
|
-
const
|
|
339
|
-
return
|
|
341
|
+
function p(g, y) {
|
|
342
|
+
if (!y) return g;
|
|
343
|
+
const A = `${y}${Ie}`;
|
|
344
|
+
return g.startsWith(A) ? g.slice(A.length) : g;
|
|
340
345
|
}
|
|
341
|
-
function i(
|
|
342
|
-
const y =
|
|
343
|
-
return y.pop(),
|
|
346
|
+
function i(g) {
|
|
347
|
+
const y = Z(g);
|
|
348
|
+
return y.pop(), $(...y);
|
|
344
349
|
}
|
|
345
|
-
|
|
346
|
-
const
|
|
347
|
-
for (const [y,
|
|
348
|
-
const
|
|
349
|
-
if (
|
|
350
|
-
for (const
|
|
351
|
-
if (
|
|
350
|
+
function m() {
|
|
351
|
+
const g = {};
|
|
352
|
+
for (const [y, A] of Object.entries(t.value)) {
|
|
353
|
+
const T = y === ue ? "" : y;
|
|
354
|
+
if (A.bundles)
|
|
355
|
+
for (const v of A.bundles) {
|
|
356
|
+
if (v.length < 2)
|
|
352
357
|
throw new Error(
|
|
353
|
-
`Bundle must contain at least 2 fields. Found ${
|
|
358
|
+
`Bundle must contain at least 2 fields. Found ${v.length} field(s) in bundle: [${v.join(", ")}]`
|
|
354
359
|
);
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
const
|
|
358
|
-
|
|
359
|
-
const
|
|
360
|
-
|
|
360
|
+
const k = v.map((L) => T ? $(T, L) : L);
|
|
361
|
+
s(k, `Bundle [${v.join(", ")}]`);
|
|
362
|
+
const P = d(v, T) || ue;
|
|
363
|
+
g[P] || (g[P] = {}), g[P].bundles || (g[P].bundles = []);
|
|
364
|
+
const M = k.map((L) => p(L, P));
|
|
365
|
+
g[P].bundles.push(M);
|
|
361
366
|
}
|
|
362
|
-
if (
|
|
363
|
-
for (const [
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
[
|
|
367
|
-
`Dependency '${
|
|
367
|
+
if (A.dependencies)
|
|
368
|
+
for (const [v, [k, P]] of Object.entries(A.dependencies)) {
|
|
369
|
+
const M = T ? $(T, v) : v, L = T ? $(T, k) : k;
|
|
370
|
+
s(
|
|
371
|
+
[M, L],
|
|
372
|
+
`Dependency '${v}' -> '${k}'`
|
|
368
373
|
);
|
|
369
|
-
const
|
|
370
|
-
|
|
371
|
-
const
|
|
372
|
-
|
|
374
|
+
const S = i(M) || ue;
|
|
375
|
+
g[S] || (g[S] = {}), g[S].dependencies || (g[S].dependencies = {});
|
|
376
|
+
const R = p(M, S), q = p(L, S);
|
|
377
|
+
g[S].dependencies[R] = [q, P];
|
|
373
378
|
}
|
|
374
379
|
}
|
|
375
|
-
return a(
|
|
380
|
+
return a(g), c(g), g;
|
|
381
|
+
}
|
|
382
|
+
const h = w(() => {
|
|
383
|
+
try {
|
|
384
|
+
return m();
|
|
385
|
+
} catch (g) {
|
|
386
|
+
return console.error("Invalid render rules:", g instanceof Error ? g.message : String(g)), {};
|
|
387
|
+
}
|
|
376
388
|
});
|
|
377
|
-
function g
|
|
378
|
-
if (!
|
|
379
|
-
return
|
|
380
|
-
const y =
|
|
381
|
-
return
|
|
389
|
+
function l(g) {
|
|
390
|
+
if (!g)
|
|
391
|
+
return h.value;
|
|
392
|
+
const y = he(g, e());
|
|
393
|
+
return h.value[y];
|
|
382
394
|
}
|
|
383
|
-
function
|
|
395
|
+
function u(g) {
|
|
384
396
|
let y = !1;
|
|
385
|
-
return
|
|
397
|
+
return w(() => {
|
|
386
398
|
if (y) return;
|
|
387
|
-
const
|
|
399
|
+
const A = E(g);
|
|
388
400
|
try {
|
|
389
|
-
return
|
|
390
|
-
} catch (
|
|
391
|
-
y = !0, console.error(`Failed to get render rules for path: \`${
|
|
401
|
+
return l(A);
|
|
402
|
+
} catch (T) {
|
|
403
|
+
y = !0, console.error(`Failed to get render rules for path: \`${A}\`,`, T instanceof Error ? T.message : "");
|
|
392
404
|
return;
|
|
393
405
|
}
|
|
394
406
|
});
|
|
395
407
|
}
|
|
396
|
-
|
|
408
|
+
const f = w(
|
|
409
|
+
() => Object.values(h.value).some(
|
|
410
|
+
(g) => g.dependencies && Object.keys(g.dependencies).length > 0
|
|
411
|
+
)
|
|
412
|
+
);
|
|
413
|
+
function b(g) {
|
|
397
414
|
const {
|
|
398
415
|
fieldPath: y,
|
|
399
|
-
rules:
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
() =>
|
|
405
|
-
() =>
|
|
406
|
-
], ([
|
|
407
|
-
|
|
416
|
+
rules: A,
|
|
417
|
+
omittedFields: T
|
|
418
|
+
} = g;
|
|
419
|
+
te([
|
|
420
|
+
() => E(A),
|
|
421
|
+
() => E(y),
|
|
422
|
+
() => E(T)
|
|
423
|
+
], ([k, P, M], [, L]) => {
|
|
424
|
+
k ? t.value[P] = k : delete t.value[P], M && M.length ? n.value[P] = [...M] : delete n.value[P], L && L !== P && (delete t.value[L], delete n.value[L]);
|
|
408
425
|
}, { immediate: !0, deep: !0 });
|
|
409
|
-
const
|
|
410
|
-
return
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
() => V(y),
|
|
415
|
-
() => V(A)
|
|
416
|
-
],
|
|
417
|
-
([w, S, I, R]) => {
|
|
418
|
-
!S || !w || Object.entries(S).forEach(([j, [L, M]]) => {
|
|
419
|
-
if (R?.includes(j)) return;
|
|
420
|
-
const P = at(w, L), H = I ? Ut(x(I, j)) : j;
|
|
421
|
-
if (typeof M == "object" && M !== null && De in M ? fe(P, M[De]) : Array.isArray(M) ? M.some((xe) => fe(P, xe)) : fe(P, M)) {
|
|
422
|
-
n.value.delete(H), e();
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
n.value.add(H), e();
|
|
426
|
-
});
|
|
427
|
-
},
|
|
428
|
-
{ deep: !0, immediate: !0 }
|
|
429
|
-
), bt(() => {
|
|
430
|
-
const w = V(y);
|
|
431
|
-
delete t.value[w];
|
|
432
|
-
}), C;
|
|
426
|
+
const v = u(y);
|
|
427
|
+
return vt(() => {
|
|
428
|
+
const k = E(y);
|
|
429
|
+
delete t.value[k], delete n.value[k];
|
|
430
|
+
}), v;
|
|
433
431
|
}
|
|
434
|
-
function
|
|
435
|
-
|
|
432
|
+
function C(g) {
|
|
433
|
+
const y = Z(g);
|
|
434
|
+
if (!y.length) return !1;
|
|
435
|
+
const A = y[y.length - 1], T = $(...y.slice(0, -1));
|
|
436
|
+
if (n.value[T]?.includes(A)) return !1;
|
|
437
|
+
const v = T === "" ? ue : he(T, e()), k = h.value[v]?.dependencies?.[A];
|
|
438
|
+
if (!k) return !1;
|
|
439
|
+
const [P, M] = k, L = T ? $(T, P) : P, S = tt(r(), Z(L));
|
|
440
|
+
return !Wt(S, M);
|
|
436
441
|
}
|
|
437
442
|
return {
|
|
438
|
-
useCurrentRules:
|
|
439
|
-
createComputedRules:
|
|
440
|
-
|
|
441
|
-
isFieldHidden:
|
|
443
|
+
useCurrentRules: b,
|
|
444
|
+
createComputedRules: u,
|
|
445
|
+
hasDependencies: f,
|
|
446
|
+
isFieldHidden: C
|
|
442
447
|
};
|
|
443
448
|
}
|
|
444
|
-
let
|
|
445
|
-
function
|
|
446
|
-
return `kid:${++
|
|
449
|
+
let Jt = 0;
|
|
450
|
+
function Yt() {
|
|
451
|
+
return `kid:${++Jt}`;
|
|
447
452
|
}
|
|
448
|
-
function
|
|
449
|
-
const
|
|
453
|
+
function Xt(e) {
|
|
454
|
+
const r = Xe(/* @__PURE__ */ new Map());
|
|
450
455
|
function t(i = "") {
|
|
451
|
-
const m =
|
|
452
|
-
return
|
|
456
|
+
const m = Yt();
|
|
457
|
+
return r.set(m, i), m;
|
|
453
458
|
}
|
|
454
459
|
function n(i) {
|
|
455
|
-
return
|
|
460
|
+
return r.get(i);
|
|
456
461
|
}
|
|
457
|
-
function
|
|
458
|
-
|
|
462
|
+
function s(i, m) {
|
|
463
|
+
r.has(i) && r.set(i, m);
|
|
459
464
|
}
|
|
460
465
|
function a(i) {
|
|
461
|
-
|
|
466
|
+
r.delete(i);
|
|
462
467
|
}
|
|
463
468
|
function c(i) {
|
|
464
|
-
return
|
|
469
|
+
return Qt(i, e, t);
|
|
465
470
|
}
|
|
466
471
|
function d(i) {
|
|
467
|
-
return
|
|
472
|
+
return Zt(i, e, n);
|
|
468
473
|
}
|
|
469
474
|
function p() {
|
|
470
|
-
|
|
475
|
+
r.clear();
|
|
471
476
|
}
|
|
472
477
|
return {
|
|
473
478
|
createKey: t,
|
|
474
479
|
getKey: n,
|
|
475
|
-
updateKey:
|
|
480
|
+
updateKey: s,
|
|
476
481
|
deleteKey: a,
|
|
477
482
|
serialize: c,
|
|
478
483
|
deserialize: d,
|
|
479
484
|
clear: p
|
|
480
485
|
};
|
|
481
486
|
}
|
|
482
|
-
function
|
|
483
|
-
const n = (
|
|
484
|
-
if (
|
|
485
|
-
return
|
|
486
|
-
if (Array.isArray(
|
|
487
|
-
return
|
|
488
|
-
const m = a ?
|
|
487
|
+
function Qt(e, r, t) {
|
|
488
|
+
const n = (s, a) => {
|
|
489
|
+
if (s == null || typeof s != "object")
|
|
490
|
+
return s;
|
|
491
|
+
if (Array.isArray(s))
|
|
492
|
+
return s.map((p, i) => {
|
|
493
|
+
const m = a ? $(a, `${i}`) : `${i}`;
|
|
489
494
|
return n(p, m);
|
|
490
495
|
});
|
|
491
|
-
if ((a ?
|
|
492
|
-
const p =
|
|
496
|
+
if ((a ? r(a) : r())?.type === "map") {
|
|
497
|
+
const p = s, i = {};
|
|
493
498
|
return Object.keys(p).forEach((m) => {
|
|
494
|
-
const
|
|
495
|
-
i[
|
|
499
|
+
const h = t(m), l = p[m], u = a ? $(a, m) : m;
|
|
500
|
+
i[h] = n(l, u);
|
|
496
501
|
}), i;
|
|
497
502
|
}
|
|
498
503
|
const d = {};
|
|
499
|
-
return Object.keys(
|
|
500
|
-
const i = a ?
|
|
501
|
-
d[p] = n(
|
|
504
|
+
return Object.keys(s).forEach((p) => {
|
|
505
|
+
const i = a ? $(a, p) : p;
|
|
506
|
+
d[p] = n(s[p], i);
|
|
502
507
|
}), d;
|
|
503
508
|
};
|
|
504
509
|
return n(e);
|
|
505
510
|
}
|
|
506
|
-
function
|
|
507
|
-
const n = (
|
|
508
|
-
if (
|
|
509
|
-
return
|
|
510
|
-
if (Array.isArray(
|
|
511
|
-
return
|
|
512
|
-
const m = a ?
|
|
511
|
+
function Zt(e, r, t) {
|
|
512
|
+
const n = (s, a) => {
|
|
513
|
+
if (s == null || typeof s != "object")
|
|
514
|
+
return s;
|
|
515
|
+
if (Array.isArray(s))
|
|
516
|
+
return s.map((p, i) => {
|
|
517
|
+
const m = a ? $(a, `${i}`) : `${i}`;
|
|
513
518
|
return n(p, m);
|
|
514
519
|
});
|
|
515
|
-
if ((a ?
|
|
516
|
-
const p =
|
|
520
|
+
if ((a ? r(a) : r())?.type === "map") {
|
|
521
|
+
const p = s, i = {};
|
|
517
522
|
return Object.keys(p).forEach((m) => {
|
|
518
|
-
const
|
|
523
|
+
const h = m, l = p[h], u = t(h);
|
|
519
524
|
if (u == null) {
|
|
520
|
-
console.error(`[FreeForm] Missing name for key ID: ${String(
|
|
525
|
+
console.error(`[FreeForm] Missing name for key ID: ${String(h)}`);
|
|
521
526
|
return;
|
|
522
527
|
}
|
|
523
|
-
const f = u ||
|
|
524
|
-
i[u] = n(l,
|
|
528
|
+
const f = u || Ue, b = a ? $(a, f) : f;
|
|
529
|
+
i[u] = n(l, b);
|
|
525
530
|
}), i;
|
|
526
531
|
}
|
|
527
532
|
const d = {};
|
|
528
|
-
return Object.keys(
|
|
529
|
-
const i = a ?
|
|
530
|
-
d[p] = n(
|
|
533
|
+
return Object.keys(s).forEach((p) => {
|
|
534
|
+
const i = a ? $(a, p) : p;
|
|
535
|
+
d[p] = n(s[p], i);
|
|
531
536
|
}), d;
|
|
532
537
|
};
|
|
533
538
|
return n(e);
|
|
534
539
|
}
|
|
535
|
-
function
|
|
540
|
+
function ea(e) {
|
|
536
541
|
return /^kid:\d+$/.test(e);
|
|
537
542
|
}
|
|
538
|
-
const [
|
|
539
|
-
function(
|
|
543
|
+
const [ta, aa] = qt(
|
|
544
|
+
function(r) {
|
|
540
545
|
const {
|
|
541
546
|
schema: t,
|
|
542
547
|
propsData: n,
|
|
543
|
-
onChange:
|
|
548
|
+
onChange: s,
|
|
544
549
|
propsRenderRules: a,
|
|
545
550
|
propsConfig: c
|
|
546
|
-
} =
|
|
551
|
+
} = r, {
|
|
547
552
|
getDefault: d,
|
|
548
553
|
getEmptyOrDefault: p,
|
|
549
554
|
...i
|
|
550
|
-
} =
|
|
551
|
-
Pe(
|
|
555
|
+
} = Ht(t), m = Xt(i.getSchema), h = /* @__PURE__ */ new Map(), l = Xe({}), u = j(() => c ?? {}), f = Ae();
|
|
556
|
+
Pe(Oe, Ct(f, "default", ke));
|
|
552
557
|
const {
|
|
553
|
-
useCurrentRules:
|
|
554
|
-
createComputedRules:
|
|
555
|
-
|
|
556
|
-
isFieldHidden:
|
|
557
|
-
} =
|
|
558
|
-
fieldPath:
|
|
559
|
-
rules: a
|
|
560
|
-
parentValue: l
|
|
558
|
+
useCurrentRules: b,
|
|
559
|
+
createComputedRules: C,
|
|
560
|
+
hasDependencies: g,
|
|
561
|
+
isFieldHidden: y
|
|
562
|
+
} = Gt(i.getSchemaMap, () => l), A = b({
|
|
563
|
+
fieldPath: ue,
|
|
564
|
+
rules: a
|
|
561
565
|
});
|
|
562
|
-
function
|
|
563
|
-
Object.keys(l).forEach((
|
|
564
|
-
delete l[
|
|
565
|
-
}), m.clear(), Object.assign(l, m.serialize(
|
|
566
|
+
function T(q) {
|
|
567
|
+
Object.keys(l).forEach((X) => {
|
|
568
|
+
delete l[X];
|
|
569
|
+
}), m.clear(), Object.assign(l, m.serialize(q));
|
|
566
570
|
}
|
|
567
|
-
function
|
|
568
|
-
let
|
|
569
|
-
!
|
|
571
|
+
function v(q) {
|
|
572
|
+
let X;
|
|
573
|
+
!q || !k(E(q)) ? X = d() : X = ze(E(q)), He(u.value.prepareFormData) ? T(u.value.prepareFormData(X)) : T(X);
|
|
570
574
|
}
|
|
571
|
-
function
|
|
572
|
-
return
|
|
575
|
+
function k(q) {
|
|
576
|
+
return He(u.value.hasValue) ? u.value.hasValue(q) : !!q;
|
|
573
577
|
}
|
|
574
|
-
function
|
|
575
|
-
const
|
|
576
|
-
return
|
|
577
|
-
|
|
578
|
-
|
|
578
|
+
function P() {
|
|
579
|
+
const q = ze(E(l));
|
|
580
|
+
return g.value && rt(
|
|
581
|
+
q,
|
|
582
|
+
y,
|
|
579
583
|
p
|
|
580
|
-
), m.deserialize(
|
|
584
|
+
), m.deserialize(q);
|
|
581
585
|
}
|
|
582
|
-
|
|
583
|
-
|
|
586
|
+
te(l, () => {
|
|
587
|
+
s?.(P());
|
|
584
588
|
}, { deep: !0 });
|
|
585
|
-
let
|
|
586
|
-
|
|
587
|
-
|
|
589
|
+
let M = !1;
|
|
590
|
+
te(() => n?.value, (q) => {
|
|
591
|
+
M && fe(P(), E(q)) || (v(q), M = !0);
|
|
588
592
|
}, { deep: !0, immediate: !0 });
|
|
589
|
-
function
|
|
590
|
-
return
|
|
593
|
+
function L(q) {
|
|
594
|
+
return q != null && typeof q == "object" && !Array.isArray(q) ? m.serialize(q) : q;
|
|
591
595
|
}
|
|
592
|
-
function
|
|
593
|
-
return
|
|
596
|
+
function S(q) {
|
|
597
|
+
return L(d(q));
|
|
594
598
|
}
|
|
595
|
-
function
|
|
596
|
-
return
|
|
599
|
+
function R(q) {
|
|
600
|
+
return L(p(q));
|
|
597
601
|
}
|
|
598
602
|
return {
|
|
599
603
|
/**
|
|
@@ -602,70 +606,70 @@ const [aa, na] = Mt(
|
|
|
602
606
|
formData: l,
|
|
603
607
|
schema: t,
|
|
604
608
|
config: u,
|
|
605
|
-
fieldRendererRegistry:
|
|
606
|
-
setValue:
|
|
607
|
-
useCurrentRenderRules:
|
|
609
|
+
fieldRendererRegistry: h,
|
|
610
|
+
setValue: T,
|
|
611
|
+
useCurrentRenderRules: b,
|
|
608
612
|
rootRenderRules: A,
|
|
609
|
-
createComputedRenderRules:
|
|
613
|
+
createComputedRenderRules: C,
|
|
610
614
|
...i,
|
|
611
|
-
getValue:
|
|
612
|
-
isFieldHidden:
|
|
615
|
+
getValue: P,
|
|
616
|
+
isFieldHidden: y,
|
|
613
617
|
keyIdMap: m,
|
|
614
|
-
getDefault:
|
|
615
|
-
getEmptyOrDefault:
|
|
618
|
+
getDefault: S,
|
|
619
|
+
getEmptyOrDefault: R
|
|
616
620
|
};
|
|
617
621
|
}
|
|
618
622
|
);
|
|
619
|
-
function
|
|
620
|
-
const e =
|
|
623
|
+
function ae() {
|
|
624
|
+
const e = aa();
|
|
621
625
|
if (!e)
|
|
622
626
|
throw new Error("useFormShared() called without provider.");
|
|
623
627
|
return e;
|
|
624
628
|
}
|
|
625
|
-
const
|
|
626
|
-
const
|
|
627
|
-
const n =
|
|
628
|
-
let
|
|
629
|
-
return !
|
|
629
|
+
const ct = (e) => {
|
|
630
|
+
const r = we(Ge, w(() => "")), t = w(() => {
|
|
631
|
+
const n = E(e);
|
|
632
|
+
let s = n;
|
|
633
|
+
return !We(n) && r.value && (s = $(r.value, n)), We(n) && (s = s.slice(Ee("").length)), s;
|
|
630
634
|
});
|
|
631
|
-
return Pe(
|
|
632
|
-
},
|
|
633
|
-
const { getSchema:
|
|
634
|
-
const p =
|
|
635
|
-
const u =
|
|
636
|
-
return { ...
|
|
635
|
+
return Pe(Ge, t), t;
|
|
636
|
+
}, na = (e) => {
|
|
637
|
+
const { getSchema: r, getSchemaMap: t, fieldRendererRegistry: n } = ae(), { default: s, ...a } = Ae(), c = we(Oe), d = w(() => {
|
|
638
|
+
const p = E(c), i = t(), m = Object.keys(a).filter((h) => h !== ke && h !== "item").reduce((h, l) => {
|
|
639
|
+
const u = he($(E(e), l), i);
|
|
640
|
+
return { ...h, [u]: a[l] };
|
|
637
641
|
}, {});
|
|
638
642
|
return p ? { ...p, ...m } : m;
|
|
639
643
|
});
|
|
640
|
-
return Pe(
|
|
641
|
-
if (
|
|
642
|
-
const p =
|
|
644
|
+
return Pe(Oe, d), w(() => {
|
|
645
|
+
if (s) return;
|
|
646
|
+
const p = E(e), i = d.value[he(p, t())];
|
|
643
647
|
if (i) return i;
|
|
644
648
|
const m = t();
|
|
645
|
-
for (const [
|
|
646
|
-
const u =
|
|
647
|
-
if (
|
|
649
|
+
for (const [h, l] of n) {
|
|
650
|
+
const u = he(p, m);
|
|
651
|
+
if (h({ path: p, genericPath: u, schema: r(p) }))
|
|
648
652
|
return l;
|
|
649
653
|
}
|
|
650
654
|
});
|
|
651
|
-
},
|
|
652
|
-
function
|
|
653
|
-
const { formData:
|
|
655
|
+
}, _e = "__FREEFORM_SCHEMA_MAP__";
|
|
656
|
+
function ia(e) {
|
|
657
|
+
const { formData: r } = ae(), t = ct(e);
|
|
654
658
|
return {
|
|
655
|
-
value:
|
|
656
|
-
get: () =>
|
|
657
|
-
set: (
|
|
659
|
+
value: w({
|
|
660
|
+
get: () => tt(r, Z(t.value)),
|
|
661
|
+
set: (s) => Pt(r, Z(t.value), s)
|
|
658
662
|
})
|
|
659
663
|
};
|
|
660
664
|
}
|
|
661
|
-
function
|
|
662
|
-
const { getSchema:
|
|
665
|
+
function Y(e) {
|
|
666
|
+
const { getSchema: r, isFieldHidden: t, getEmptyOrDefault: n } = ae(), s = ct(e), a = na(s), { value: c } = ia(e), d = w(() => r(s.value)), p = w(() => t(s.value)), i = w(() => n(s.value));
|
|
663
667
|
return d.value ? {
|
|
664
668
|
schema: d,
|
|
665
|
-
path:
|
|
669
|
+
path: s,
|
|
666
670
|
renderer: a,
|
|
667
671
|
value: c,
|
|
668
|
-
ancestors:
|
|
672
|
+
ancestors: ut(s),
|
|
669
673
|
/**
|
|
670
674
|
* Hide the field but keep its state.
|
|
671
675
|
*/
|
|
@@ -673,24 +677,24 @@ function Z(e) {
|
|
|
673
677
|
emptyOrDefaultValue: i,
|
|
674
678
|
error: null
|
|
675
679
|
} : {
|
|
676
|
-
error: new Error(`path '${
|
|
680
|
+
error: new Error(`path '${s.value}' is not found in schema.`)
|
|
677
681
|
};
|
|
678
682
|
}
|
|
679
|
-
function
|
|
683
|
+
function oa(e, r) {
|
|
680
684
|
const t = /* @__PURE__ */ new WeakMap(), n = /* @__PURE__ */ new Map();
|
|
681
|
-
function
|
|
682
|
-
return
|
|
685
|
+
function s() {
|
|
686
|
+
return It(`${e}-`);
|
|
683
687
|
}
|
|
684
688
|
function a(c, d) {
|
|
685
689
|
if (c == null || typeof c != "object")
|
|
686
690
|
return `${e}-${d}`;
|
|
687
691
|
if (t.has(c))
|
|
688
692
|
return t.get(c);
|
|
689
|
-
const p = n.has(d) ? n.get(d) :
|
|
693
|
+
const p = n.has(d) ? n.get(d) : s();
|
|
690
694
|
return n.set(d, p), t.set(c, p), p;
|
|
691
695
|
}
|
|
692
|
-
return
|
|
693
|
-
const d =
|
|
696
|
+
return te(r, (c) => {
|
|
697
|
+
const d = E(c), p = /* @__PURE__ */ new Set();
|
|
694
698
|
d.forEach((i, m) => {
|
|
695
699
|
p.add(m);
|
|
696
700
|
}), Array.from(n.keys()).forEach((i) => {
|
|
@@ -698,14 +702,14 @@ function ra(e, s) {
|
|
|
698
702
|
});
|
|
699
703
|
}, { immediate: !0, deep: !0 }), { getKey: a };
|
|
700
704
|
}
|
|
701
|
-
function
|
|
702
|
-
|
|
703
|
-
window[
|
|
704
|
-
}, { immediate: !0, deep: !0 }),
|
|
705
|
-
window[
|
|
705
|
+
function Kn(e, r) {
|
|
706
|
+
te(e, (t) => {
|
|
707
|
+
window[_e] || (window[_e] = {}), window[_e][r] = Qe(t);
|
|
708
|
+
}, { immediate: !0, deep: !0 }), bt(() => {
|
|
709
|
+
window[_e] && delete window[_e][r];
|
|
706
710
|
});
|
|
707
711
|
}
|
|
708
|
-
const
|
|
712
|
+
const ra = {
|
|
709
713
|
ip: "IP",
|
|
710
714
|
ssl: "SSL",
|
|
711
715
|
ttl: "TTL",
|
|
@@ -738,22 +742,22 @@ const sa = {
|
|
|
738
742
|
traceid: "TraceID",
|
|
739
743
|
dmq: "DMQ"
|
|
740
744
|
};
|
|
741
|
-
function
|
|
742
|
-
return
|
|
745
|
+
function dt(e) {
|
|
746
|
+
return ra[e.toLocaleLowerCase()] ?? e;
|
|
743
747
|
}
|
|
744
|
-
function
|
|
745
|
-
return e.split("_").map(
|
|
748
|
+
function pt(e) {
|
|
749
|
+
return e.split("_").map(dt).join(" ");
|
|
746
750
|
}
|
|
747
|
-
function
|
|
748
|
-
const t = we(
|
|
751
|
+
function sa(e, r) {
|
|
752
|
+
const t = we(Je, {
|
|
749
753
|
parentPath: null,
|
|
750
754
|
isolate: !1
|
|
751
|
-
}), { parentPath: n, isolate:
|
|
755
|
+
}), { parentPath: n, isolate: s } = E(t), a = re(n ? $(n, e) : e), c = re({
|
|
752
756
|
parentPath: a.value,
|
|
753
|
-
isolate:
|
|
757
|
+
isolate: s
|
|
754
758
|
});
|
|
755
|
-
return
|
|
756
|
-
const { parentPath: i, isolate: m } = p,
|
|
759
|
+
return te([j(r), j(t)], ([d, p]) => {
|
|
760
|
+
const { parentPath: i, isolate: m } = p, h = i ? $(i, e) : e;
|
|
757
761
|
d ? {
|
|
758
762
|
isolate: () => {
|
|
759
763
|
a.value = e, c.value.isolate = !0, c.value.parentPath = null;
|
|
@@ -768,48 +772,48 @@ function la(e, s) {
|
|
|
768
772
|
c.value.isolate = !1, c.value.parentPath = null;
|
|
769
773
|
},
|
|
770
774
|
inherit: () => {
|
|
771
|
-
a.value =
|
|
775
|
+
a.value = h, c.value.isolate = !1, c.value.parentPath = h;
|
|
772
776
|
}
|
|
773
777
|
}[d]?.() : m && (a.value = e, c.value.isolate = !0, c.value.parentPath = null);
|
|
774
|
-
}, { deep: !0, immediate: !0 }), Pe(
|
|
778
|
+
}, { deep: !0, immediate: !0 }), Pe(Je, c), a;
|
|
775
779
|
}
|
|
776
|
-
function
|
|
777
|
-
return
|
|
780
|
+
function mt(e) {
|
|
781
|
+
return Z(e).map((t) => t.split("_").map(dt).join(" ")).map(Lt).join(" › ");
|
|
778
782
|
}
|
|
779
|
-
function
|
|
780
|
-
const t =
|
|
781
|
-
return
|
|
782
|
-
const p = c.value ?? n, i = d.value.parent?.path ? a(d.value.parent.path) : null, m = i?.type === "array",
|
|
783
|
-
if (m ||
|
|
783
|
+
function la(e, r) {
|
|
784
|
+
const t = E(e), n = me(t), { config: s, getSchema: a } = ae(), c = sa(n, r), d = ut(e);
|
|
785
|
+
return w(() => {
|
|
786
|
+
const p = c.value ?? n, i = d.value.parent?.path ? a(d.value.parent.path) : null, m = i?.type === "array", h = i?.type === "map";
|
|
787
|
+
if (m || h)
|
|
784
788
|
return "";
|
|
785
|
-
const l =
|
|
786
|
-
return
|
|
789
|
+
const l = mt(p);
|
|
790
|
+
return s.value.transformLabel ? s.value.transformLabel(l, t) : l;
|
|
787
791
|
});
|
|
788
792
|
}
|
|
789
|
-
function
|
|
790
|
-
const { getLabelAttributes: t, getPlaceholder: n, getSchema:
|
|
791
|
-
return
|
|
793
|
+
function ne(e, r) {
|
|
794
|
+
const { getLabelAttributes: t, getPlaceholder: n, getSchema: s } = ae(), a = E(e), c = E(r), d = la(e, j(() => E(r).resetLabelPath));
|
|
795
|
+
return w(() => ({
|
|
792
796
|
...c,
|
|
793
797
|
placeholder: c.placeholder ?? n(a) ?? void 0,
|
|
794
798
|
labelAttributes: c.labelAttributes ?? t(a),
|
|
795
799
|
label: c.label ?? d.value,
|
|
796
|
-
required: c.required ??
|
|
800
|
+
required: c.required ?? s(a)?.required
|
|
797
801
|
}));
|
|
798
802
|
}
|
|
799
|
-
function
|
|
800
|
-
const { value: t, ...n } =
|
|
803
|
+
function ua(e, r) {
|
|
804
|
+
const { value: t, ...n } = Y(e), { getEmptyOrDefault: s, keyIdMap: a } = ae(), c = w(() => {
|
|
801
805
|
if (n.path)
|
|
802
806
|
return n.schema.value.values;
|
|
803
|
-
}), d =
|
|
804
|
-
const
|
|
805
|
-
return [
|
|
807
|
+
}), d = w(() => t ? Object.keys(t.value || {}).map((f) => {
|
|
808
|
+
const b = f, C = a.getKey(b) ?? "";
|
|
809
|
+
return [b, C];
|
|
806
810
|
}) : []);
|
|
807
811
|
function p(u, f) {
|
|
808
812
|
t && (a.updateKey(u, f), t.value = { ...t.value });
|
|
809
813
|
}
|
|
810
814
|
function i() {
|
|
811
815
|
if (!t) return;
|
|
812
|
-
const u = a.createKey(), f =
|
|
816
|
+
const u = a.createKey(), f = s($(n.path.value, u));
|
|
813
817
|
return t.value = {
|
|
814
818
|
...t.value,
|
|
815
819
|
[u]: f
|
|
@@ -817,31 +821,31 @@ function ca(e, s) {
|
|
|
817
821
|
}
|
|
818
822
|
function m(u) {
|
|
819
823
|
if (a.deleteKey(u), !t) return;
|
|
820
|
-
const { [u]: f, ...
|
|
821
|
-
Object.keys(
|
|
824
|
+
const { [u]: f, ...b } = t.value || {};
|
|
825
|
+
Object.keys(b).length === 0 ? n.schema?.value?.required ? t.value = {} : t.value = null : t.value = b;
|
|
822
826
|
}
|
|
823
|
-
function
|
|
827
|
+
function h(u) {
|
|
824
828
|
return a.getKey(u);
|
|
825
829
|
}
|
|
826
|
-
const l =
|
|
830
|
+
const l = w(() => {
|
|
827
831
|
if (!n.path) return "";
|
|
828
832
|
const u = me(n.path.value);
|
|
829
833
|
let f = u;
|
|
830
|
-
return
|
|
834
|
+
return ea(u) && (f = a.getKey(u) ?? ""), pt(f);
|
|
831
835
|
});
|
|
832
|
-
if (
|
|
836
|
+
if (r && c.value?.type === "string") {
|
|
833
837
|
let u = function() {
|
|
834
838
|
if (!t || !t.value) return null;
|
|
835
|
-
const
|
|
836
|
-
for (const [
|
|
837
|
-
const
|
|
838
|
-
|
|
839
|
+
const b = {};
|
|
840
|
+
for (const [C, g] of Object.entries(t.value)) {
|
|
841
|
+
const y = a.getKey(C);
|
|
842
|
+
y && (b[y] = g);
|
|
839
843
|
}
|
|
840
|
-
return
|
|
844
|
+
return b;
|
|
841
845
|
}, f = null;
|
|
842
|
-
|
|
843
|
-
const
|
|
844
|
-
fe(f,
|
|
846
|
+
te(() => t?.value, (b) => {
|
|
847
|
+
const C = u();
|
|
848
|
+
fe(f, C) || (f = C, r?.(C));
|
|
845
849
|
}, { deep: !0 });
|
|
846
850
|
}
|
|
847
851
|
return {
|
|
@@ -851,53 +855,53 @@ function ca(e, s) {
|
|
|
851
855
|
removeKey: m,
|
|
852
856
|
field: n,
|
|
853
857
|
fieldDisplayName: l,
|
|
854
|
-
getKeyName:
|
|
858
|
+
getKeyName: h
|
|
855
859
|
};
|
|
856
860
|
}
|
|
857
|
-
const
|
|
858
|
-
actions:
|
|
859
|
-
plugins:
|
|
861
|
+
const ca = { add_entity: "Add {entity}", remove_entity: "Remove {entity}" }, da = { form: { field_rules: { at_least_one_of: "At least one of the following values is required: {parameters}.", mutually_required: "These values must be used together: {parameters}.", mutually_exclusive: "Only one of these values can be used: {parameters}." } }, "free-form": { tag_helper: "Use comma to separate values. eg: value1, value2", foreign_placeholder: "Enter a UUID of {entity}", vault_picker: { component_error: "The vault secret picker is not available" } } }, pa = {
|
|
862
|
+
actions: ca,
|
|
863
|
+
plugins: da
|
|
860
864
|
};
|
|
861
|
-
function
|
|
862
|
-
const e =
|
|
865
|
+
function ve() {
|
|
866
|
+
const e = nt("en-us", pa);
|
|
863
867
|
return {
|
|
864
868
|
i18n: e,
|
|
865
|
-
i18nT:
|
|
869
|
+
i18nT: it(e)
|
|
866
870
|
};
|
|
867
871
|
}
|
|
868
|
-
const
|
|
872
|
+
const be = /* @__PURE__ */ U({
|
|
869
873
|
__name: "EnhancedInput",
|
|
870
874
|
props: {
|
|
871
875
|
modelValue: {},
|
|
872
876
|
multiline: { type: Boolean }
|
|
873
877
|
},
|
|
874
878
|
emits: ["update:modelValue"],
|
|
875
|
-
setup(e, { emit:
|
|
876
|
-
const t = e, n =
|
|
877
|
-
|
|
878
|
-
d.value =
|
|
879
|
+
setup(e, { emit: r }) {
|
|
880
|
+
const t = e, n = ye(), s = r, a = w(() => t.multiline ? Mt : xt), c = w(() => n.characterLimit ?? (t.multiline ? !1 : void 0)), d = re(t.modelValue);
|
|
881
|
+
te(() => t.modelValue, (h) => {
|
|
882
|
+
d.value = h;
|
|
879
883
|
});
|
|
880
|
-
const { config: p } =
|
|
881
|
-
|
|
884
|
+
const { config: p } = ae(), i = (h) => {
|
|
885
|
+
h !== d.value && (d.value = h, p.value.updateOnChange || s("update:modelValue", h));
|
|
882
886
|
}, m = () => {
|
|
883
|
-
p.value.updateOnChange &&
|
|
887
|
+
p.value.updateOnChange && s("update:modelValue", d.value);
|
|
884
888
|
};
|
|
885
|
-
return (
|
|
889
|
+
return (h, l) => (_(), I(o(a), z(h.$attrs, {
|
|
886
890
|
"character-limit": c.value,
|
|
887
891
|
"model-value": e.modelValue,
|
|
888
892
|
resizable: e.multiline ? !0 : void 0,
|
|
889
893
|
onChange: m,
|
|
890
894
|
"onUpdate:modelValue": i
|
|
891
|
-
}),
|
|
895
|
+
}), W({ _: 2 }, [
|
|
892
896
|
oe(Ae(), (u, f) => ({
|
|
893
897
|
name: f,
|
|
894
|
-
fn:
|
|
895
|
-
|
|
898
|
+
fn: x((b) => [
|
|
899
|
+
D(h.$slots, f, Fe(Ze(b)))
|
|
896
900
|
])
|
|
897
901
|
}))
|
|
898
902
|
]), 1040, ["character-limit", "model-value", "resizable"]));
|
|
899
903
|
}
|
|
900
|
-
}),
|
|
904
|
+
}), ma = ["innerHTML"], fa = /* @__PURE__ */ U({
|
|
901
905
|
inheritAttrs: !1,
|
|
902
906
|
__name: "StringField",
|
|
903
907
|
props: {
|
|
@@ -922,27 +926,27 @@ const ve = /* @__PURE__ */ U({
|
|
|
922
926
|
name: {}
|
|
923
927
|
},
|
|
924
928
|
emits: ["update:modelValue"],
|
|
925
|
-
setup(e, { emit:
|
|
926
|
-
const t =
|
|
927
|
-
function g
|
|
928
|
-
m !== void 0 &&
|
|
929
|
+
setup(e, { emit: r }) {
|
|
930
|
+
const t = ye(), { i18n: n } = ve(), s = se(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), a = r, { value: c, hide: d, ...p } = Y(j(() => e.name)), i = ne(p.path, j({ ...s, ...t })), m = c?.value;
|
|
931
|
+
function h(g) {
|
|
932
|
+
m !== void 0 && g === "" && g !== m ? (c.value = null, a("update:modelValue", null)) : (c.value = g.trim(), a("update:modelValue", g.trim()));
|
|
929
933
|
}
|
|
930
|
-
const l =
|
|
931
|
-
return (
|
|
932
|
-
const A =
|
|
933
|
-
return p.error ? (_(),
|
|
934
|
+
const l = w(() => e.showPasswordMaskToggle !== void 0 ? e.showPasswordMaskToggle : s.type === "password" ? !0 : !!(p.schema?.value).encrypted), u = we(at, void 0), f = w(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!p.schema.value?.referenceable), b = w(() => ({ referenceable: f.value })), C = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
935
|
+
return (g, y) => {
|
|
936
|
+
const A = F("KAlert");
|
|
937
|
+
return p.error ? (_(), I(A, {
|
|
934
938
|
key: 0,
|
|
935
939
|
appearance: "danger",
|
|
936
940
|
message: p.error.message
|
|
937
|
-
}, null, 8, ["message"])) :
|
|
938
|
-
|
|
941
|
+
}, null, 8, ["message"])) : G((_(), K("div", Fe(z({ key: 1 }, g.$attrs)), [
|
|
942
|
+
V(be, z({
|
|
939
943
|
...o(i),
|
|
940
944
|
showPasswordMaskToggle: l.value,
|
|
941
945
|
type: l.value ? "password" : "text"
|
|
942
946
|
}, {
|
|
943
947
|
id: e.inputId,
|
|
944
948
|
class: "ff-string-field",
|
|
945
|
-
"data-1p-ignore":
|
|
949
|
+
"data-1p-ignore": C.value,
|
|
946
950
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
947
951
|
"data-testid": `ff-${p.path.value}`,
|
|
948
952
|
error: e.error,
|
|
@@ -951,36 +955,36 @@ const ve = /* @__PURE__ */ U({
|
|
|
951
955
|
"model-value": o(c) ?? "",
|
|
952
956
|
multiline: e.multiline,
|
|
953
957
|
placeholder: e.placeholder ?? o(i).placeholder,
|
|
954
|
-
"onUpdate:modelValue":
|
|
955
|
-
}),
|
|
958
|
+
"onUpdate:modelValue": h
|
|
959
|
+
}), W({ _: 2 }, [
|
|
956
960
|
o(i).labelAttributes?.info ? {
|
|
957
961
|
name: "label-tooltip",
|
|
958
|
-
fn:
|
|
959
|
-
|
|
962
|
+
fn: x(() => [
|
|
963
|
+
D(g.$slots, "tooltip", {}, () => [
|
|
960
964
|
B("div", {
|
|
961
965
|
innerHTML: o(i).labelAttributes.info
|
|
962
|
-
}, null, 8,
|
|
966
|
+
}, null, 8, ma)
|
|
963
967
|
], !0)
|
|
964
968
|
]),
|
|
965
969
|
key: "0"
|
|
966
970
|
} : void 0,
|
|
967
|
-
!(e.multiline && e.error) &&
|
|
971
|
+
!(e.multiline && e.error) && g.$slots.help ? {
|
|
968
972
|
name: "help",
|
|
969
|
-
fn:
|
|
970
|
-
|
|
973
|
+
fn: x(() => [
|
|
974
|
+
D(g.$slots, "help", {}, void 0, !0)
|
|
971
975
|
]),
|
|
972
976
|
key: "1"
|
|
973
977
|
} : void 0,
|
|
974
978
|
!e.multiline && e.inlineVaultPicker ? {
|
|
975
979
|
name: "after",
|
|
976
|
-
fn:
|
|
977
|
-
o(u) && f.value ? (_(),
|
|
980
|
+
fn: x(() => [
|
|
981
|
+
o(u) && f.value ? (_(), I(ie(o(u)), {
|
|
978
982
|
key: 0,
|
|
979
|
-
schema:
|
|
980
|
-
update:
|
|
983
|
+
schema: b.value,
|
|
984
|
+
update: h,
|
|
981
985
|
value: o(c) ?? ""
|
|
982
986
|
}, null, 8, ["schema", "value"])) : N("", !0),
|
|
983
|
-
f.value && !o(u) ? (_(),
|
|
987
|
+
f.value && !o(u) ? (_(), I(A, {
|
|
984
988
|
key: 1,
|
|
985
989
|
appearance: "warning",
|
|
986
990
|
"data-testid": `ff-vault-secret-picker-warning-${p.path.value}`,
|
|
@@ -991,13 +995,13 @@ const ve = /* @__PURE__ */ U({
|
|
|
991
995
|
} : void 0
|
|
992
996
|
]), 1040, ["id", "data-1p-ignore", "data-autofocus", "data-testid", "error", "error-message", "help", "model-value", "multiline", "placeholder"]),
|
|
993
997
|
e.inlineVaultPicker ? N("", !0) : (_(), K(ee, { key: 0 }, [
|
|
994
|
-
o(u) && f.value ? (_(),
|
|
998
|
+
o(u) && f.value ? (_(), I(ie(o(u)), {
|
|
995
999
|
key: 0,
|
|
996
|
-
schema:
|
|
997
|
-
update:
|
|
1000
|
+
schema: b.value,
|
|
1001
|
+
update: h,
|
|
998
1002
|
value: o(c) ?? ""
|
|
999
1003
|
}, null, 8, ["schema", "value"])) : N("", !0),
|
|
1000
|
-
f.value && !o(u) ? (_(),
|
|
1004
|
+
f.value && !o(u) ? (_(), I(A, {
|
|
1001
1005
|
key: 1,
|
|
1002
1006
|
appearance: "warning",
|
|
1003
1007
|
"data-testid": `ff-vault-secret-picker-warning-${p.path.value}`,
|
|
@@ -1005,16 +1009,16 @@ const ve = /* @__PURE__ */ U({
|
|
|
1005
1009
|
}, null, 8, ["data-testid", "message"])) : N("", !0)
|
|
1006
1010
|
], 64))
|
|
1007
1011
|
], 16)), [
|
|
1008
|
-
[
|
|
1012
|
+
[J, !o(d)]
|
|
1009
1013
|
]);
|
|
1010
1014
|
};
|
|
1011
1015
|
}
|
|
1012
|
-
}),
|
|
1016
|
+
}), H = (e, r) => {
|
|
1013
1017
|
const t = e.__vccOpts || e;
|
|
1014
|
-
for (const [n,
|
|
1015
|
-
t[n] =
|
|
1018
|
+
for (const [n, s] of r)
|
|
1019
|
+
t[n] = s;
|
|
1016
1020
|
return t;
|
|
1017
|
-
},
|
|
1021
|
+
}, ft = /* @__PURE__ */ H(fa, [["__scopeId", "data-v-5cb8f07e"]]), ha = ["innerHTML"], ga = /* @__PURE__ */ U({
|
|
1018
1022
|
inheritAttrs: !1,
|
|
1019
1023
|
__name: "BooleanField",
|
|
1020
1024
|
props: {
|
|
@@ -1024,40 +1028,40 @@ const ve = /* @__PURE__ */ U({
|
|
|
1024
1028
|
name: {}
|
|
1025
1029
|
},
|
|
1026
1030
|
emits: ["update:modelValue"],
|
|
1027
|
-
setup(e, { emit:
|
|
1028
|
-
const t = se(e, ["autofocus", "name"]), { value: n, hide:
|
|
1031
|
+
setup(e, { emit: r }) {
|
|
1032
|
+
const t = se(e, ["autofocus", "name"]), { value: n, hide: s, emptyOrDefaultValue: a, ...c } = Y(j(() => e.name)), d = r, p = (m) => {
|
|
1029
1033
|
n.value = m, d("update:modelValue", m);
|
|
1030
|
-
}, i =
|
|
1031
|
-
return (m,
|
|
1032
|
-
const l =
|
|
1033
|
-
return c.error ? (_(),
|
|
1034
|
+
}, i = ne(c.path, t);
|
|
1035
|
+
return (m, h) => {
|
|
1036
|
+
const l = F("KAlert");
|
|
1037
|
+
return c.error ? (_(), I(l, {
|
|
1034
1038
|
key: 0,
|
|
1035
1039
|
appearance: "danger",
|
|
1036
1040
|
message: c.error.message
|
|
1037
|
-
}, null, 8, ["message"])) :
|
|
1041
|
+
}, null, 8, ["message"])) : G((_(), I(o(Rt), z({ key: 1 }, { ...o(i), ...m.$attrs }, {
|
|
1038
1042
|
class: "ff-boolean-field",
|
|
1039
1043
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1040
1044
|
"data-testid": `ff-${c.path.value}`,
|
|
1041
1045
|
"model-value": !!(o(n) == null ? o(a) : o(n)),
|
|
1042
1046
|
"onUpdate:modelValue": p
|
|
1043
|
-
}),
|
|
1047
|
+
}), W({ _: 2 }, [
|
|
1044
1048
|
o(i).labelAttributes?.info ? {
|
|
1045
1049
|
name: "tooltip",
|
|
1046
|
-
fn:
|
|
1047
|
-
|
|
1050
|
+
fn: x(() => [
|
|
1051
|
+
D(m.$slots, "tooltip", {}, () => [
|
|
1048
1052
|
B("div", {
|
|
1049
1053
|
innerHTML: o(i).labelAttributes.info
|
|
1050
|
-
}, null, 8,
|
|
1054
|
+
}, null, 8, ha)
|
|
1051
1055
|
], !0)
|
|
1052
1056
|
]),
|
|
1053
1057
|
key: "0"
|
|
1054
1058
|
} : void 0
|
|
1055
1059
|
]), 1040, ["data-autofocus", "data-testid", "model-value"])), [
|
|
1056
|
-
[
|
|
1060
|
+
[J, !o(s)]
|
|
1057
1061
|
]);
|
|
1058
1062
|
};
|
|
1059
1063
|
}
|
|
1060
|
-
}),
|
|
1064
|
+
}), ya = /* @__PURE__ */ H(ga, [["__scopeId", "data-v-a1c08c7f"]]), va = ["data-testid"], ba = ["innerHTML"], _a = /* @__PURE__ */ U({
|
|
1061
1065
|
inheritAttrs: !1,
|
|
1062
1066
|
__name: "StringArrayField",
|
|
1063
1067
|
props: {
|
|
@@ -1067,59 +1071,59 @@ const ve = /* @__PURE__ */ U({
|
|
|
1067
1071
|
name: {}
|
|
1068
1072
|
},
|
|
1069
1073
|
emits: ["update:modelValue"],
|
|
1070
|
-
setup(e, { emit:
|
|
1071
|
-
const t =
|
|
1072
|
-
function
|
|
1073
|
-
return
|
|
1074
|
+
setup(e, { emit: r }) {
|
|
1075
|
+
const t = ye(), n = se(e, ["autofocus", "name"]), s = r, { value: a, hide: c, ...d } = Y(j(() => e.name)), p = ne(d.path, j({ ...n, ...t })), i = w(() => d.schema?.value?.len_min && d.schema.value.len_min > 0), m = re("");
|
|
1076
|
+
function h(b) {
|
|
1077
|
+
return b.map((C) => C.trim()).filter(Boolean).join(", ");
|
|
1074
1078
|
}
|
|
1075
|
-
function l(
|
|
1076
|
-
return
|
|
1079
|
+
function l(b) {
|
|
1080
|
+
return b.trim().split(",").map((C) => C.trim()).filter(Boolean);
|
|
1077
1081
|
}
|
|
1078
|
-
function u(
|
|
1079
|
-
m.value =
|
|
1080
|
-
const
|
|
1081
|
-
a.value =
|
|
1082
|
+
function u(b) {
|
|
1083
|
+
m.value = b;
|
|
1084
|
+
const C = l(b), g = !C.length && i.value ? null : C;
|
|
1085
|
+
a.value = g, s("update:modelValue", g);
|
|
1082
1086
|
}
|
|
1083
|
-
const f =
|
|
1084
|
-
return
|
|
1085
|
-
const
|
|
1086
|
-
|
|
1087
|
-
}, { immediate: !0 }), (
|
|
1088
|
-
const
|
|
1089
|
-
return d.error ? (_(),
|
|
1087
|
+
const f = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1088
|
+
return te(a, (b) => {
|
|
1089
|
+
const C = b ? h(b) : "";
|
|
1090
|
+
h(l(m.value)) !== C && (m.value = C);
|
|
1091
|
+
}, { immediate: !0 }), (b, C) => {
|
|
1092
|
+
const g = F("KAlert");
|
|
1093
|
+
return d.error ? (_(), I(g, {
|
|
1090
1094
|
key: 0,
|
|
1091
1095
|
appearance: "danger",
|
|
1092
1096
|
message: d.error.message
|
|
1093
|
-
}, null, 8, ["message"])) :
|
|
1097
|
+
}, null, 8, ["message"])) : G((_(), K("div", {
|
|
1094
1098
|
key: 1,
|
|
1095
1099
|
"data-testid": `ff-tag-${d.path.value}`
|
|
1096
1100
|
}, [
|
|
1097
|
-
|
|
1101
|
+
V(be, z(o(p), {
|
|
1098
1102
|
class: "ff-tag-field",
|
|
1099
1103
|
"data-1p-ignore": f.value,
|
|
1100
1104
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1101
1105
|
"data-testid": `ff-${d.path.value}`,
|
|
1102
1106
|
"model-value": m.value ?? "",
|
|
1103
1107
|
"onUpdate:modelValue": u
|
|
1104
|
-
}),
|
|
1108
|
+
}), W({ _: 2 }, [
|
|
1105
1109
|
o(p).labelAttributes?.info ? {
|
|
1106
1110
|
name: "label-tooltip",
|
|
1107
|
-
fn:
|
|
1108
|
-
|
|
1111
|
+
fn: x(() => [
|
|
1112
|
+
D(b.$slots, "tooltip", {}, () => [
|
|
1109
1113
|
B("div", {
|
|
1110
1114
|
innerHTML: o(p).labelAttributes.info
|
|
1111
|
-
}, null, 8,
|
|
1115
|
+
}, null, 8, ba)
|
|
1112
1116
|
], !0)
|
|
1113
1117
|
]),
|
|
1114
1118
|
key: "0"
|
|
1115
1119
|
} : void 0
|
|
1116
1120
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1117
|
-
], 8,
|
|
1118
|
-
[
|
|
1121
|
+
], 8, va)), [
|
|
1122
|
+
[J, !o(c)]
|
|
1119
1123
|
]);
|
|
1120
1124
|
};
|
|
1121
1125
|
}
|
|
1122
|
-
}),
|
|
1126
|
+
}), ht = /* @__PURE__ */ H(_a, [["__scopeId", "data-v-3aa09162"]]), Aa = ["data-appearance", "data-testid"], wa = ["data-testid"], ka = ["innerHTML"], Sa = ["data-testid"], Ta = { class: "ff-array-field-item-content" }, Ca = ["data-index", "data-testid"], xe = 'input:not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled), [contenteditable="true"], [tabindex]:not([tabindex="-1"]):not(:disabled)', Pa = /* @__PURE__ */ U({
|
|
1123
1127
|
__name: "ArrayField",
|
|
1124
1128
|
props: {
|
|
1125
1129
|
name: {},
|
|
@@ -1133,63 +1137,63 @@ const ve = /* @__PURE__ */ U({
|
|
|
1133
1137
|
autofocus: { type: Boolean }
|
|
1134
1138
|
},
|
|
1135
1139
|
emits: ["add", "remove"],
|
|
1136
|
-
setup(e, { emit:
|
|
1137
|
-
|
|
1138
|
-
v2cc732dc:
|
|
1140
|
+
setup(e, { emit: r }) {
|
|
1141
|
+
_t((S) => ({
|
|
1142
|
+
v2cc732dc: L.value
|
|
1139
1143
|
}));
|
|
1140
|
-
const t = e, n =
|
|
1144
|
+
const t = e, n = r, { i18n: { t: s } } = ve(), { getDefault: a, getSchema: c } = ae(), { value: d, hide: p, ...i } = Y(j(t, "name")), m = ne(i.path, j({ ...t, ...ye() })), h = w(() => {
|
|
1141
1145
|
if (!i.path) throw new Error("Field path is required for sub-schema retrieval");
|
|
1142
|
-
const
|
|
1143
|
-
if (!
|
|
1144
|
-
return
|
|
1145
|
-
}), l =
|
|
1146
|
+
const S = c(i.path.value);
|
|
1147
|
+
if (!S) throw new Error(`Schema not found for path: ${i.path.value}`);
|
|
1148
|
+
return S.elements;
|
|
1149
|
+
}), l = w(() => {
|
|
1146
1150
|
if (!i.path) return "";
|
|
1147
|
-
const
|
|
1148
|
-
return
|
|
1149
|
-
}), u =
|
|
1150
|
-
function
|
|
1151
|
-
return typeof t.itemLabel == "function" ? t.itemLabel(
|
|
1151
|
+
const S = me(i.path.value);
|
|
1152
|
+
return pt(S);
|
|
1153
|
+
}), u = w(() => t.items ?? E(d) ?? []), { getKey: f } = oa("ff-array-field", u), b = w(() => t.appearance ? t.appearance : h.value.type === "record" || h.value.type === "map" ? "card" : "default"), C = w(() => b.value === "card" ? Ke : "div");
|
|
1154
|
+
function g(S, R) {
|
|
1155
|
+
return typeof t.itemLabel == "function" ? t.itemLabel(S, R) : t.itemLabel || m.value.label || `Item #${R}`;
|
|
1152
1156
|
}
|
|
1153
|
-
const
|
|
1154
|
-
hash: `#${f(
|
|
1157
|
+
const y = w(() => u.value.map((S, R) => ({
|
|
1158
|
+
hash: `#${f(S, R)}`,
|
|
1155
1159
|
title: ""
|
|
1156
|
-
}))), A = re(
|
|
1157
|
-
const
|
|
1158
|
-
Array.isArray(d.value) || (d.value = []), d.value.push(
|
|
1159
|
-
},
|
|
1160
|
-
Array.isArray(d.value) && (d.value.splice(
|
|
1161
|
-
},
|
|
1162
|
-
function
|
|
1163
|
-
if (!
|
|
1160
|
+
}))), A = re(y.value[0]?.hash), T = async () => {
|
|
1161
|
+
const S = a($(i.path.value, Be));
|
|
1162
|
+
Array.isArray(d.value) || (d.value = []), d.value.push(S), n("add"), t.appearance === "tabs" && (await Re(), A.value = y.value[y.value.length - 1]?.hash), await Re(), P(u.value.length + 1);
|
|
1163
|
+
}, v = async (S) => {
|
|
1164
|
+
Array.isArray(d.value) && (d.value.splice(S, 1), d.value.length === 0 && !m.value.required && (d.value = null)), n("remove", S), t.appearance === "tabs" && (A.value = y.value[Math.max(0, S - 1)]?.hash);
|
|
1165
|
+
}, k = et("root");
|
|
1166
|
+
function P(S) {
|
|
1167
|
+
if (!k.value)
|
|
1164
1168
|
return;
|
|
1165
|
-
const
|
|
1166
|
-
if (!
|
|
1169
|
+
const R = Math.max(0, Math.min(S, u.value.length - 1)), q = k.value.querySelector(`[data-index="${R}"]`);
|
|
1170
|
+
if (!q)
|
|
1167
1171
|
return;
|
|
1168
|
-
|
|
1172
|
+
M(q)?.focus();
|
|
1169
1173
|
}
|
|
1170
|
-
function
|
|
1171
|
-
const
|
|
1172
|
-
return
|
|
1174
|
+
function M(S) {
|
|
1175
|
+
const R = S.querySelector('[data-autofocus="true"]');
|
|
1176
|
+
return R ? R.matches(xe) ? R : R.querySelector(xe) : S.querySelector(xe);
|
|
1173
1177
|
}
|
|
1174
|
-
const
|
|
1175
|
-
const { appearance:
|
|
1176
|
-
return
|
|
1178
|
+
const L = w(() => {
|
|
1179
|
+
const { appearance: S, stickyTabs: R } = t;
|
|
1180
|
+
return S !== "tabs" || R == null || R === !1 ? null : typeof R == "number" ? `${t.stickyTabs}px` : typeof R == "string" ? R : "0";
|
|
1177
1181
|
});
|
|
1178
|
-
return (
|
|
1179
|
-
const
|
|
1180
|
-
return i.error ? (_(),
|
|
1182
|
+
return (S, R) => {
|
|
1183
|
+
const q = F("KAlert"), X = F("KLabel"), Q = F("KButton"), de = F("KTooltip"), gt = F("KTabs");
|
|
1184
|
+
return i.error ? (_(), I(q, {
|
|
1181
1185
|
key: 0,
|
|
1182
1186
|
appearance: "danger",
|
|
1183
1187
|
message: i.error.message
|
|
1184
|
-
}, null, 8, ["message"])) :
|
|
1188
|
+
}, null, 8, ["message"])) : G((_(), K("div", {
|
|
1185
1189
|
key: 1,
|
|
1186
1190
|
ref_key: "root",
|
|
1187
|
-
ref:
|
|
1191
|
+
ref: k,
|
|
1188
1192
|
class: Te(["ff-array-field", {
|
|
1189
|
-
[`ff-array-field-${
|
|
1193
|
+
[`ff-array-field-${b.value ?? "default"}`]: !0,
|
|
1190
1194
|
"ff-array-field-sticky-tabs": e.stickyTabs
|
|
1191
1195
|
}]),
|
|
1192
|
-
"data-appearance":
|
|
1196
|
+
"data-appearance": b.value,
|
|
1193
1197
|
"data-testid": `ff-array-${i.path.value}`
|
|
1194
1198
|
}, [
|
|
1195
1199
|
o(m).label && !e.hideLabel ? (_(), K("header", {
|
|
@@ -1197,85 +1201,85 @@ const ve = /* @__PURE__ */ U({
|
|
|
1197
1201
|
class: "ff-array-field-header",
|
|
1198
1202
|
"data-testid": `ff-array-header-${i.path.value}`
|
|
1199
1203
|
}, [
|
|
1200
|
-
|
|
1204
|
+
V(X, z({ class: "ff-array-field-label" }, o(m), {
|
|
1201
1205
|
"data-testid": `ff-label-${i.path.value}`,
|
|
1202
1206
|
"tooltip-attributes": o(m).labelAttributes.tooltipAttributes
|
|
1203
|
-
}),
|
|
1204
|
-
default:
|
|
1207
|
+
}), W({
|
|
1208
|
+
default: x(() => [
|
|
1205
1209
|
pe(ce(o(m).label) + " ", 1)
|
|
1206
1210
|
]),
|
|
1207
1211
|
_: 2
|
|
1208
1212
|
}, [
|
|
1209
1213
|
o(m).labelAttributes?.info ? {
|
|
1210
1214
|
name: "tooltip",
|
|
1211
|
-
fn:
|
|
1212
|
-
|
|
1215
|
+
fn: x(() => [
|
|
1216
|
+
D(S.$slots, "tooltip", {}, () => [
|
|
1213
1217
|
B("div", {
|
|
1214
1218
|
innerHTML: o(m).labelAttributes.info
|
|
1215
|
-
}, null, 8,
|
|
1219
|
+
}, null, 8, ka)
|
|
1216
1220
|
], !0)
|
|
1217
1221
|
]),
|
|
1218
1222
|
key: "0"
|
|
1219
1223
|
} : void 0
|
|
1220
1224
|
]), 1040, ["data-testid", "tooltip-attributes"]),
|
|
1221
|
-
e.appearance === "tabs" ? (_(),
|
|
1225
|
+
e.appearance === "tabs" ? (_(), I(Q, {
|
|
1222
1226
|
key: 0,
|
|
1223
1227
|
appearance: "tertiary",
|
|
1224
|
-
"aria-label": o(
|
|
1228
|
+
"aria-label": o(s)("actions.add_entity", { entity: l.value }),
|
|
1225
1229
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1226
1230
|
icon: "",
|
|
1227
|
-
onClick:
|
|
1231
|
+
onClick: T
|
|
1228
1232
|
}, {
|
|
1229
|
-
default:
|
|
1230
|
-
|
|
1233
|
+
default: x(() => [
|
|
1234
|
+
V(o(je))
|
|
1231
1235
|
]),
|
|
1232
1236
|
_: 1
|
|
1233
1237
|
}, 8, ["aria-label", "data-testid"])) : N("", !0)
|
|
1234
|
-
], 8,
|
|
1235
|
-
|
|
1238
|
+
], 8, wa)) : N("", !0),
|
|
1239
|
+
b.value !== "tabs" ? (_(), K(ee, { key: 1 }, [
|
|
1236
1240
|
B("div", {
|
|
1237
1241
|
class: "ff-array-field-container",
|
|
1238
1242
|
"data-testid": `ff-array-basic-container-${i.path.value}`
|
|
1239
1243
|
}, [
|
|
1240
|
-
(_(!0), K(ee, null, oe(u.value, (
|
|
1241
|
-
key: o(f)(
|
|
1242
|
-
class: Te(["ff-array-field-item", { "ff-array-field-item-card":
|
|
1244
|
+
(_(!0), K(ee, null, oe(u.value, (le, O) => (_(), I(o(C), {
|
|
1245
|
+
key: o(f)(le, O),
|
|
1246
|
+
class: Te(["ff-array-field-item", { "ff-array-field-item-card": b.value === "card" }]),
|
|
1243
1247
|
"data-index": O,
|
|
1244
1248
|
"data-testid": `ff-array-item-${i.path.value}.${O}`
|
|
1245
1249
|
}, {
|
|
1246
|
-
default:
|
|
1247
|
-
B("div",
|
|
1248
|
-
|
|
1250
|
+
default: x(() => [
|
|
1251
|
+
B("div", Ta, [
|
|
1252
|
+
S.$slots.item ? D(S.$slots, "item", {
|
|
1249
1253
|
key: 0,
|
|
1250
1254
|
autofocus: !0,
|
|
1251
1255
|
fieldName: String(O),
|
|
1252
1256
|
index: O
|
|
1253
|
-
}, void 0, !0) :
|
|
1257
|
+
}, void 0, !0) : h.value.type === "array" && h.value.elements.type === "string" ? (_(), I(ht, {
|
|
1254
1258
|
key: 1,
|
|
1255
1259
|
autofocus: "",
|
|
1256
|
-
help: o(
|
|
1260
|
+
help: o(s)("plugins.free-form.tag_helper"),
|
|
1257
1261
|
name: String(O)
|
|
1258
|
-
}, null, 8, ["help", "name"])) : (_(),
|
|
1262
|
+
}, null, 8, ["help", "name"])) : (_(), I(ge, {
|
|
1259
1263
|
key: 2,
|
|
1260
1264
|
autofocus: "",
|
|
1261
1265
|
name: String(O)
|
|
1262
1266
|
}, null, 8, ["name"]))
|
|
1263
1267
|
]),
|
|
1264
|
-
|
|
1268
|
+
V(de, {
|
|
1265
1269
|
class: "ff-array-field-item-remove-tooltip",
|
|
1266
|
-
text: o(
|
|
1270
|
+
text: o(s)("actions.remove_entity", { entity: l.value })
|
|
1267
1271
|
}, {
|
|
1268
|
-
default:
|
|
1269
|
-
|
|
1272
|
+
default: x(() => [
|
|
1273
|
+
V(Q, {
|
|
1270
1274
|
appearance: "tertiary",
|
|
1271
|
-
"aria-label": o(
|
|
1275
|
+
"aria-label": o(s)("actions.remove_entity", { entity: l.value }),
|
|
1272
1276
|
class: "ff-array-field-item-remove",
|
|
1273
1277
|
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${O}`,
|
|
1274
1278
|
icon: "",
|
|
1275
|
-
onClick: Ce((yt) =>
|
|
1279
|
+
onClick: Ce((yt) => v(O), ["stop"])
|
|
1276
1280
|
}, {
|
|
1277
|
-
default:
|
|
1278
|
-
|
|
1281
|
+
default: x(() => [
|
|
1282
|
+
V(o(ot))
|
|
1279
1283
|
]),
|
|
1280
1284
|
_: 1
|
|
1281
1285
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1285,66 +1289,66 @@ const ve = /* @__PURE__ */ U({
|
|
|
1285
1289
|
]),
|
|
1286
1290
|
_: 2
|
|
1287
1291
|
}, 1032, ["class", "data-index", "data-testid"]))), 128))
|
|
1288
|
-
], 8,
|
|
1289
|
-
|
|
1292
|
+
], 8, Sa),
|
|
1293
|
+
V(Q, {
|
|
1290
1294
|
appearance: "tertiary",
|
|
1291
|
-
"aria-label": o(
|
|
1295
|
+
"aria-label": o(s)("actions.add_entity", { entity: l.value }),
|
|
1292
1296
|
class: "ff-array-field-add-item-btn",
|
|
1293
1297
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1294
|
-
onClick:
|
|
1298
|
+
onClick: T
|
|
1295
1299
|
}, {
|
|
1296
|
-
default:
|
|
1297
|
-
|
|
1298
|
-
pe(" " + ce(o(
|
|
1300
|
+
default: x(() => [
|
|
1301
|
+
V(o(je)),
|
|
1302
|
+
pe(" " + ce(o(s)("actions.add_entity", { entity: l.value })), 1)
|
|
1299
1303
|
]),
|
|
1300
1304
|
_: 1
|
|
1301
1305
|
}, 8, ["aria-label", "data-testid"])
|
|
1302
|
-
], 64)) : u.value.length ? (_(),
|
|
1306
|
+
], 64)) : u.value.length ? (_(), I(o(Ke), {
|
|
1303
1307
|
key: 2,
|
|
1304
1308
|
"data-testid": `ff-array-tab-container-${i.path.value}`
|
|
1305
1309
|
}, {
|
|
1306
|
-
default:
|
|
1307
|
-
|
|
1310
|
+
default: x(() => [
|
|
1311
|
+
V(gt, {
|
|
1308
1312
|
modelValue: A.value,
|
|
1309
|
-
"onUpdate:modelValue":
|
|
1313
|
+
"onUpdate:modelValue": R[0] || (R[0] = (le) => A.value = le),
|
|
1310
1314
|
"data-testid": `ff-array-tabs-${i.path.value}`,
|
|
1311
|
-
tabs:
|
|
1312
|
-
},
|
|
1313
|
-
oe(u.value, (
|
|
1314
|
-
name: o(f)(
|
|
1315
|
-
fn:
|
|
1315
|
+
tabs: y.value
|
|
1316
|
+
}, W({ _: 2 }, [
|
|
1317
|
+
oe(u.value, (le, O) => ({
|
|
1318
|
+
name: o(f)(le, O),
|
|
1319
|
+
fn: x(() => [
|
|
1316
1320
|
B("div", {
|
|
1317
1321
|
class: "ff-array-field-item",
|
|
1318
1322
|
"data-index": O,
|
|
1319
1323
|
"data-testid": `ff-array-item-${i.path.value}.${O}`
|
|
1320
1324
|
}, [
|
|
1321
|
-
|
|
1325
|
+
S.$slots.item ? D(S.$slots, "item", {
|
|
1322
1326
|
key: 0,
|
|
1323
1327
|
autofocus: !0,
|
|
1324
1328
|
fieldName: String(O),
|
|
1325
1329
|
index: O
|
|
1326
|
-
}, void 0, !0) : (_(),
|
|
1330
|
+
}, void 0, !0) : (_(), I(ge, {
|
|
1327
1331
|
key: 1,
|
|
1328
1332
|
autofocus: "",
|
|
1329
1333
|
name: String(O)
|
|
1330
1334
|
}, null, 8, ["name"]))
|
|
1331
|
-
], 8,
|
|
1335
|
+
], 8, Ca)
|
|
1332
1336
|
])
|
|
1333
1337
|
})),
|
|
1334
|
-
oe(u.value, (
|
|
1335
|
-
name: `${o(f)(
|
|
1336
|
-
fn:
|
|
1337
|
-
pe(ce(
|
|
1338
|
-
|
|
1338
|
+
oe(u.value, (le, O) => ({
|
|
1339
|
+
name: `${o(f)(le, O)}-anchor`,
|
|
1340
|
+
fn: x(() => [
|
|
1341
|
+
pe(ce(g(le, O)) + " ", 1),
|
|
1342
|
+
V(Q, {
|
|
1339
1343
|
appearance: "tertiary",
|
|
1340
|
-
"aria-label": o(
|
|
1344
|
+
"aria-label": o(s)("actions.remove_entity", { entity: l.value }),
|
|
1341
1345
|
class: "ff-array-field-item-remove",
|
|
1342
1346
|
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${O}`,
|
|
1343
1347
|
icon: "",
|
|
1344
|
-
onClick: Ce((yt) =>
|
|
1348
|
+
onClick: Ce((yt) => v(O), ["stop"])
|
|
1345
1349
|
}, {
|
|
1346
|
-
default:
|
|
1347
|
-
|
|
1350
|
+
default: x(() => [
|
|
1351
|
+
V(o(Et))
|
|
1348
1352
|
]),
|
|
1349
1353
|
_: 1
|
|
1350
1354
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1354,15 +1358,15 @@ const ve = /* @__PURE__ */ U({
|
|
|
1354
1358
|
]),
|
|
1355
1359
|
_: 3
|
|
1356
1360
|
}, 8, ["data-testid"])) : N("", !0)
|
|
1357
|
-
], 10,
|
|
1358
|
-
[
|
|
1361
|
+
], 10, Aa)), [
|
|
1362
|
+
[J, !o(p)]
|
|
1359
1363
|
]);
|
|
1360
1364
|
};
|
|
1361
1365
|
}
|
|
1362
|
-
}),
|
|
1366
|
+
}), Ia = /* @__PURE__ */ H(Pa, [["__scopeId", "data-v-04b60981"]]), La = /* @__PURE__ */ U({
|
|
1363
1367
|
__name: "SlideTransition",
|
|
1364
1368
|
setup(e) {
|
|
1365
|
-
const
|
|
1369
|
+
const r = [
|
|
1366
1370
|
"height",
|
|
1367
1371
|
"padding-top",
|
|
1368
1372
|
"padding-bottom",
|
|
@@ -1370,15 +1374,15 @@ const ve = /* @__PURE__ */ U({
|
|
|
1370
1374
|
"margin-bottom",
|
|
1371
1375
|
"border-top-width",
|
|
1372
1376
|
"border-bottom-width"
|
|
1373
|
-
], t = Object.fromEntries(
|
|
1374
|
-
function
|
|
1377
|
+
], t = Object.fromEntries(r.map((l) => [l, ""])), n = Object.fromEntries(r.map((l) => [l, "0"]));
|
|
1378
|
+
function s(l) {
|
|
1375
1379
|
const u = getComputedStyle(l);
|
|
1376
1380
|
return Object.fromEntries(
|
|
1377
|
-
|
|
1381
|
+
r.map((f) => [f, u.getPropertyValue(f)])
|
|
1378
1382
|
);
|
|
1379
1383
|
}
|
|
1380
1384
|
function a(l) {
|
|
1381
|
-
["overflow", "transition", ...
|
|
1385
|
+
["overflow", "transition", ...r].forEach(
|
|
1382
1386
|
(u) => l.style.removeProperty(u)
|
|
1383
1387
|
);
|
|
1384
1388
|
}
|
|
@@ -1391,7 +1395,7 @@ const ve = /* @__PURE__ */ U({
|
|
|
1391
1395
|
function d(l) {
|
|
1392
1396
|
const u = l;
|
|
1393
1397
|
Object.assign(u.style, t);
|
|
1394
|
-
const f =
|
|
1398
|
+
const f = s(u);
|
|
1395
1399
|
Object.assign(u.style, n), requestAnimationFrame(() => {
|
|
1396
1400
|
Object.assign(u.style, {
|
|
1397
1401
|
...f,
|
|
@@ -1405,40 +1409,40 @@ const ve = /* @__PURE__ */ U({
|
|
|
1405
1409
|
function i(l) {
|
|
1406
1410
|
const u = l;
|
|
1407
1411
|
Object.assign(u.style, {
|
|
1408
|
-
...
|
|
1412
|
+
...s(u),
|
|
1409
1413
|
overflow: "hidden"
|
|
1410
1414
|
});
|
|
1411
1415
|
}
|
|
1412
1416
|
function m(l) {
|
|
1413
1417
|
Object.assign(l.style, n);
|
|
1414
1418
|
}
|
|
1415
|
-
function
|
|
1419
|
+
function h(l) {
|
|
1416
1420
|
a(l);
|
|
1417
1421
|
}
|
|
1418
|
-
return (l, u) => (_(),
|
|
1422
|
+
return (l, u) => (_(), I(At, {
|
|
1419
1423
|
"enter-active-class": "ff-slide-active",
|
|
1420
1424
|
"leave-active-class": "ff-slide-active",
|
|
1421
1425
|
onAfterEnter: p,
|
|
1422
|
-
onAfterLeave:
|
|
1426
|
+
onAfterLeave: h,
|
|
1423
1427
|
onBeforeEnter: c,
|
|
1424
1428
|
onBeforeLeave: i,
|
|
1425
1429
|
onEnter: d,
|
|
1426
1430
|
onLeave: m
|
|
1427
1431
|
}, {
|
|
1428
|
-
default:
|
|
1429
|
-
|
|
1432
|
+
default: x(() => [
|
|
1433
|
+
D(l.$slots, "default", {}, void 0, !0)
|
|
1430
1434
|
]),
|
|
1431
1435
|
_: 3
|
|
1432
1436
|
}));
|
|
1433
1437
|
}
|
|
1434
|
-
}),
|
|
1438
|
+
}), qa = /* @__PURE__ */ H(La, [["__scopeId", "data-v-4969409d"]]), Ma = { class: "ff-entity-checks-list" }, xa = /* @__PURE__ */ U({
|
|
1435
1439
|
__name: "EntityChecksAlert",
|
|
1436
1440
|
props: {
|
|
1437
1441
|
entityChecks: {},
|
|
1438
1442
|
visibleFields: {}
|
|
1439
1443
|
},
|
|
1440
1444
|
setup(e) {
|
|
1441
|
-
const { i18n: { t:
|
|
1445
|
+
const { i18n: { t: r } } = ve(), t = w(() => {
|
|
1442
1446
|
if (!Array.isArray(e.entityChecks) || e.entityChecks.length === 0)
|
|
1443
1447
|
return null;
|
|
1444
1448
|
const a = [], c = [
|
|
@@ -1451,9 +1455,9 @@ const ve = /* @__PURE__ */ U({
|
|
|
1451
1455
|
if (p in d) {
|
|
1452
1456
|
const m = d[p];
|
|
1453
1457
|
if (Array.isArray(m) && m.length > 0) {
|
|
1454
|
-
const
|
|
1455
|
-
|
|
1456
|
-
parameters: n(
|
|
1458
|
+
const h = s(m);
|
|
1459
|
+
h.length > 0 && a.push(r(i, {
|
|
1460
|
+
parameters: n(h)
|
|
1457
1461
|
}));
|
|
1458
1462
|
}
|
|
1459
1463
|
break;
|
|
@@ -1461,19 +1465,19 @@ const ve = /* @__PURE__ */ U({
|
|
|
1461
1465
|
return a.length ? a : null;
|
|
1462
1466
|
});
|
|
1463
1467
|
function n(a) {
|
|
1464
|
-
return a.map(
|
|
1468
|
+
return a.map(mt).join(", ");
|
|
1465
1469
|
}
|
|
1466
|
-
function
|
|
1470
|
+
function s(a) {
|
|
1467
1471
|
return Array.isArray(e.visibleFields) ? a.filter((c) => e.visibleFields.includes(c.split(".")[0])) : a;
|
|
1468
1472
|
}
|
|
1469
1473
|
return (a, c) => {
|
|
1470
|
-
const d =
|
|
1471
|
-
return t.value ? (_(),
|
|
1474
|
+
const d = F("KAlert");
|
|
1475
|
+
return t.value ? (_(), I(d, {
|
|
1472
1476
|
key: 0,
|
|
1473
1477
|
"data-testid": "ff-entity-checks-alert"
|
|
1474
1478
|
}, {
|
|
1475
|
-
default:
|
|
1476
|
-
B("ul",
|
|
1479
|
+
default: x(() => [
|
|
1480
|
+
B("ul", Ma, [
|
|
1477
1481
|
(_(!0), K(ee, null, oe(t.value, (p) => (_(), K("li", {
|
|
1478
1482
|
key: p,
|
|
1479
1483
|
"data-testid": "ff-entity-check-item"
|
|
@@ -1484,13 +1488,13 @@ const ve = /* @__PURE__ */ U({
|
|
|
1484
1488
|
})) : N("", !0);
|
|
1485
1489
|
};
|
|
1486
1490
|
}
|
|
1487
|
-
}),
|
|
1491
|
+
}), Ye = /* @__PURE__ */ H(xa, [["__scopeId", "data-v-374c59bc"]]), Ra = ["data-testid"], $a = ["data-testid"], Va = ["data-testid"], Ka = { class: "ff-object-field-header-toggle" }, ja = ["aria-controls", "aria-expanded", "aria-label", "data-testid", "disabled"], Ea = ["innerHTML"], Oa = ["data-testid"], Da = {
|
|
1488
1492
|
key: 0,
|
|
1489
1493
|
class: "indent-guide"
|
|
1490
|
-
},
|
|
1494
|
+
}, Fa = /* @__PURE__ */ U({
|
|
1491
1495
|
inheritAttrs: !1,
|
|
1492
1496
|
__name: "ObjectField",
|
|
1493
|
-
props: /* @__PURE__ */
|
|
1497
|
+
props: /* @__PURE__ */ Ve({
|
|
1494
1498
|
name: {},
|
|
1495
1499
|
label: {},
|
|
1496
1500
|
labelAttributes: {},
|
|
@@ -1513,84 +1517,83 @@ const ve = /* @__PURE__ */ U({
|
|
|
1513
1517
|
}),
|
|
1514
1518
|
emits: ["update:added", "update:expanded"],
|
|
1515
1519
|
setup(e) {
|
|
1516
|
-
const
|
|
1520
|
+
const r = wt(), t = se(e, ["defaultAdded", "collapsible", "omit", "required", "asChild", "resetLabelPath", "fieldsOrder"]), { value: n, hide: s, ...a } = Y(j(t, "name")), {
|
|
1517
1521
|
getSchema: c,
|
|
1518
1522
|
getDefault: d,
|
|
1519
1523
|
useCurrentRenderRules: p
|
|
1520
|
-
} =
|
|
1524
|
+
} = ae(), i = p({
|
|
1521
1525
|
fieldPath: a.path,
|
|
1522
|
-
rules:
|
|
1523
|
-
omittedFields:
|
|
1524
|
-
|
|
1525
|
-
}), m = Ve(e, "added"), g = Ve(e, "expanded"), l = k(() => {
|
|
1526
|
+
rules: j(t, "renderRules"),
|
|
1527
|
+
omittedFields: j(() => e.omit)
|
|
1528
|
+
}), m = $e(e, "added"), h = $e(e, "expanded"), l = w(() => {
|
|
1526
1529
|
if (a.ancestors?.value) {
|
|
1527
|
-
const
|
|
1528
|
-
if (
|
|
1529
|
-
return c(
|
|
1530
|
+
const v = a.ancestors.value.parent;
|
|
1531
|
+
if (v?.path)
|
|
1532
|
+
return c(v.path)?.type === "array";
|
|
1530
1533
|
}
|
|
1531
1534
|
return !1;
|
|
1532
|
-
}), u =
|
|
1535
|
+
}), u = w(() => {
|
|
1533
1536
|
if (a.ancestors?.value) {
|
|
1534
|
-
const
|
|
1535
|
-
if (
|
|
1536
|
-
return c(
|
|
1537
|
+
const v = a.ancestors.value.parent;
|
|
1538
|
+
if (v?.path)
|
|
1539
|
+
return c(v.path)?.type === "map";
|
|
1537
1540
|
}
|
|
1538
1541
|
return !1;
|
|
1539
|
-
}), f =
|
|
1540
|
-
let
|
|
1541
|
-
return e.omit && (
|
|
1542
|
-
}),
|
|
1542
|
+
}), f = ne(a.path, { required: e.required, ...t, resetLabelPath: e.resetLabelPath }), b = w(() => f.value.required ? !0 : m.value ?? e.defaultAdded), C = w(() => e.asChild !== void 0 ? e.asChild : l.value), g = w(() => {
|
|
1543
|
+
let v = a.schema.value.fields;
|
|
1544
|
+
return e.omit && (v = v.filter((k) => !e.omit.includes(Object.keys(k)[0]))), e.fieldsOrder ? st(v, e.fieldsOrder) : (i.value?.bundles && (v = lt([...v], i.value.bundles)), v);
|
|
1545
|
+
}), y = w(() => g.value.map((v) => Object.keys(v)[0]));
|
|
1543
1546
|
function A() {
|
|
1544
|
-
|
|
1547
|
+
h.value = !h.value;
|
|
1545
1548
|
}
|
|
1546
|
-
function
|
|
1549
|
+
function T() {
|
|
1547
1550
|
m.value ? n.value = d(a.path.value) : n.value = null;
|
|
1548
1551
|
}
|
|
1549
|
-
return
|
|
1550
|
-
e.collapsible && (
|
|
1551
|
-
}),
|
|
1552
|
+
return te(b, (v) => {
|
|
1553
|
+
e.collapsible && (h.value = v);
|
|
1554
|
+
}), kt(() => {
|
|
1552
1555
|
if (a.error || !n) return;
|
|
1553
|
-
const
|
|
1554
|
-
m.value =
|
|
1555
|
-
}), (
|
|
1556
|
-
const
|
|
1556
|
+
const v = n.value != null;
|
|
1557
|
+
m.value = v, (f.value.required || v) && (h.value = !0);
|
|
1558
|
+
}), (v, k) => {
|
|
1559
|
+
const P = F("KAlert"), M = F("KInputSwitch");
|
|
1557
1560
|
return _(), K(ee, null, [
|
|
1558
|
-
(_(),
|
|
1559
|
-
a.error ? (_(),
|
|
1561
|
+
(_(), I(ie(v.$slots[o(ke)]))),
|
|
1562
|
+
a.error ? (_(), I(P, {
|
|
1560
1563
|
key: 0,
|
|
1561
1564
|
appearance: "danger",
|
|
1562
1565
|
message: a.error.message
|
|
1563
|
-
}, null, 8, ["message"])) :
|
|
1566
|
+
}, null, 8, ["message"])) : C.value ? G((_(), K("div", z({
|
|
1564
1567
|
key: 1,
|
|
1565
1568
|
class: "ff-object-field ff-object-field-as-child"
|
|
1566
|
-
},
|
|
1569
|
+
}, v.$attrs, {
|
|
1567
1570
|
"data-testid": `ff-object-${a.path.value}`
|
|
1568
1571
|
}), [
|
|
1569
|
-
|
|
1570
|
-
|
|
1572
|
+
D(v.$slots, "default", {}, () => [
|
|
1573
|
+
V(Ye, {
|
|
1571
1574
|
"entity-checks": a.schema.value?.entity_checks,
|
|
1572
|
-
"visible-fields":
|
|
1575
|
+
"visible-fields": y.value
|
|
1573
1576
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1574
|
-
(_(!0), K(ee, null, oe(
|
|
1575
|
-
key: Object.keys(
|
|
1576
|
-
name: Object.keys(
|
|
1577
|
+
(_(!0), K(ee, null, oe(g.value, (L) => (_(), I(ge, {
|
|
1578
|
+
key: Object.keys(L)[0],
|
|
1579
|
+
name: Object.keys(L)[0]
|
|
1577
1580
|
}, null, 8, ["name"]))), 128))
|
|
1578
1581
|
], !0)
|
|
1579
|
-
], 16,
|
|
1580
|
-
[
|
|
1581
|
-
]) :
|
|
1582
|
+
], 16, Ra)), [
|
|
1583
|
+
[J, !o(s)]
|
|
1584
|
+
]) : G((_(), K("div", z({
|
|
1582
1585
|
key: 2,
|
|
1583
|
-
class: ["ff-object-field", { "ff-object-field-collapsed": !
|
|
1586
|
+
class: ["ff-object-field", { "ff-object-field-collapsed": !h.value }],
|
|
1584
1587
|
"data-testid": `ff-object-${a.path.value}`
|
|
1585
|
-
},
|
|
1588
|
+
}, v.$attrs), [
|
|
1586
1589
|
B("header", {
|
|
1587
1590
|
class: "ff-object-field-header",
|
|
1588
1591
|
"data-testid": `ff-object-header-${a.path.value}`
|
|
1589
1592
|
}, [
|
|
1590
|
-
B("div",
|
|
1593
|
+
B("div", Ka, [
|
|
1591
1594
|
B("button", {
|
|
1592
|
-
"aria-controls": o(
|
|
1593
|
-
"aria-expanded":
|
|
1595
|
+
"aria-controls": o(r),
|
|
1596
|
+
"aria-expanded": h.value,
|
|
1594
1597
|
"aria-label": o(f).label,
|
|
1595
1598
|
class: "ff-object-field-toggle-btn",
|
|
1596
1599
|
"data-testid": `ff-object-toggle-btn-${a.path.value}`,
|
|
@@ -1598,14 +1601,14 @@ const ve = /* @__PURE__ */ U({
|
|
|
1598
1601
|
type: "button",
|
|
1599
1602
|
onClick: Ce(A, ["prevent", "stop"])
|
|
1600
1603
|
}, [
|
|
1601
|
-
|
|
1602
|
-
class: Te(["ff-object-field-toggle-btn-trigger-icon", { "collapse-expanded":
|
|
1604
|
+
V(o(Ot), {
|
|
1605
|
+
class: Te(["ff-object-field-toggle-btn-trigger-icon", { "collapse-expanded": h.value }]),
|
|
1603
1606
|
"data-testid": `ff-object-toggle-trigger-icon-${a.path.value}`,
|
|
1604
1607
|
decorative: "",
|
|
1605
1608
|
size: `var(--kui-icon-size-30, ${o(Dt)})`
|
|
1606
1609
|
}, null, 8, ["class", "data-testid", "size"])
|
|
1607
|
-
], 8,
|
|
1608
|
-
u.value ? N("", !0) : (_(),
|
|
1610
|
+
], 8, ja),
|
|
1611
|
+
u.value ? N("", !0) : (_(), I(o($t), z({
|
|
1609
1612
|
key: 0,
|
|
1610
1613
|
class: "ff-object-field-label",
|
|
1611
1614
|
"data-testid": `ff-label-${a.path.value}`
|
|
@@ -1614,67 +1617,67 @@ const ve = /* @__PURE__ */ U({
|
|
|
1614
1617
|
required: !1
|
|
1615
1618
|
}, {
|
|
1616
1619
|
"tooltip-attributes": o(f).labelAttributes.tooltipAttributes
|
|
1617
|
-
}),
|
|
1618
|
-
default:
|
|
1620
|
+
}), W({
|
|
1621
|
+
default: x(() => [
|
|
1619
1622
|
pe(ce(o(f).label) + " ", 1)
|
|
1620
1623
|
]),
|
|
1621
1624
|
_: 2
|
|
1622
1625
|
}, [
|
|
1623
1626
|
o(f).labelAttributes?.info ? {
|
|
1624
1627
|
name: "tooltip",
|
|
1625
|
-
fn:
|
|
1626
|
-
|
|
1628
|
+
fn: x(() => [
|
|
1629
|
+
D(v.$slots, "tooltip", {}, () => [
|
|
1627
1630
|
B("div", {
|
|
1628
1631
|
innerHTML: o(f).labelAttributes.info
|
|
1629
|
-
}, null, 8,
|
|
1632
|
+
}, null, 8, Ea)
|
|
1630
1633
|
], !0)
|
|
1631
1634
|
]),
|
|
1632
1635
|
key: "0"
|
|
1633
1636
|
} : void 0
|
|
1634
1637
|
]), 1040, ["data-testid", "tooltip-attributes"]))
|
|
1635
1638
|
]),
|
|
1636
|
-
o(f).required ? N("", !0) : (_(),
|
|
1639
|
+
o(f).required ? N("", !0) : (_(), I(M, {
|
|
1637
1640
|
key: 0,
|
|
1638
1641
|
modelValue: m.value,
|
|
1639
1642
|
"onUpdate:modelValue": [
|
|
1640
|
-
|
|
1641
|
-
|
|
1643
|
+
k[0] || (k[0] = (L) => m.value = L),
|
|
1644
|
+
T
|
|
1642
1645
|
],
|
|
1643
1646
|
"data-testid": `ff-object-switch-${a.path.value}`
|
|
1644
1647
|
}, null, 8, ["modelValue", "data-testid"]))
|
|
1645
|
-
], 8,
|
|
1646
|
-
|
|
1647
|
-
default:
|
|
1648
|
-
|
|
1648
|
+
], 8, Va),
|
|
1649
|
+
V(qa, null, {
|
|
1650
|
+
default: x(() => [
|
|
1651
|
+
h.value ? (_(), K("div", {
|
|
1649
1652
|
key: 0,
|
|
1650
1653
|
class: "ff-object-field-content",
|
|
1651
1654
|
"data-testid": `ff-object-content-${a.path.value}`
|
|
1652
1655
|
}, [
|
|
1653
|
-
|
|
1654
|
-
|
|
1656
|
+
D(v.$slots, "default", {}, () => [
|
|
1657
|
+
V(Ye, {
|
|
1655
1658
|
"entity-checks": a.schema.value?.entity_checks,
|
|
1656
|
-
"visible-fields":
|
|
1659
|
+
"visible-fields": y.value
|
|
1657
1660
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1658
|
-
(_(!0), K(ee, null, oe(
|
|
1659
|
-
key: Object.keys(
|
|
1660
|
-
name: Object.keys(
|
|
1661
|
+
(_(!0), K(ee, null, oe(g.value, (L) => (_(), I(ge, {
|
|
1662
|
+
key: Object.keys(L)[0],
|
|
1663
|
+
name: Object.keys(L)[0]
|
|
1661
1664
|
}, null, 8, ["name"]))), 128))
|
|
1662
1665
|
], !0)
|
|
1663
|
-
], 8,
|
|
1666
|
+
], 8, Oa)) : N("", !0)
|
|
1664
1667
|
]),
|
|
1665
1668
|
_: 3
|
|
1666
1669
|
}),
|
|
1667
|
-
|
|
1668
|
-
], 16,
|
|
1669
|
-
[
|
|
1670
|
+
h.value ? (_(), K("div", Da)) : N("", !0)
|
|
1671
|
+
], 16, $a)), [
|
|
1672
|
+
[J, !o(s)]
|
|
1670
1673
|
])
|
|
1671
1674
|
], 64);
|
|
1672
1675
|
};
|
|
1673
1676
|
}
|
|
1674
|
-
}),
|
|
1677
|
+
}), Ba = /* @__PURE__ */ H(Fa, [["__scopeId", "data-v-66b4c328"]]), Ua = {
|
|
1675
1678
|
key: 1,
|
|
1676
1679
|
class: "ff-number-field-wrapper"
|
|
1677
|
-
},
|
|
1680
|
+
}, Na = ["innerHTML"], za = /* @__PURE__ */ U({
|
|
1678
1681
|
__name: "NumberField",
|
|
1679
1682
|
props: {
|
|
1680
1683
|
showVaultSecretPicker: { type: Boolean, default: () => {
|
|
@@ -1695,85 +1698,85 @@ const ve = /* @__PURE__ */ U({
|
|
|
1695
1698
|
name: {}
|
|
1696
1699
|
},
|
|
1697
1700
|
emits: ["update:modelValue"],
|
|
1698
|
-
setup(e, { emit:
|
|
1699
|
-
const t = se(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: n, hide:
|
|
1700
|
-
const
|
|
1701
|
-
if (typeof
|
|
1702
|
-
return { min:
|
|
1703
|
-
const [A,
|
|
1701
|
+
setup(e, { emit: r }) {
|
|
1702
|
+
const t = se(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: n, hide: s, ...a } = Y(j(() => e.name)), c = ne(a.path, t), { i18n: d } = ve(), p = w(() => {
|
|
1703
|
+
const y = a.schema?.value;
|
|
1704
|
+
if (typeof y.gt == "number")
|
|
1705
|
+
return { min: y.type === "integer" ? y.gt + 1 : y.gt };
|
|
1706
|
+
const [A, T] = y.between ?? [];
|
|
1704
1707
|
return {
|
|
1705
1708
|
min: t.min ?? A,
|
|
1706
|
-
max: t.max ??
|
|
1709
|
+
max: t.max ?? T
|
|
1707
1710
|
};
|
|
1708
|
-
}), i =
|
|
1709
|
-
const
|
|
1710
|
-
if (
|
|
1711
|
-
if (
|
|
1712
|
-
const A = typeof
|
|
1711
|
+
}), i = r, m = n.value, h = w(() => {
|
|
1712
|
+
const y = n?.value;
|
|
1713
|
+
if (y == null || y === "") return "";
|
|
1714
|
+
if (C.value) return `${y}`;
|
|
1715
|
+
const A = typeof y == "number" ? y : Number(y);
|
|
1713
1716
|
return Number.isFinite(A) ? `${A}` : "";
|
|
1714
1717
|
});
|
|
1715
|
-
function l(
|
|
1716
|
-
const A = u(
|
|
1717
|
-
m !== void 0 &&
|
|
1718
|
+
function l(y) {
|
|
1719
|
+
const A = u(y);
|
|
1720
|
+
m !== void 0 && y === "" && A !== m ? (n.value = null, i("update:modelValue", null)) : (n.value = A, i("update:modelValue", A));
|
|
1718
1721
|
}
|
|
1719
|
-
function u(
|
|
1720
|
-
if (
|
|
1721
|
-
const A =
|
|
1722
|
+
function u(y) {
|
|
1723
|
+
if (y === "") return null;
|
|
1724
|
+
const A = y.trim();
|
|
1722
1725
|
if (A === "") return null;
|
|
1723
|
-
const
|
|
1724
|
-
return Number.isFinite(
|
|
1726
|
+
const T = Number(A);
|
|
1727
|
+
return Number.isFinite(T) ? T : C.value ? y : null;
|
|
1725
1728
|
}
|
|
1726
|
-
const f = we(
|
|
1727
|
-
return (
|
|
1728
|
-
const
|
|
1729
|
-
return a.error ? (_(), T
|
|
1729
|
+
const f = we(at, void 0), b = w(() => ({ referenceable: C.value })), C = w(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!a.schema.value?.referenceable), g = w(() => C.value ? "text" : "number");
|
|
1730
|
+
return (y, A) => {
|
|
1731
|
+
const T = F("KAlert");
|
|
1732
|
+
return a.error ? (_(), I(T, {
|
|
1730
1733
|
key: 0,
|
|
1731
1734
|
appearance: "danger",
|
|
1732
1735
|
message: a.error.message
|
|
1733
|
-
}, null, 8, ["message"])) :
|
|
1734
|
-
|
|
1736
|
+
}, null, 8, ["message"])) : G((_(), K("div", Ua, [
|
|
1737
|
+
V(be, z({ class: "ff-number-field" }, {
|
|
1735
1738
|
...o(c),
|
|
1736
1739
|
min: p.value.min,
|
|
1737
1740
|
max: p.value.max
|
|
1738
1741
|
}, {
|
|
1739
1742
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1740
1743
|
"data-testid": `ff-${a.path.value}`,
|
|
1741
|
-
"model-value":
|
|
1742
|
-
type:
|
|
1744
|
+
"model-value": h.value,
|
|
1745
|
+
type: g.value,
|
|
1743
1746
|
"onUpdate:modelValue": l
|
|
1744
|
-
}),
|
|
1747
|
+
}), W({ _: 2 }, [
|
|
1745
1748
|
o(c).labelAttributes?.info ? {
|
|
1746
1749
|
name: "label-tooltip",
|
|
1747
|
-
fn:
|
|
1748
|
-
|
|
1750
|
+
fn: x(() => [
|
|
1751
|
+
D(y.$slots, "tooltip", {}, () => [
|
|
1749
1752
|
B("div", {
|
|
1750
1753
|
innerHTML: o(c).labelAttributes.info
|
|
1751
|
-
}, null, 8,
|
|
1754
|
+
}, null, 8, Na)
|
|
1752
1755
|
], !0)
|
|
1753
1756
|
]),
|
|
1754
1757
|
key: "0"
|
|
1755
1758
|
} : void 0
|
|
1756
1759
|
]), 1040, ["data-autofocus", "data-testid", "model-value", "type"]),
|
|
1757
|
-
o(f) &&
|
|
1760
|
+
o(f) && C.value ? (_(), I(ie(o(f)), {
|
|
1758
1761
|
key: 0,
|
|
1759
|
-
schema:
|
|
1762
|
+
schema: b.value,
|
|
1760
1763
|
update: l,
|
|
1761
1764
|
value: o(n) ?? ""
|
|
1762
1765
|
}, null, 8, ["schema", "value"])) : N("", !0),
|
|
1763
|
-
|
|
1766
|
+
C.value && !o(f) ? (_(), I(T, {
|
|
1764
1767
|
key: 1,
|
|
1765
1768
|
appearance: "warning",
|
|
1766
1769
|
"data-testid": `ff-vault-secret-picker-warning-${a.path.value}`,
|
|
1767
1770
|
message: o(d).t("plugins.free-form.vault_picker.component_error")
|
|
1768
1771
|
}, null, 8, ["data-testid", "message"])) : N("", !0)
|
|
1769
1772
|
], 512)), [
|
|
1770
|
-
[
|
|
1773
|
+
[J, !o(s)]
|
|
1771
1774
|
]);
|
|
1772
1775
|
};
|
|
1773
1776
|
}
|
|
1774
|
-
}),
|
|
1777
|
+
}), Ha = /* @__PURE__ */ H(za, [["__scopeId", "data-v-f303431f"]]), Wa = ["innerHTML"], Ga = /* @__PURE__ */ U({
|
|
1775
1778
|
__name: "EnumField",
|
|
1776
|
-
props: /* @__PURE__ */
|
|
1779
|
+
props: /* @__PURE__ */ Ve({
|
|
1777
1780
|
labelAttributes: {},
|
|
1778
1781
|
items: {},
|
|
1779
1782
|
placeholder: {},
|
|
@@ -1807,64 +1810,64 @@ const ve = /* @__PURE__ */ U({
|
|
|
1807
1810
|
},
|
|
1808
1811
|
modelModifiers: {}
|
|
1809
1812
|
}),
|
|
1810
|
-
emits: /* @__PURE__ */
|
|
1811
|
-
setup(e, { emit:
|
|
1812
|
-
const t =
|
|
1813
|
-
|
|
1814
|
-
), p =
|
|
1813
|
+
emits: /* @__PURE__ */ Ve(["update"], ["update:modelValue"]),
|
|
1814
|
+
setup(e, { emit: r }) {
|
|
1815
|
+
const t = r, n = se(e, ["name", "items", "multiple", "autofocus"]), { getSelectItems: s } = ae(), { value: a, hide: c, ...d } = Y(
|
|
1816
|
+
j(() => e.name)
|
|
1817
|
+
), p = ne(d.path, n);
|
|
1815
1818
|
function i(f) {
|
|
1816
1819
|
return l.value && Array.isArray(f) && f.length === 0 && !p.value.required ? null : f;
|
|
1817
1820
|
}
|
|
1818
|
-
const m =
|
|
1821
|
+
const m = $e(e, "modelValue", {
|
|
1819
1822
|
// If multiple and value is null/undefined, return empty array for v-model
|
|
1820
1823
|
get: () => l.value && a?.value == null ? [] : a.value,
|
|
1821
1824
|
set: (f) => {
|
|
1822
1825
|
a.value = i(f);
|
|
1823
1826
|
}
|
|
1824
|
-
}),
|
|
1825
|
-
return (f,
|
|
1826
|
-
const
|
|
1827
|
-
return d.error ? (_(),
|
|
1827
|
+
}), h = w(() => e.items ? e.items : d.path ? s(d.path.value) : []), l = w(() => e.multiple !== void 0 ? e.multiple : d.schema.value?.type === "set"), u = w(() => l.value ? Vt : Kt);
|
|
1828
|
+
return (f, b) => {
|
|
1829
|
+
const C = F("KAlert");
|
|
1830
|
+
return d.error ? (_(), I(C, {
|
|
1828
1831
|
key: 0,
|
|
1829
1832
|
appearance: "danger",
|
|
1830
1833
|
message: d.error.message
|
|
1831
|
-
}, null, 8, ["message"])) :
|
|
1834
|
+
}, null, 8, ["message"])) : G((_(), I(o(u), z({ key: 1 }, { ...n, ...o(p) }, {
|
|
1832
1835
|
modelValue: m.value,
|
|
1833
1836
|
"onUpdate:modelValue": [
|
|
1834
|
-
|
|
1835
|
-
|
|
1837
|
+
b[0] || (b[0] = (g) => m.value = g),
|
|
1838
|
+
b[1] || (b[1] = (g) => t("update", i(g)))
|
|
1836
1839
|
],
|
|
1837
1840
|
class: "ff-enum-field",
|
|
1838
1841
|
clearable: !o(p).required,
|
|
1839
1842
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1840
1843
|
"data-testid": `ff-${d.path.value}`,
|
|
1841
|
-
items:
|
|
1844
|
+
items: h.value,
|
|
1842
1845
|
"kpop-attributes": { "data-testid": `ff-enum-${d.path.value}-items` }
|
|
1843
|
-
}),
|
|
1846
|
+
}), W({ _: 2 }, [
|
|
1844
1847
|
"tooltip" in f.$slots || o(p).labelAttributes?.info ? {
|
|
1845
1848
|
name: "label-tooltip",
|
|
1846
|
-
fn:
|
|
1847
|
-
|
|
1849
|
+
fn: x(() => [
|
|
1850
|
+
D(f.$slots, "tooltip", {}, () => [
|
|
1848
1851
|
B("div", {
|
|
1849
1852
|
innerHTML: o(p).labelAttributes.info
|
|
1850
|
-
}, null, 8,
|
|
1853
|
+
}, null, 8, Wa)
|
|
1851
1854
|
], !0)
|
|
1852
1855
|
]),
|
|
1853
1856
|
key: "0"
|
|
1854
1857
|
} : void 0,
|
|
1855
1858
|
f.$slots["item-label"] ? {
|
|
1856
1859
|
name: "item-template",
|
|
1857
|
-
fn:
|
|
1858
|
-
|
|
1860
|
+
fn: x(({ item: g }) => [
|
|
1861
|
+
D(f.$slots, "item-label", Fe(Ze(g)), void 0, !0)
|
|
1859
1862
|
]),
|
|
1860
1863
|
key: "1"
|
|
1861
1864
|
} : void 0
|
|
1862
1865
|
]), 1040, ["modelValue", "clearable", "data-autofocus", "data-testid", "items", "kpop-attributes"])), [
|
|
1863
|
-
[
|
|
1866
|
+
[J, !o(c)]
|
|
1864
1867
|
]);
|
|
1865
1868
|
};
|
|
1866
1869
|
}
|
|
1867
|
-
}), Se = /* @__PURE__ */
|
|
1870
|
+
}), Se = /* @__PURE__ */ H(Ga, [["__scopeId", "data-v-b283cc11"]]), Ja = ["data-testid"], Ya = ["innerHTML"], Xa = /* @__PURE__ */ U({
|
|
1868
1871
|
inheritAttrs: !1,
|
|
1869
1872
|
__name: "JsonField",
|
|
1870
1873
|
props: {
|
|
@@ -1873,8 +1876,8 @@ const ve = /* @__PURE__ */ U({
|
|
|
1873
1876
|
name: {}
|
|
1874
1877
|
},
|
|
1875
1878
|
emits: ["update:modelValue"],
|
|
1876
|
-
setup(e, { emit:
|
|
1877
|
-
const t =
|
|
1879
|
+
setup(e, { emit: r }) {
|
|
1880
|
+
const t = ye(), n = se(e, ["autofocus", "name"]), s = r, { value: a, hide: c, ...d } = Y(j(() => e.name)), p = ne(d.path, j({ ...n, ...t })), i = re("");
|
|
1878
1881
|
function m(l) {
|
|
1879
1882
|
i.value = l;
|
|
1880
1883
|
let u = l || null;
|
|
@@ -1883,10 +1886,10 @@ const ve = /* @__PURE__ */ U({
|
|
|
1883
1886
|
f && typeof f == "object" && (u = f);
|
|
1884
1887
|
} catch {
|
|
1885
1888
|
}
|
|
1886
|
-
a.value = u,
|
|
1889
|
+
a.value = u, s("update:modelValue", u);
|
|
1887
1890
|
}
|
|
1888
|
-
const
|
|
1889
|
-
return
|
|
1891
|
+
const h = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1892
|
+
return te(a, (l) => {
|
|
1890
1893
|
if (l && typeof l == "object") {
|
|
1891
1894
|
try {
|
|
1892
1895
|
const u = JSON.parse(i.value);
|
|
@@ -1898,42 +1901,42 @@ const ve = /* @__PURE__ */ U({
|
|
|
1898
1901
|
}
|
|
1899
1902
|
i.value = l || "";
|
|
1900
1903
|
}, { immediate: !0 }), (l, u) => {
|
|
1901
|
-
const f =
|
|
1902
|
-
return d.error ? (_(),
|
|
1904
|
+
const f = F("KAlert");
|
|
1905
|
+
return d.error ? (_(), I(f, {
|
|
1903
1906
|
key: 0,
|
|
1904
1907
|
appearance: "danger",
|
|
1905
1908
|
message: d.error.message
|
|
1906
|
-
}, null, 8, ["message"])) :
|
|
1909
|
+
}, null, 8, ["message"])) : G((_(), K("div", {
|
|
1907
1910
|
key: 1,
|
|
1908
1911
|
"data-testid": `ff-json-${d.path.value}`
|
|
1909
1912
|
}, [
|
|
1910
|
-
|
|
1913
|
+
V(be, z(o(p), {
|
|
1911
1914
|
class: "ff-json-field",
|
|
1912
|
-
"data-1p-ignore":
|
|
1915
|
+
"data-1p-ignore": h.value,
|
|
1913
1916
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1914
1917
|
"data-testid": `ff-${d.path.value}`,
|
|
1915
1918
|
"model-value": i.value ?? "",
|
|
1916
1919
|
multiline: "",
|
|
1917
1920
|
"onUpdate:modelValue": m
|
|
1918
|
-
}),
|
|
1921
|
+
}), W({ _: 2 }, [
|
|
1919
1922
|
o(p).labelAttributes?.info ? {
|
|
1920
1923
|
name: "label-tooltip",
|
|
1921
|
-
fn:
|
|
1922
|
-
|
|
1924
|
+
fn: x(() => [
|
|
1925
|
+
D(l.$slots, "tooltip", {}, () => [
|
|
1923
1926
|
B("div", {
|
|
1924
1927
|
innerHTML: o(p).labelAttributes.info
|
|
1925
|
-
}, null, 8,
|
|
1928
|
+
}, null, 8, Ya)
|
|
1926
1929
|
], !0)
|
|
1927
1930
|
]),
|
|
1928
1931
|
key: "0"
|
|
1929
1932
|
} : void 0
|
|
1930
1933
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1931
|
-
], 8,
|
|
1932
|
-
[
|
|
1934
|
+
], 8, Ja)), [
|
|
1935
|
+
[J, !o(c)]
|
|
1933
1936
|
]);
|
|
1934
1937
|
};
|
|
1935
1938
|
}
|
|
1936
|
-
}),
|
|
1939
|
+
}), Qa = /* @__PURE__ */ H(Xa, [["__scopeId", "data-v-6f302da9"]]), Za = ["innerHTML"], en = /* @__PURE__ */ U({
|
|
1937
1940
|
inheritAttrs: !1,
|
|
1938
1941
|
__name: "ForeignField",
|
|
1939
1942
|
props: {
|
|
@@ -1951,16 +1954,16 @@ const ve = /* @__PURE__ */ U({
|
|
|
1951
1954
|
name: {}
|
|
1952
1955
|
},
|
|
1953
1956
|
emits: ["update:modelValue"],
|
|
1954
|
-
setup(e, { emit:
|
|
1955
|
-
const t =
|
|
1957
|
+
setup(e, { emit: r }) {
|
|
1958
|
+
const t = ye(), { i18n: { t: n } } = ve(), s = se(e, ["autofocus", "name"]), a = r, { value: c, hide: d, ...p } = Y(j(() => e.name));
|
|
1956
1959
|
if (p.error)
|
|
1957
1960
|
throw new Error(p.error.message);
|
|
1958
|
-
const i =
|
|
1959
|
-
function u(
|
|
1960
|
-
m !== void 0 &&
|
|
1961
|
+
const i = ne(p.path, j({ ...s, ...t })), m = c.value ? c.value.id : null, h = w(() => i.value.placeholder ? i.value.placeholder : n("plugins.free-form.foreign_placeholder", { entity: p.schema.value?.reference ?? "entity" })), l = re(m ?? "");
|
|
1962
|
+
function u(b) {
|
|
1963
|
+
m !== void 0 && b === "" && b !== m ? (c.value = null, a("update:modelValue", null)) : (c.value = { id: b.trim() }, a("update:modelValue", c.value));
|
|
1961
1964
|
}
|
|
1962
|
-
const f =
|
|
1963
|
-
return (
|
|
1965
|
+
const f = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1966
|
+
return (b, C) => G((_(), I(be, z(o(i), {
|
|
1964
1967
|
class: "ff-foreign-field",
|
|
1965
1968
|
"data-1p-ignore": f.value,
|
|
1966
1969
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
@@ -1969,25 +1972,25 @@ const ve = /* @__PURE__ */ U({
|
|
|
1969
1972
|
"error-message": e.errorMessage,
|
|
1970
1973
|
help: e.help,
|
|
1971
1974
|
"model-value": l.value,
|
|
1972
|
-
placeholder:
|
|
1975
|
+
placeholder: h.value,
|
|
1973
1976
|
"onUpdate:modelValue": u
|
|
1974
|
-
}),
|
|
1977
|
+
}), W({ _: 2 }, [
|
|
1975
1978
|
o(i).labelAttributes?.info ? {
|
|
1976
1979
|
name: "label-tooltip",
|
|
1977
|
-
fn:
|
|
1978
|
-
|
|
1980
|
+
fn: x(() => [
|
|
1981
|
+
D(b.$slots, "tooltip", {}, () => [
|
|
1979
1982
|
B("div", {
|
|
1980
1983
|
innerHTML: o(i).labelAttributes.info
|
|
1981
|
-
}, null, 8,
|
|
1984
|
+
}, null, 8, Za)
|
|
1982
1985
|
], !0)
|
|
1983
1986
|
]),
|
|
1984
1987
|
key: "0"
|
|
1985
1988
|
} : void 0
|
|
1986
1989
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "error", "error-message", "help", "model-value", "placeholder"])), [
|
|
1987
|
-
[
|
|
1990
|
+
[J, !o(d)]
|
|
1988
1991
|
]);
|
|
1989
1992
|
}
|
|
1990
|
-
}),
|
|
1993
|
+
}), tn = /* @__PURE__ */ H(en, [["__scopeId", "data-v-8c298e9f"]]), an = ["data-testid"], nn = ["data-testid"], on = ["innerHTML"], rn = { class: "ff-map-field-fields" }, sn = /* @__PURE__ */ U({
|
|
1991
1994
|
__name: "MapField",
|
|
1992
1995
|
props: {
|
|
1993
1996
|
keyPlaceholder: {},
|
|
@@ -1998,115 +2001,115 @@ const ve = /* @__PURE__ */ U({
|
|
|
1998
2001
|
labelAttributes: {}
|
|
1999
2002
|
},
|
|
2000
2003
|
emits: ["legacyValueChange"],
|
|
2001
|
-
setup(e, { emit:
|
|
2002
|
-
const { i18n: t } =
|
|
2004
|
+
setup(e, { emit: r }) {
|
|
2005
|
+
const { i18n: t } = ve(), n = e, s = r, {
|
|
2003
2006
|
keys: a,
|
|
2004
2007
|
updateKey: c,
|
|
2005
2008
|
addKey: d,
|
|
2006
2009
|
removeKey: p,
|
|
2007
2010
|
field: i,
|
|
2008
2011
|
fieldDisplayName: m
|
|
2009
|
-
} =
|
|
2010
|
-
function
|
|
2011
|
-
n.appearance?.string?.multiline || (
|
|
2012
|
+
} = ua(j(n, "name"), v), h = ne(i.path, n), l = ["string", "number", "boolean", "integer", "foreign"], u = w(() => n.oneLine ? !0 : i.schema?.value?.type === "map" && l.includes(i.schema.value.values.type) && !n.appearance?.string?.multiline), f = w(() => i.schema?.value?.type === "map" ? i.schema.value.values : void 0), b = w(() => f.value?.type === "string" && !f.value?.one_of), C = w(() => u.value ? "div" : Ke), g = et("root");
|
|
2013
|
+
function y(k, P) {
|
|
2014
|
+
n.appearance?.string?.multiline || (k.preventDefault(), P === a.value.length - 1 && d(), A(P + 1));
|
|
2012
2015
|
}
|
|
2013
|
-
async function A(
|
|
2014
|
-
|
|
2016
|
+
async function A(k) {
|
|
2017
|
+
g.value && (await Re(), g.value.querySelector(`[data-key-input="${k}"]`)?.focus());
|
|
2015
2018
|
}
|
|
2016
|
-
function
|
|
2019
|
+
function T() {
|
|
2017
2020
|
d();
|
|
2018
|
-
const
|
|
2019
|
-
A(
|
|
2021
|
+
const k = a.value.findIndex(([P, M]) => !M);
|
|
2022
|
+
A(k === -1 ? a.value.length - 1 : k);
|
|
2020
2023
|
}
|
|
2021
|
-
function
|
|
2022
|
-
|
|
2024
|
+
function v(k) {
|
|
2025
|
+
s("legacyValueChange", k);
|
|
2023
2026
|
}
|
|
2024
|
-
return (
|
|
2025
|
-
const
|
|
2026
|
-
return o(i).error ? (_(),
|
|
2027
|
+
return (k, P) => {
|
|
2028
|
+
const M = F("KAlert"), L = F("KLabel"), S = F("KButton"), R = F("KTooltip");
|
|
2029
|
+
return o(i).error ? (_(), I(M, {
|
|
2027
2030
|
key: 0,
|
|
2028
2031
|
appearance: "danger",
|
|
2029
2032
|
message: o(i).error.message
|
|
2030
|
-
}, null, 8, ["message"])) :
|
|
2033
|
+
}, null, 8, ["message"])) : G((_(), K("div", {
|
|
2031
2034
|
key: 1,
|
|
2032
2035
|
ref_key: "root",
|
|
2033
|
-
ref:
|
|
2036
|
+
ref: g,
|
|
2034
2037
|
class: "ff-map-field",
|
|
2035
2038
|
"data-testid": `ff-map-${o(i).path.value}`
|
|
2036
2039
|
}, [
|
|
2037
|
-
o(
|
|
2040
|
+
o(h).label ? (_(), K("header", {
|
|
2038
2041
|
key: 0,
|
|
2039
2042
|
class: "ff-map-field-header",
|
|
2040
2043
|
"data-testid": `ff-map-header-${o(i).path.value}`
|
|
2041
2044
|
}, [
|
|
2042
|
-
|
|
2045
|
+
V(L, z({ class: "ff-map-field-label" }, o(h).labelAttributes, {
|
|
2043
2046
|
"data-testid": `ff-label-${o(i).path.value}`,
|
|
2044
|
-
required: o(
|
|
2045
|
-
"tooltip-attributes": o(
|
|
2046
|
-
}),
|
|
2047
|
-
default:
|
|
2048
|
-
pe(ce(o(
|
|
2047
|
+
required: o(h).required,
|
|
2048
|
+
"tooltip-attributes": o(h).labelAttributes.tooltipAttributes
|
|
2049
|
+
}), W({
|
|
2050
|
+
default: x(() => [
|
|
2051
|
+
pe(ce(o(h).label) + " ", 1)
|
|
2049
2052
|
]),
|
|
2050
2053
|
_: 2
|
|
2051
2054
|
}, [
|
|
2052
|
-
o(
|
|
2055
|
+
o(h).labelAttributes?.info ? {
|
|
2053
2056
|
name: "tooltip",
|
|
2054
|
-
fn:
|
|
2055
|
-
|
|
2057
|
+
fn: x(() => [
|
|
2058
|
+
D(k.$slots, "tooltip", {}, () => [
|
|
2056
2059
|
B("div", {
|
|
2057
|
-
innerHTML: o(
|
|
2058
|
-
}, null, 8,
|
|
2060
|
+
innerHTML: o(h).labelAttributes.info
|
|
2061
|
+
}, null, 8, on)
|
|
2059
2062
|
], !0)
|
|
2060
2063
|
]),
|
|
2061
2064
|
key: "0"
|
|
2062
2065
|
} : void 0
|
|
2063
2066
|
]), 1040, ["data-testid", "required", "tooltip-attributes"])
|
|
2064
|
-
], 8,
|
|
2065
|
-
(_(!0), K(ee, null, oe(o(a), ([
|
|
2066
|
-
key:
|
|
2067
|
+
], 8, nn)) : N("", !0),
|
|
2068
|
+
(_(!0), K(ee, null, oe(o(a), ([q, X], Q) => (_(), I(ie(C.value), {
|
|
2069
|
+
key: q,
|
|
2067
2070
|
class: Te(["ff-map-field-item", {
|
|
2068
2071
|
"ff-map-field-item-simple": u.value,
|
|
2069
2072
|
"ff-map-field-item-complex": !u.value
|
|
2070
2073
|
}]),
|
|
2071
|
-
"data-testid": `ff-map-container-${o(i).path.value}.${
|
|
2074
|
+
"data-testid": `ff-map-container-${o(i).path.value}.${Q}`
|
|
2072
2075
|
}, {
|
|
2073
|
-
default:
|
|
2074
|
-
B("div",
|
|
2075
|
-
|
|
2076
|
+
default: x(() => [
|
|
2077
|
+
B("div", rn, [
|
|
2078
|
+
V(be, {
|
|
2076
2079
|
class: "ff-map-field-fields-key",
|
|
2077
|
-
"data-key-input":
|
|
2078
|
-
"data-testid": `ff-map-key-${o(i).path.value}.${
|
|
2079
|
-
"model-value":
|
|
2080
|
+
"data-key-input": Q,
|
|
2081
|
+
"data-testid": `ff-map-key-${o(i).path.value}.${Q}`,
|
|
2082
|
+
"model-value": X,
|
|
2080
2083
|
placeholder: e.keyPlaceholder || "Key",
|
|
2081
|
-
onKeydown:
|
|
2082
|
-
"onUpdate:modelValue": (
|
|
2084
|
+
onKeydown: Ne(Ce((de) => A(Q), ["prevent"]), ["enter"]),
|
|
2085
|
+
"onUpdate:modelValue": (de) => o(c)(q, de)
|
|
2083
2086
|
}, null, 8, ["data-key-input", "data-testid", "model-value", "placeholder", "onKeydown", "onUpdate:modelValue"]),
|
|
2084
|
-
|
|
2085
|
-
|
|
2087
|
+
D(k.$slots, "default", { keyId: q }, () => [
|
|
2088
|
+
b.value ? (_(), I(ft, {
|
|
2086
2089
|
key: 0,
|
|
2087
2090
|
"inline-vault-picker": "",
|
|
2088
2091
|
multiline: e.appearance?.string?.multiline,
|
|
2089
|
-
name:
|
|
2090
|
-
onKeydown:
|
|
2091
|
-
}, null, 8, ["multiline", "name", "onKeydown"])) : (_(),
|
|
2092
|
+
name: q,
|
|
2093
|
+
onKeydown: Ne((de) => y(de, Q), ["enter"])
|
|
2094
|
+
}, null, 8, ["multiline", "name", "onKeydown"])) : (_(), I(ge, {
|
|
2092
2095
|
key: 1,
|
|
2093
|
-
name:
|
|
2096
|
+
name: q
|
|
2094
2097
|
}, null, 8, ["name"]))
|
|
2095
2098
|
], !0)
|
|
2096
2099
|
]),
|
|
2097
|
-
|
|
2100
|
+
V(R, {
|
|
2098
2101
|
text: o(t).t("actions.remove_entity", { entity: o(m) })
|
|
2099
2102
|
}, {
|
|
2100
|
-
default:
|
|
2101
|
-
|
|
2103
|
+
default: x(() => [
|
|
2104
|
+
V(S, {
|
|
2102
2105
|
appearance: "tertiary",
|
|
2103
2106
|
"aria-label": o(t).t("actions.remove_entity", { entity: o(m) }),
|
|
2104
|
-
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${
|
|
2107
|
+
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${Q}`,
|
|
2105
2108
|
icon: "",
|
|
2106
|
-
onClick: (
|
|
2109
|
+
onClick: (de) => o(p)(q)
|
|
2107
2110
|
}, {
|
|
2108
|
-
default:
|
|
2109
|
-
|
|
2111
|
+
default: x(() => [
|
|
2112
|
+
V(o(ot))
|
|
2110
2113
|
]),
|
|
2111
2114
|
_: 1
|
|
2112
2115
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -2116,25 +2119,25 @@ const ve = /* @__PURE__ */ U({
|
|
|
2116
2119
|
]),
|
|
2117
2120
|
_: 2
|
|
2118
2121
|
}, 1032, ["class", "data-testid"]))), 128)),
|
|
2119
|
-
|
|
2122
|
+
V(S, {
|
|
2120
2123
|
appearance: "tertiary",
|
|
2121
2124
|
"aria-label": o(t).t("actions.add_entity", { entity: o(m) }),
|
|
2122
2125
|
class: "ff-map-field-add-entry-btn",
|
|
2123
2126
|
"data-testid": `ff-map-add-btn-${o(i).path.value}`,
|
|
2124
|
-
onClick:
|
|
2127
|
+
onClick: T
|
|
2125
2128
|
}, {
|
|
2126
|
-
default:
|
|
2127
|
-
|
|
2129
|
+
default: x(() => [
|
|
2130
|
+
V(o(je)),
|
|
2128
2131
|
pe(" " + ce(o(t).t("actions.add_entity", { entity: o(m) })), 1)
|
|
2129
2132
|
]),
|
|
2130
2133
|
_: 1
|
|
2131
2134
|
}, 8, ["aria-label", "data-testid"])
|
|
2132
|
-
], 8,
|
|
2133
|
-
[
|
|
2135
|
+
], 8, an)), [
|
|
2136
|
+
[J, !o(i).hide.value]
|
|
2134
2137
|
]);
|
|
2135
2138
|
};
|
|
2136
2139
|
}
|
|
2137
|
-
}),
|
|
2140
|
+
}), ln = /* @__PURE__ */ H(sn, [["__scopeId", "data-v-dca94ae5"]]), ge = /* @__PURE__ */ U({
|
|
2138
2141
|
name: "AutoField",
|
|
2139
2142
|
__name: "Field",
|
|
2140
2143
|
props: {
|
|
@@ -2144,60 +2147,60 @@ const ve = /* @__PURE__ */ U({
|
|
|
2144
2147
|
},
|
|
2145
2148
|
emits: ["globalAction"],
|
|
2146
2149
|
setup(e) {
|
|
2147
|
-
const
|
|
2150
|
+
const r = e, t = Y(j(r, "name")), n = w(() => {
|
|
2148
2151
|
switch (t.schema?.value?.type) {
|
|
2149
2152
|
case "string":
|
|
2150
|
-
return "one_of" in t.schema.value ? Se :
|
|
2153
|
+
return "one_of" in t.schema.value ? Se : ft;
|
|
2151
2154
|
case "boolean":
|
|
2152
|
-
return "one_of" in t.schema.value ? Se :
|
|
2155
|
+
return "one_of" in t.schema.value ? Se : ya;
|
|
2153
2156
|
case "number":
|
|
2154
2157
|
case "integer":
|
|
2155
|
-
return "one_of" in t.schema.value ? Se :
|
|
2158
|
+
return "one_of" in t.schema.value ? Se : Ha;
|
|
2156
2159
|
case "array":
|
|
2157
|
-
return
|
|
2160
|
+
return Ia;
|
|
2158
2161
|
case "set":
|
|
2159
|
-
return
|
|
2162
|
+
return Bt(t.schema) ? ht : Se;
|
|
2160
2163
|
case "record":
|
|
2161
|
-
return
|
|
2164
|
+
return Ba;
|
|
2162
2165
|
case "map":
|
|
2163
|
-
return
|
|
2166
|
+
return ln;
|
|
2164
2167
|
case "json":
|
|
2165
|
-
return
|
|
2168
|
+
return Qa;
|
|
2166
2169
|
case "foreign":
|
|
2167
|
-
return
|
|
2170
|
+
return tn;
|
|
2168
2171
|
default:
|
|
2169
2172
|
return;
|
|
2170
2173
|
}
|
|
2171
2174
|
});
|
|
2172
|
-
return (
|
|
2173
|
-
const c =
|
|
2175
|
+
return (s, a) => {
|
|
2176
|
+
const c = F("KAlert");
|
|
2174
2177
|
return _(), K(ee, null, [
|
|
2175
|
-
(_(),
|
|
2176
|
-
o(t).error ? (_(),
|
|
2178
|
+
(_(), I(ie(s.$slots[o(ke)]))),
|
|
2179
|
+
o(t).error ? (_(), I(c, {
|
|
2177
2180
|
key: 0,
|
|
2178
2181
|
appearance: "danger",
|
|
2179
2182
|
message: o(t).error.message
|
|
2180
|
-
}, null, 8, ["message"])) : o(t).renderer.value ? (_(),
|
|
2183
|
+
}, null, 8, ["message"])) : o(t).renderer.value ? (_(), I(ie(o(t).renderer.value), {
|
|
2181
2184
|
key: 1,
|
|
2182
|
-
autofocus:
|
|
2183
|
-
name:
|
|
2184
|
-
onGlobalAction: a[0] || (a[0] = (d, p) =>
|
|
2185
|
+
autofocus: r.autofocus,
|
|
2186
|
+
name: Ee(o(t).path.value),
|
|
2187
|
+
onGlobalAction: a[0] || (a[0] = (d, p) => s.$emit("globalAction", d, p))
|
|
2185
2188
|
}, null, 40, ["autofocus", "name"])) : (_(), K(ee, { key: 2 }, [
|
|
2186
|
-
n.value ? (_(),
|
|
2189
|
+
n.value ? (_(), I(ie(n.value), {
|
|
2187
2190
|
key: 0,
|
|
2188
|
-
autofocus:
|
|
2189
|
-
name:
|
|
2190
|
-
}, null, 8, ["autofocus", "name"])) : (_(),
|
|
2191
|
+
autofocus: r.autofocus,
|
|
2192
|
+
name: Ee(o(t).path.value)
|
|
2193
|
+
}, null, 8, ["autofocus", "name"])) : (_(), I(c, {
|
|
2191
2194
|
key: 1,
|
|
2192
2195
|
appearance: "warning",
|
|
2193
2196
|
message: `${o(t).path.value} ${o(t).schema.value.type} (no renderer yet)`
|
|
2194
2197
|
}, null, 8, ["message"])),
|
|
2195
|
-
|
|
2198
|
+
D(s.$slots, "default")
|
|
2196
2199
|
], 64))
|
|
2197
2200
|
], 64);
|
|
2198
2201
|
};
|
|
2199
2202
|
}
|
|
2200
|
-
}),
|
|
2203
|
+
}), jn = /* @__PURE__ */ U({
|
|
2201
2204
|
name: "SchemaForm",
|
|
2202
2205
|
__name: "Form",
|
|
2203
2206
|
props: {
|
|
@@ -2209,72 +2212,72 @@ const ve = /* @__PURE__ */ U({
|
|
|
2209
2212
|
renderRules: {}
|
|
2210
2213
|
},
|
|
2211
2214
|
emits: ["change", "globalAction"],
|
|
2212
|
-
setup(e, { expose:
|
|
2213
|
-
const n = t,
|
|
2215
|
+
setup(e, { expose: r, emit: t }) {
|
|
2216
|
+
const n = t, s = Ae(), { getSchema: a, formData: c, setValue: d, getValue: p, rootRenderRules: i } = ta({
|
|
2214
2217
|
schema: e.schema,
|
|
2215
|
-
propsData:
|
|
2218
|
+
propsData: w(() => e.data),
|
|
2216
2219
|
propsConfig: e.config,
|
|
2217
|
-
propsRenderRules:
|
|
2218
|
-
onChange: (
|
|
2219
|
-
}), m =
|
|
2220
|
-
const { fields:
|
|
2221
|
-
let l = [...
|
|
2222
|
-
return e.fieldsOrder ?
|
|
2220
|
+
propsRenderRules: j(() => e.renderRules),
|
|
2221
|
+
onChange: (h) => n("change", h)
|
|
2222
|
+
}), m = w(() => {
|
|
2223
|
+
const { fields: h } = a();
|
|
2224
|
+
let l = [...h];
|
|
2225
|
+
return e.fieldsOrder ? st(l, e.fieldsOrder) : (i.value?.bundles && (l = lt([...l], i.value.bundles)), l);
|
|
2223
2226
|
});
|
|
2224
|
-
return
|
|
2227
|
+
return r({
|
|
2225
2228
|
getValue: p,
|
|
2226
|
-
getRawValue: () =>
|
|
2229
|
+
getRawValue: () => Qe(c),
|
|
2227
2230
|
setValue: d
|
|
2228
|
-
}), (
|
|
2229
|
-
default:
|
|
2230
|
-
(_(),
|
|
2231
|
-
|
|
2232
|
-
(_(!0), K(ee, null, oe(m.value, (u) => (_(),
|
|
2231
|
+
}), (h, l) => (_(), I(ie(e.tag), null, {
|
|
2232
|
+
default: x(() => [
|
|
2233
|
+
(_(), I(ie(o(s)[o(ke)]))),
|
|
2234
|
+
D(h.$slots, "default", {}, () => [
|
|
2235
|
+
(_(!0), K(ee, null, oe(m.value, (u) => (_(), I(ge, {
|
|
2233
2236
|
key: Object.keys(u)[0],
|
|
2234
2237
|
name: Object.keys(u)[0],
|
|
2235
|
-
onGlobalAction: l[0] || (l[0] = (f,
|
|
2238
|
+
onGlobalAction: l[0] || (l[0] = (f, b) => n("globalAction", f, b))
|
|
2236
2239
|
}, null, 8, ["name"]))), 128))
|
|
2237
2240
|
])
|
|
2238
2241
|
]),
|
|
2239
2242
|
_: 3
|
|
2240
2243
|
}));
|
|
2241
2244
|
}
|
|
2242
|
-
}),
|
|
2245
|
+
}), En = /* @__PURE__ */ U({
|
|
2243
2246
|
__name: "FieldRenderer",
|
|
2244
2247
|
props: {
|
|
2245
2248
|
match: { type: Function },
|
|
2246
2249
|
priority: {}
|
|
2247
2250
|
},
|
|
2248
2251
|
setup(e) {
|
|
2249
|
-
const
|
|
2250
|
-
return t && n.set(
|
|
2252
|
+
const r = e, { default: t } = Ae(), { fieldRendererRegistry: n } = ae();
|
|
2253
|
+
return t && n.set(r.match, t), (s, a) => null;
|
|
2251
2254
|
}
|
|
2252
|
-
}), cn = { cancel: "Cancel", view_configuration: "View configuration", create: "New plugin", create_custom: "Create", configure: "Configure", copy_id: "Copy ID", copy_json: "Copy JSON", edit: "Edit", enable: "Enable", enabled: "Enabled", disable: "Disable", delete: "Delete", disabled: "Disabled", confirm_delete: "Yes, delete", view: "View details", configure_dynamic_ordering: "Configure dynamic ordering", go_to_plugins: "Go to plugins", save: "Save", add_entity: "Add {entity}", remove_entity: "Remove {entity}", loading_spinner: "Loading..." }, dn = { title: "Configuration", message: "Export configurations for core Kong Gateway objects, like services, routes, and plugins, to either YAML, JSON, or Terraform. This allows for straightforward importing into APIOps tools like decK with YAML, Insomnia and cURL with JSON, or Terraform products with Terraform.", yaml: "YAML", terraform: "Terraform", json: "JSON", deck: "decK" }, pn = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, mn = { general: "Plugins could not be retrieved", delete: "The plugin could not be deleted at this time.", copy: "Failed to copy to clipboard", load_results: "Error loading available plugins", load_schema: "Error loading plugin schema" }, fn = { placeholder: { konnect: "Filter by name", exact: "Filter by exact instance name or ID", kongManager: "Filter by exact instance name or ID", select: "Filter plugins", search_plugins: "Search plugins", search: "Search", tags_filter: "Type part of a tag and press Enter", scope_filter: "Select a scope" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, hn = { new: "New" }, gn = /* @__PURE__ */ JSON.parse('{"title":"Plugins","list":{"toolbar_actions":{"new_plugin":"New plugin"},"table_headers":{"applied_to":"Applied to","applied_to_badges":{"consumer":"Consumer","global":"Global","route":"Route","service":"Service","consumer_group":"Consumer group"},"id":"ID","plugin":"Plugin","name":"Name","instance_name":"Instance name","scope":"Scope","status":"Status","ordering":"Ordering","ordering_badge":{"dynamic":"Dynamic","static":"Static"},"enabled":"Enabled","tags":"Tags","updated_at":"Last modified"},"empty_state":{"title":"Configure a new plugin","description":"Plugins are used to extend Kong functionality."},"empty_state_v2":{"title":"Configure your first plugin","description":"Plugins extend gateways functionalities, offering features like authentication, rate limiting, and request transformations to enhance security and performance.","create_cta":"New plugin","group":"Plugins created in gateways within this group will automatically appear here.","learn_more":"Learn more"}},"meta":{"basic-auth":{"name":"Basic Authentication","credential_name":"Basic Auth Credential","description":"Add Basic Authentication to your services"},"hmac-auth":{"name":"HMAC Authentication","credential_name":"HMAC Credential","description":"Add HMAC Authentication to your services"},"jwt-signer":{"name":"JWT Signer","description":"Verify and (re-)sign one or two tokens in a request"},"jwt":{"name":"JWT","credential_name":"JWT Credential","description":"Verify and authenticate JSON Web Tokens"},"key-auth":{"name":"Key Authentication","credential_name":"Key Auth Credential","description":"Add key authentication to your services"},"key-auth-enc":{"name":"Key Authentication Encrypted","credential_name":"Key Auth Encrypted","description":"Add key authentication to your services with an encrypted token"},"ldap-auth-advanced":{"name":"LDAP Authentication Advanced","description":"Integrate Kong with a LDAP server"},"ldap-auth":{"name":"LDAP Authentication","description":"Integrate Kong with a LDAP server"},"oauth2-introspection":{"name":"OAuth 2.0 Introspection","description":"Integrate Kong with a third-party OAuth 2.0 Authorization Server"},"oauth2":{"name":"OAuth 2.0 Authentication","credential_name":"OAuth 2.0 Application","description":"Add OAuth 2.0 authentication to your services"},"openid-connect":{"name":"OpenID Connect","description":"Integrate Kong with a third-party OpenID Connect 1.0 provider"},"mtls-auth":{"name":"Mutual TLS Authentication","description":"Secure routes and services with client certificate and mutual TLS authentication"},"vault-auth":{"name":"Vault Authentication","description":"Secure routes and services with an access token and secret token, stored securely via Vault"},"bot-detection":{"name":"Bot Detection","description":"Detect and clock bots or custom clients"},"cors":{"name":"CORS","description":"Allow developers to make requests from the browser"},"ip-restriction":{"name":"IP Restriction","description":"Whitelist or blacklist IPs that can make requests"},"opa":{"name":"OPA","description":"Authorize requests against Open Policy Agent"},"kubernetes-sidecar-injector":{"name":"Kubernetes Sidecar Injector","description":"This plugin will inject Kong dataplane nodes and form a service mesh on top of Kubernetes"},"request-validator":{"name":"Request Validator","description":"Validate requests before they reach their upstream service."},"acl":{"name":"ACL","credential_name":"Access Control Group","description":"Control which consumers can access services"},"canary":{"name":"Canary Release","description":"Methodically roll out software changes to a subset of users"},"forward-proxy":{"name":"Forward Proxy","description":"Allow Kong to connect to intermediary transparent HTTP proxies"},"proxy-cache":{"name":"Proxy Caching","description":"Cache and serve commonly requested responses in Kong"},"proxy-cache-advanced":{"name":"Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"graphql-proxy-cache-advanced":{"name":"GraphQL Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"rate-limiting-advanced":{"name":"Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"rate-limiting":{"name":"Rate Limiting","description":"Rate-limit how many HTTP requests a developer can make"},"graphql-rate-limiting-advanced":{"name":"GraphQL Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"mocking":{"name":"Mocking","description":"Provide mock endpoints to test your APIs in development against your services"},"request-size-limiting":{"name":"Request Size Limiting","description":"Block requests with bodies greater than a specific size"},"request-termination":{"name":"Request Termination","description":"Terminate all requests with a specific response"},"response-ratelimiting":{"name":"Response Rate Limiting","description":"Rate-Limiting based on a custom response header value"},"route-by-header":{"name":"Route by Header","description":"Route requests based on request headers"},"ai-proxy":{"name":"AI Proxy","description":"Directly call a configured LLM, with mediated security and tuning parameters, and using standardised Kong request and response formats."},"ai-prompt-decorator":{"name":"AI Prompt Decorator","description":"Prepend and append chat prompts to AI Proxy plugin LLM requests."},"ai-prompt-template":{"name":"AI Prompt Template","description":"Define a set of templates, containing string variable placeholders, that can be consumed by users when used with the AI Proxy plugin."},"ai-prompt-guard":{"name":"AI Prompt Guard","description":"Define a set of valid, and a set of invalid, regular expression patterns when calling LLM models with the AI Proxy plugin."},"ai-request-transformer":{"name":"AI Request Transformer","description":"Use an LLM to transform API request from a user, before sending to the upstream service."},"ai-response-transformer":{"name":"AI Response Transformer","description":"Use an LLM to transform API responses from the upstream service, before returning to the user."},"ai-rate-limiting-advanced":{"name":"AI Rate Limiting Advanced","description":"Provides rate limiting for the providers used by any AI plugins."},"ai-azure-content-safety":{"name":"AI Azure Content Safety","description":"Allows checking and auditing of AI-Proxy plugin messages, using Azure Cognitive Services, before proxying to upstream large-language model."},"aws-lambda":{"name":"AWS Lambda","description":"Invoke and manage AWS Lambda functions from Kong"},"azure-functions":{"name":"Azure Functions","description":"Invoke Azure functions"},"openwhisk":{"name":"OpenWhisk","description":"Invoke and manage OpenWhisk actions from Kong"},"pre-function":{"name":"Kong Functions (Pre-Plugins)","description":"Add and manage custom lua functions to run before other plugins"},"post-function":{"name":"Kong Functions (Post-Plugins)","description":"Add and manage custom lua functions to run after other plugins"},"datadog":{"name":"Datadog","description":"Visualize metrics on Datadog"},"prometheus":{"name":"Prometheus","description":"Export performance metrics to Prometheus"},"zipkin":{"name":"Zipkin","description":"Propagate zipkin spans and report spans to a zipkin server"},"collector":{"name":"Collector","description":"Automate spec-driven development & anomaly detection (Early Access)"},"response-transformer-advanced":{"name":"Response Transformer Advanced","description":"Transform the response sent by the upstream server on the fly on Kong, before returning the response to the client."},"correlation-id":{"name":"Correlation ID","description":"Correlate requests and responses using a unique ID"},"request-transformer-advanced":{"name":"Request Transformer Advanced","description":"Use powerful regular expressions, variables and templates to transform API requests"},"request-transformer":{"name":"Request Transformer","description":"Modify the request before hitting the upstream server"},"response-transformer":{"name":"Response Transformer","description":"Modify the upstream response before returning it to the client"},"route-transformer-advanced":{"name":"Route Transformer Advanced","description":"Transforms the routing on the fly in Kong, changing the upstream server/port/path to hit"},"kafka-upstream":{"name":"Kafka Upstream","description":"Transform requests into Kafka messages in a topic"},"degraphql":{"name":"DeGraphQL","description":"Transform a GraphQL upstream into a REST API"},"exit-transformer":{"name":"Exit Transformer","description":"Customize Kong exit responses sent downstream"},"jq":{"name":"jq","description":"Transform JSON objects included in API requests or responses using jq programs"},"file-log":{"name":"File Log","description":"Append request and response data to a log file on disk"},"http-log":{"name":"HTTP Log","description":"Send request and response logs to an HTTP server"},"loggly":{"name":"Loggly","description":"Send request and response logs to Loggly"},"statsd-advanced":{"name":"StatsD Advanced","description":"Send traffic and Kong performance metrics to StatsD"},"statsd":{"name":"StatsD","description":"Send request and response logs to StatsD"},"syslog":{"name":"Syslog","description":"Send request and response logs to Syslog"},"tcp-log":{"name":"TCP Log","description":"Send request and response logs to a TCP server"},"udp-log":{"name":"UDP Log","description":"Send request and response logs to a UDP server"},"kafka-log":{"name":"Kafka Log","description":"Publish request and response logs to a Kafka topic"},"session":{"name":"Session","description":"Sessions for Kong authentication"},"upstream-tls":{"name":"Upstream TLS","description":"Enable TLS on upstream traffic by providing Kong with a list of trusted certificates."},"application-registration":{"name":"Portal Application Registration","description":"Allow portal developers to register applications against services"},"konnect-application-auth":{"name":"Konnect Application Auth","description":"Allow Konnect portal developers to register applications against services"},"acme":{"name":"ACME","description":"Let\'s Encrypt and ACMEv2 integration with Kong"},"grpc-gateway":{"name":"gRPC Gateway","description":"Access gRPC services through HTTP REST"},"grpc-web":{"name":"gRPC Web","description":"Allow browser clients to call gRPC services"},"upstream-timeout":{"name":"Upstream Timeout","description":"Configure read, send and connect timeouts to an upstream"},"opentelemetry":{"name":"OpenTelemetry","description":"Propagate distributed tracing spans and report low-level spans to a OTLP-compatible server"},"websocket-validator":{"name":"WebSocket Validator","description":"Validate individual WebSocket messages against to a user-specified schema before proxying them"},"websocket-size-limit":{"name":"WebSocket Size Limit","description":"Allows operators to specify a maximum size for incoming WebSocket messages"},"tls-metadata-headers":{"name":"TLS Metadata Headers","description":"Detects client certificates in requests, retrieves the TLS metadata, and proxies this metadata via HTTP headers"},"tls-handshake-modifier":{"name":"TLS Handshake Modifier","description":"Requests the client certificate and if it exists, makes it available to other plugins acting on the request"},"oas-validation":{"name":"OAS Validation","description":"Validate HTTP requests and responses based on an API specification."},"jwe-decrypt":{"name":"Kong JWE Decrypt","description":"The Kong JWE Decrypt plugin makes it possible to decrypt an inbound token(JWE) in a request."},"xml-threat-protection":{"name":"XML Threat Protection","description":"Reduce the risk of XML attacks by checking the structure of XML payloads."},"saml":{"name":"SAML","description":"Security Assertion Markup Language (SAML) is an open standard for exchanging authentication and authorization data between an identity provider and a service provider."},"app-dynamics":{"name":"AppDynamics","description":"This plugin integrates Kong with the AppDynamics APM platform so that proxy requests handled by Kong can be identified and analyzed in AppDynamics."},"json-threat-protection":{"name":"JSON Threat Protection","description":"Apply size checks on JSON payload and minimize risk of content-level attacks"},"standard-webhooks":{"name":"Standard Webhooks","description":"Validate incoming webhooks adhere to the Standard Webhooks specification, to which Kong is a contributor"},"ai-proxy-advanced":{"name":"AI Proxy Advanced","description":"Route across different LLMs and models using advanced load balancing algorithms, including semantic routing."},"ai-semantic-cache":{"name":"AI Semantic Cache","description":"Semantically cache AI requests to any LLM to reduce latency, improve end-user experiences and optimize GenAI costs."},"ai-semantic-prompt-guard":{"name":"AI Semantic Prompt Guard","description":"Semantically and intelligently create allow and deny lists of topics that can be requested across every LLM."},"header-cert-auth":{"name":"Header Certificate Authentication","description":"Authenticate clients with MTLS certificate passed in header by a WAF or load balancer"},"upstream-oauth":{"name":"Upstream OAuth","description":"Configure Kong to obtain a OAuth2 token to consume an upstream API"},"confluent":{"name":"Confluent","description":"Streamlines integration with Confluent Cloud and transforms requests into messages published to a Confluent topic."},"service-protection":{"name":"Service Protection","description":"Prevent abuse and protect services with absolute limits on the number of requests reaching the service."},"injection-protection":{"name":"Injection Protection","description":"Protect against injection attacks by rejecting requests that match common injections patterns."},"redirect":{"name":"Redirect","description":"Redirect incoming requests to a new URL"},"kafka-consume":{"name":"Kafka Consume","description":"Consume messages from Kafka topics over HTTP protocols."},"confluent-consume":{"name":"Confluent Consume","description":"Consume messages from Confluent Kafka topics over HTTP protocols"},"request-callout":{"name":"Request Callout","description":"Callout to third party APIs as part of request processing."},"ai-sanitizer":{"name":"AI Sanitizer","description":"Sanitize personal or sensitive information from prompts before sending to LLM."},"ai-rag-injector":{"name":"AI RAG Injector","description":"Attach contextual knowledge from vector databases with flexible template to LLM prompts."},"datakit":{"name":"Datakit","description":"Datakit is a workflow engine for working with external APIs."},"ai-prompt-compressor":{"name":"AI Prompt Compressor","description":"The AI Prompt Compressor reduces costs associated with LLMs by compressing prompts."},"solace-upstream":{"name":"Solace Upstream","description":"Transform requests into Solace messages in a Solace queue or topic."},"ai-aws-guardrails":{"name":"AI AWS GuardRails","description":"The AI AWS GuardRails enables enforcement of introspection with the AWS GuardRails service for all requests processed by the AI Proxy plugin."},"ace":{"name":"Konnect Access Control Enforcement","description":"Enable Developer Self-Service for Konnect Dev Portals."},"solace-consume":{"name":"Solace Consume","description":"Consume messages from Solace and make them available through HTTP endpoints."},"solace-log":{"name":"Solace Log","description":"Publish request and response logs to a Solace topic."},"ai-llm-as-judge":{"name":"AI LLM Judge","description":"Evaluate LLM responses with an external LLM service and use accuracy scores to drive dynamic load balancing for `llm/v1/chat` requests."},"ai-mcp-proxy":{"name":"AI MCP Proxy","description":"Convert APIs into MCP tools, proxy MCP servers, expose multiple MCP tools, and observe MCP traffic in real time."},"ai-gcp-model-armor":{"name":"AI GCP Model Armor","description":"Audit and validate AI Proxy messages with Google Cloud Model Armor before forwarding them to an upstream LLM."},"ai-mcp-oauth2":{"name":"AI MCP OAuth2","description":"Secure MCP server access with OAuth2 authentication."},"ai-semantic-response-guard":{"name":"AI Semantic Response Guard","description":"Permit or block prompts based on semantic similarity to known LLM responses, preventing misuse of `llm/v1/chat` or `llm/v1/completions` requests."},"ai-lakera-guard":{"name":"AI Lakera Guard","description":"Audit and enforce safety policies on LLM requests and responses using the AI AWS Lakera plugin before they reach upstream LLMs."},"ai-a2a-proxy":{"name":"AI A2A Proxy","description":"Securely proxy A2A agents, with real-time RPC tracing and monitoring."},"ai-custom-guardrail":{"name":"AI Custom Guardrail","description":"Integrate with any 3rd-party Guardrail service, with customizable enforcement modes — choose whether violations block, log, or allow traffic to proceed."},"metering-and-billing":{"name":"Metering & Billing","description":"Meter API requests and AI token usage for usage-based billing. Supports flexible customer identification, custom pricing dimensions, and fine-grained traffic filtering. Integrates natively with Konnect Metering & Billing."},"governance":{"name":"Governance","description":"Enforce feature-level access control and credit-balance gating for API consumers. Integrates with Konnect Metering & Billing to allow or deny requests based on customer entitlements."}},"fields":{"service":"Service ID","route":"Route ID","consumer":"Consumer ID","consumer_group":"Consumer group ID"},"select":{"custom_badge_text":"This plugin is data plane node specific","cloned_from_badge":"Cloned from {link}","installed_custom_badge":"Installed custom","streamed_custom_badge":"Streamed custom","unavailable_tooltip":"This plugin is not available","already_exists":"This plugin is already applied to this resource","misc_plugins":"Other plugins","show_all":"Show all","view_more":"View more","view_less":"View less","filter":{"title":"Filter plugins","featured":"Featured","type":"Type","clear":"Clear"},"list":{"table_headers":{"name":"Plugin","description":"Description"}},"tabs":{"kong":{"title":"Kong plugins","description":"Kong plugins are bundled by default with Kong Gateway and are available across all control planes.","empty_title":"No plugins","empty_description":"No plugins are available."},"custom":{"title":"Custom plugins","description":"Custom plugins will be available in this control plane only.","disabled_tooltip":"Custom plugins are not available with this gateway. Create a hybrid or dedicated cloud gateway to leverage custom plugins.","fetch_error":"Unable to load some custom plugins. Bundled plugins are still available.","license_required":"Plugin cloning requires a license to be used.","empty_title":"No custom plugins","empty_description":"No custom plugins have been added to this control plane.","create":{"name":"Custom plugin","description":"Upload schema file to create custom plugin"}}},"highlighted_plugins":{"title":"Highlighted plugins"}},"form":{"button_deck_customize":"Customize before copying to CLI","disable_data_retrieving":"You do not have permission to select {scope}","disable_source_scope_change":"Changing the {scope} is not allowed when configuring a plugin under it","no_selection":"No selection...","fields":{"enabled":{"label":"Enabled","on_text":"This plugin is enabled","off_text":"This plugin is disabled"},"plugin_status":{"label":"Plugin status","text_on":"Enabled","text_off":"Disabled"},"instance_name":{"label":"Name","placeholder":"Enter a unique name","help":"A custom name for this plugin instance to help with identifying from the list view."},"condition":{"label":"Execution condition","placeholder":"Enter an expression","tooltip":"An expression used for conditional control over plugin execution. If the expression evaluates to true during the request flow, the plugin is executed; otherwise, it is skipped.","help":{"learn":"Learn more","about":"{link} about plugin conditions."}},"protocols":{"label":"Protocols","placeholder":"Select valid protocols for the plugin","placeholderWithDefaultValues":"Select valid protocols for the plugin. Default protocols: {protocols}","help":"A list of the request protocols that will trigger this plugin. The default value, as well as the possible values allowed on this field, may change depending on the plugin type."},"tags":{"label":"Tags","help":"An optional set of strings for grouping and filtering, separated by commas.","placeholder":"Tag1, Tag2, Tag3"}},"scoping":{"label":"Scoped","placeholder":"Search by name or UUID","disable_global_radio":"The plugin is set to \'scoped\' by default. To apply a plugin globally, please navigate to the global plugin list page.","global":{"label":"Global","help":"All services, routes, and consumers"},"gateway_service":{"label":"Select a gateway service","help":"The gateway service to which this plugin configuration will apply","placeholder":"Select a gateway service","plural":"Gateway services"},"route":{"label":"Select a route","help":"The route that this plugin configuration will target","placeholder":"Select a route","plural":"Routes"},"consumer":{"label":"Select a consumer","help":"The consumer that this plugin configuration will target","placeholder":"Select a consumer","plural":"Consumers"},"consumer_group":{"label":"Select a consumer group","help":"The consumer group that this plugin configuration will target","placeholder":"Select a consumer group","plural":"Consumer groups"}},"grouping":{"plugin_configuration":{"title":"Plugin configuration","description":"Configuration parameters for this plugin. View advanced parameters for extended configuration.","empty":"This plugin does not have required parameters."},"advanced_parameters":{"view":"Show additional settings","hide":"Hide additional settings"}},"field_rules":{"at_least_one_of":"At least one of the following values is required: {parameters}.","only_one_of":"Exactly one of these parameters is required: {parameters}","mutually_required":"These values must be used together: {parameters}.","mutually_exclusive":"Only one of these values can be used: {parameters}.","only_one_of_mutually_required":"Exactly one of the following parameter combinations is required (all parameters within a chosen combination are required):"},"sections":{"plugin_scope":{"title":"Plugin scope","description":"Choose whether this plugin applies to all traffic (global) or is scoped to a specific service, route, or consumer."},"general_info":{"title":"General information","description":"Add details to help identify and manage your plugin."},"plugin_config":{"title":"Plugin configuration","description":"Set the plugin\'s behavior by defining its configuration settings."},"plugin_general_info":{"description":"Add a name or tags to help you identify and manage this plugin later."},"code_mode":{"title":"Code editor","description":"Configure this plugin by using YAML configuration."}}},"free-form":{"editor_mode":{"visual":"Visual editor","code":"Code editor"},"code-lens":{"entity":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","certificate":"Certificate"},"field":{"name":"{entity} \\"{value}\\"","username":"Username \\"{value}\\"","custom_id":"Custom ID \\"{value}\\"","subject":"Subject \\"{value}\\"","expires_after":"Expires after \\"{value}\\""},"action":{"view_entity":"View {title}","copy_certificate":"Copy certificate","copy_uuid":"Copy UUID","retry_fetch":"Retry fetch (Hover for details)"},"unknown_error":"Unknown error"},"acl":{"mode":{"allow":"Use allow list","deny":"Use deny list"}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"request-callout":{"entity_name":"Request callout","by_lua_placeholder":"Enter Lua script here..."},"jwt-signer":{"keyset_url_required":"Provide a valid HTTP/HTTPS URL to ensure signing works correctly when \\"{signingField}\\" is enabled and \\"{headerField}\\" is set."},"metering-and-billing":{"sections":{"plugin_config":{"title":"Plugin configuration","description":"Configure the Metering & Billing plugin."},"metering":{"title":"What to meter"},"subject":{"title":"Who to bill (subject)","description":"Define how billing subjects are identified."},"ingestion":{"title":"Connection","description":"Configure how metered data is delivered to the billing service."},"queue":{"title":"Queue","description":"Configure internal event queue settings."}},"fields":{"meter_api_requests":{"label":"Meter API requests","description":"Emit a usage event for each API Gateway request."},"meter_ai_token_usage":{"label":"Meter AI token usage","description":"Emit events for LLM input and output tokens on AI Gateway requests. Each request produces separate input/output events so they can be priced independently."},"ingest_endpoint":{"description":"The URL of the metering data ingest endpoint.","help":"For Konnect Metering & Billing, use the regional endpoint from your Metering & Billing settings. For self-hosted OpenMeter, use your ingest URL."},"api_token":{"description":"Bearer token for authenticating requests to the ingest endpoint."},"look_up_value_in":{"label":"Look up subject in","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"e.g. x-customer-id, x-api-key, x-tenant"},"queue":{"max_coalescing_delay":{"label":"Max coalescing delay (s)"},"initial_retry_delay":{"label":"Initial retry delay (s)"},"max_retry_delay":{"label":"Max retry delay (s)"},"max_retry_time":{"label":"Max retry time (s)"}},"attributes":{"title":"Event attributes","description":"Attach custom dimensions to metered events.","look_up_value_in":{"placeholder":"e.g., x-priority-id"},"event_property_name":{"placeholder":"e.g., priority"}},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"}}},"governance":{"sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Governance plugin subject, feature, and connection settings."},"governance":{"title":"Governance settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to govern (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the governance query endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to govern (Look up subject in)","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"Name of the header or query parameter that carries the customer identifier."},"feature_key":{"label":"Feature to govern access","help":"Feature that will control access to the scope where the plugin is applied.","metered_badge":"Metered feature","load_error":"Could not load features from the governance service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing Query Governance Access. For self-hosted OpenMeter, use the Query Governance Access endpoint of your self-hosted instance."},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"},"sync_rate":{"label":"Sync rate (s)"},"refresh_interval":{"label":"Refresh interval (s)"},"max_stale_seconds":{"label":"Max stale seconds"},"l1_ttl":{"label":"L1 TTL (s)"},"l2_ttl":{"label":"L2 TTL (s)"},"credit_balance_required":{"label":"Credit balance lookup","yes_label":"Yes","yes_description":"A credit balance above zero is required for access to this feature.","no_label":"No","no_description":"Customers can access this feature regardless of their credit balance."},"fail_policy":{"label":"Plugin failure mode","allow_label":"Allow access","allow_description":"In the case of plugin failure, allow access to feature.","deny_label":"Deny access","deny_description":"In the case of plugin failure, deny access to feature."},"deny_unknown_customers":{"label":"Unknown customer access","allow_label":"Allow access","allow_description":"The gateway will allow access for unknown customers.","deny_label":"Deny access","deny_description":"The gateway will deny access for unknown customers."},"response":{"label":"Response mapping","columns":{"code":"Response code","status":"Status code","message":"Message"},"defaults":{"NO_CREDIT_AVAILABLE":"Customer has no credit available.","USAGE_LIMIT_REACHED":"Customer has reached usage limit for feature.","FEATURE_UNAVAILABLE":"Feature is not available for the customer.","FEATURE_NOT_FOUND":"Feature not found.","CUSTOMER_NOT_FOUND":"Customer is not found by subject."}}}},"datakit":{"plugin_config":{"title":"Flow editor"},"description_code":"Configure this plugin by using YAML configuration. If you are copy/pasting in examples from the documentation - paste from below the <code>config</code> block.","description_flow":"Build flows visually with a drag-and-drop editor for Datakit. Visualize node connections, inputs, and outputs as you design.","description_example":"Start with a use case:","detected_config_format":"Detected {format} configuration. Do you want to convert it to Datakit configuration?","detected_config_format_title":"Convert configuration","detected_config_format_confirm":"Convert","examples":{"authenticateThirdPartyWithDynamicUrl":"Authenticate Kong to a third-party service resolved at runtime","authenticateThirdParty":"Authenticate Kong to a third-party service","authenticateWithVaultSecret":"Authenticate to a third-party service using Vault secrets","clearHeaders":"Clear request headers","combineTwoApisIntoOneResponse":"Combine multiple API responses","conditionallyStoreCachedItems":"Conditionally fetch or store cache data","convertJsonIntoXml":"Transform JSON into XML","convertJsonToXmlAndBack":"Transform JSON into XML and back","convertXmlIntoJson":"Transform XML into JSON","manipulateRequestHeaders":"Manipulate request headers"},"flow_editor":{"mode":"Flow editor","name":"Datakit flow editor","cta":"Go to flow editor","disabled_tooltip":"The flow editor is unavailable due to critical configuration errors or features not supported in the flow editor:<br/><code>{reason}</code>","expand_panel":"Expand panel","collapse_panel":"Collapse panel","return_to_config":"Return to plugin configuration","canvas_panel":{"request":"Request","response":"Response","node_count_plural":"{count} nodes","node_count_singular":"1 node"},"panel_segments":{"nodes":"Nodes","resources":{"title":"Resources","vault":{"title":"Vault secrets","add_button":"Add vault resource","name_exists_error":"Vault name already exists","name_required_error":"Vault name is required","edit":"Edit","delete":"Delete"},"cache":{"title":"Cache configuration","add_button":"Add cache configuration","strategy_options":{"memory":"Memory","redis":"Redis"},"select_redis_configuration":"Select a shared Redis configuration","inline_config":"Inline config","inline_config_preview":"You are using a dedicated Redis configuration, This is a preview of your current setup, please edit it in code editor"}}},"vault_secret_picker":{"title":"Add secret to Datakit","proceed_button_text":"Add secret","secret_name":{"label":"Secret name","placeholder":"Enter a name","help":"A unique identifier for this secret in your Datakit configuration"}},"node_panel":{"title":"Node types","description":"Drag a node onto the canvas to add it to your data flow.","groups":{"external_interaction":"External interaction","control_flow":"Control flow","data_transformation":"Data transformation","data_value":"Data value","authentication":"Authentication"}},"examples":"Examples","debug":{"label":"Debug","description":"Enables detailed error messages in client responses, making debugging easier. <a href=\\"https://developer.konghq.com/plugins/datakit/#debugging\\" target=\\"_blank\\">See the docs</a> for details."},"actions":{"zoom_in":"Zoom in","zoom_out":"Zoom out","fit_view":"Zoom to fit","auto_layout":"Auto layout","undo":"Undo","redo":"Redo","duplicate":"Duplicate","remove_from_branch":"Remove from branch","delete":"Delete","view_docs":"View docs","done":"Done"},"node_types":{"call":{"summary":"Call a third-party API","description":"Send an HTTP request and retrieve the response."},"jq":{"summary":"Transform data and cast variables with jq","description":"The <code>jq</code> node executes a jq script for processing JSON. See the official <a href=\\"https://jqlang.org\\" target=\\"_blank\\">jq docs</a> for more details."},"exit":{"summary":"Return directly to the client","description":"Trigger an early exit that produces a direct response, rather than forwarding a proxied response."},"property":{"summary":"Get and set Kong Gateway-specific data","description":"Get and set Kong Gateway host and request properties."},"static":{"summary":"Configure static input values ahead of time","description":"Emits static values to be used as inputs for other nodes. The <code>static</code> node can help you with hardcoding some known value for an input."},"branch":{"summary":"Execute nodes based on matching input conditions","description":"Execute different nodes based on matching input conditions, such as a cache hit or miss."},"cache":{"summary":"Store and fetch cached data","description":"Store data into cache and fetch cached data from cache."},"xml_to_json":{"summary":"Transform XML to JSON","description":"Transform XML to JSON."},"json_to_xml":{"summary":"Transform JSON to XML","description":"Transform JSON to XML."},"jwt_decode":{"summary":"Decode JWT headers and claims","description":"Parse a JWT without verifying its signature."},"jwt_sign":{"summary":"Create and sign JWTs","description":"Generate a signed JWT from configured claims and a signing key."},"jwt_verify":{"summary":"Verify JWT signature and claims","description":"Verify a JWT signature and validate claims such as exp, nbf, iss, and aud."},"request":{"name":"request","description":"Reads incoming client request properties. You cannot specify request node input."},"response":{"name":"response","description":"Updates properties of the outgoing client response."},"service_request":{"name":"service request","description":"Updates properties of the request sent to the service being proxied to."},"service_response":{"name":"service response","description":"Reads response properties from the service being proxied to."},"vault":{"name":"Vault","description":"Vault is a tool for securely accessing secrets."}},"node_properties":{"name":"Name","configuration":"Configuration","input":{"label":"Inputs configuration","placeholder":"Select a source","add_button":"Add an input","or":"or","input":"Input","fields":"Fields","source":"Source","tooltip":"Fields are part of the node input. A source can connect to either the fields or the input, but not both."},"input_name":{"label":"Input name","placeholder":"Enter an input name"},"jq":{"label":"jq script","help":"Refer to {link} for full documentation."},"output_value":{"label":"Output value","value_name":"Value name","value":"Value","add_button":"Add a value"},"property":{"get":"get","set":"set"},"branch":{"placeholder":"Select nodes"},"jwt":{"static_claims":{"label":"Static claims","help":"Enter a JSON object. It will be stored as the node\'s static claims map.","errors":{"invalid_json_object":"Static claims must be a valid JSON object"}}},"errors":{"invalid_identifier_format":"{fieldName} must start with a letter or underscore and contain only letters, numbers, underscores, or hyphens","invalid_url_format":"Not a valid URL format","not_empty":"{fieldName} is required","not_float":"{fieldName} must be a float","not_integer":"{fieldName} must be an integer","not_number":"{fieldName} must be a number","not_unique":"{fieldName} must be unique","number_range":"{fieldName} must be between {min} and {max}","string_len_range":"{fieldName} must be between {minLength} and {maxLength} characters","reserved_node_name":"\\"{nodeName}\\" is a reserved node name","attributes_required":"Provide at least one of attributes_block_name or attributes_name_prefix"}},"error":{"invalid_connection":"Invalid connection","branch_cycle":"Cannot create a circular branch relationship"},"confirm":{"title":"Connection conflict","message":{"confirm":"Are you sure you want to make this change?","switch":"You can connect an output source to either all inputs of a node or to individual inputs.","override":"Each input can connect to only one output, but one output can connect to many inputs.","branch_replace":"This node already belongs to another branch. Move it to the new branch?"},"proceed":"Yes, update"},"leave_confirm":"Leave current page? Changes you made may not be saved."},"code_editor":{"mode":"Code editor"}},"vault_picker":{"component_error":"The vault secret picker is not available"},"tag_helper":"Use comma to separate values. eg: value1, value2","foreign_placeholder":"Enter a UUID of {entity}"}}'), yn = { title: "Redis configuration", managed_ui: { title: "Redis", shared_configuration: { label: "Use shared configuration", description: "Select an existing shared Redis configuration or create a new one. Any updates to this configuration will automatically apply to all associated plugins.", badge: "Recommended" }, dedicated_configuration: { label: "Use locally-scoped configuration", description: "Create and use a Redis configuration specifically for this plugin." }, selector: { placeholder: "Filter Redis configurations...", create_new: "New Redis" } }, shared_configuration: { label: "Shared configuration", description: "Select an existing shared Redis configuration or create a new one. Changes to this configuration automatically apply to all associated plugins.", title: "Shared Redis configuration", error: "Fetching shared Redis configurations failed." }, dedicated_configuration: { label: "Dedicated configuration", description: "Create a Redis configuration that is used only by this plugin. Changes won’t affect other plugins." }, config_card: { common_fields: { created_at_label: "Created at", updated_at_label: "Last updated at", type_label: "Redis type" } } }, vn = { plugin: "plugin" }, bn = { key_auth_identity_realms: { cp_label: "Current control plane", cp_group_label: "Control plane", realm_group_label: "Realms (can only select one)" }, kong_identity: { title: "Who should manage authentication and credentials?", description_with_realms: "Use Consumers or centrally managed consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", description_without_realms: "Use Consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", learn_more: "Learn more.", incompatible_data_plane_alert: "We detected that one or more data plane nodes are running a version earlier than 3.15. Requests handled by those data plane nodes will use consumers instead of Kong Identity principals.", kong_identity_label: "Kong Identity", kong_identity_description_key_auth: "Use Kong Identity to authenticate API keys and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", kong_identity_description_basic_auth: "Use Kong Identity to authenticate Basic Auth credentials and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", consumers_label: "Consumers", consumers_description_key_auth: "Use consumer-managed API keys. Consumers provide their API key in a request header, query parameter, or request body to authenticate requests.", consumers_description_basic_auth: "Use consumer-managed Basic Auth credentials. Consumers authenticate requests using a username and password.", centrally_managed_label: "Centrally managed consumers", centrally_managed_description: "Authenticate centrally managed consumers in Konnect using identity realms. Identity realms are scoped to the control plane by default.", identity_realms_required: "To use centrally managed consumers, you must select at least one Centrally managed consumer realm.", error_on_miss_label: "If principal lookup fails", error_on_miss_reject_label: "Reject the request", error_on_miss_reject_description: "Treat the request as unauthenticated if Kong Identity cannot resolve the principal.", error_on_miss_continue_label: "Continue without a principal", error_on_miss_continue_description: "Allow the request to continue without resolving a principal.", configure_title: "Configure Kong Identity", configure_description: "Kong Identity uses principals to represent authenticated services or applications. Create your first principal in Kong Identity to start using principal-based authentication. On data plane nodes running versions earlier than 3.15, authentication continues using consumers.", create_principal: "Create principal", configure_learn_more: "Learn more", leave_prompt_title: "Leave this page?", leave_prompt_message: "Your unsaved changes will be lost if you continue.", leave_prompt_action: "Leave page" } }, _n = { window_type: { label: "Rate limit window type", help: "Sets the time window type to either <code>sliding</code> (default) or <code>fixed</code>.<br><ul><li>Sliding windows apply the rate limiting logic while taking into account previous hit rates (from the window that immediately precedes the current) using a dynamic weight.</li><li>Fixed windows consist of buckets that are statically assigned to a definitive time range, each request is mapped to only one fixed window based on its timestamp and will affect only that window's counters.</li></ul>", options: { fixed: "Fixed", sliding: "Sliding" } }, request_limits: { title: "Request limits", subtitle: "Set one or more limits on the number of API requests allowed within a defined timeframe.", label: "Limit", label_index: "Limit {index}", request_number: "Request number", time_interval: "Time interval", interval_determiner: "Every", seconds: "Seconds" }, error_message: { label: "Error message", code_placeholder: "Code message", message_placeholder: "Error message", help: "Set a custom error code and message to be returned when the rate limit is exceeded." }, start_with_a_use_case: "Start with a use case:", use_cases: { fixed: { hourly_500: { label: "500 requests every hour", description: "A fixed limit of 500 requests per hour resetting sharply on the hour, ensuring no user can exceed this limit." }, half_hourly_200: { label: "200 requests every 30 minutes", description: "Users are allowed 200 requests per 30 minutes, resetting exactly on the 30 minute mark with no carryover of unused limits." }, daily_500: { label: "500 requests every day", description: "A strict limit of 5000 requests per day resetting promptly at midnight, preventing any burst traffic or inconsistent user experiences." } }, sliding: { hourly_100: { label: "100 requests every hour", description: "Maximum of 100 requests every rolling hour, continuously adjusting the count over the course of the hour. No hard limit or known reset." }, half_hourly_300: { label: "300 requests every 30 minutes", description: "Each user can make up to 300 requests in any rolling 30 minute period, with older requests dropping off as new requests are made." }, hourly_500: { label: "500 requests every hour", description: `Each user is allowed 500 requests per hour.
|
|
2255
|
+
}), un = { cancel: "Cancel", view_configuration: "View configuration", create: "New plugin", create_custom: "Create", configure: "Configure", copy_id: "Copy ID", copy_json: "Copy JSON", edit: "Edit", enable: "Enable", enabled: "Enabled", disable: "Disable", delete: "Delete", disabled: "Disabled", confirm_delete: "Yes, delete", view: "View details", configure_dynamic_ordering: "Configure dynamic ordering", go_to_plugins: "Go to plugins", save: "Save", add_entity: "Add {entity}", remove_entity: "Remove {entity}", loading_spinner: "Loading..." }, cn = { title: "Configuration", message: "Export configurations for core Kong Gateway objects, like services, routes, and plugins, to either YAML, JSON, or Terraform. This allows for straightforward importing into APIOps tools like decK with YAML, Insomnia and cURL with JSON, or Terraform products with Terraform.", yaml: "YAML", terraform: "Terraform", json: "JSON", deck: "decK" }, dn = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, pn = { general: "Plugins could not be retrieved", delete: "The plugin could not be deleted at this time.", copy: "Failed to copy to clipboard", load_results: "Error loading available plugins", load_schema: "Error loading plugin schema" }, mn = { placeholder: { konnect: "Filter by name", exact: "Filter by exact instance name or ID", kongManager: "Filter by exact instance name or ID", select: "Filter plugins", search_plugins: "Search plugins", search: "Search", tags_filter: "Type part of a tag and press Enter", scope_filter: "Select a scope" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, fn = { new: "New" }, hn = /* @__PURE__ */ JSON.parse('{"title":"Plugins","list":{"toolbar_actions":{"new_plugin":"New plugin"},"table_headers":{"applied_to":"Applied to","applied_to_badges":{"consumer":"Consumer","global":"Global","route":"Route","service":"Service","consumer_group":"Consumer group"},"id":"ID","plugin":"Plugin","name":"Name","instance_name":"Instance name","scope":"Scope","status":"Status","ordering":"Ordering","ordering_badge":{"dynamic":"Dynamic","static":"Static"},"enabled":"Enabled","tags":"Tags","updated_at":"Last modified"},"empty_state":{"title":"Configure a new plugin","description":"Plugins are used to extend Kong functionality."},"empty_state_v2":{"title":"Configure your first plugin","description":"Plugins extend gateways functionalities, offering features like authentication, rate limiting, and request transformations to enhance security and performance.","create_cta":"New plugin","group":"Plugins created in gateways within this group will automatically appear here.","learn_more":"Learn more"}},"meta":{"basic-auth":{"name":"Basic Authentication","credential_name":"Basic Auth Credential","description":"Add Basic Authentication to your services"},"hmac-auth":{"name":"HMAC Authentication","credential_name":"HMAC Credential","description":"Add HMAC Authentication to your services"},"jwt-signer":{"name":"JWT Signer","description":"Verify and (re-)sign one or two tokens in a request"},"jwt":{"name":"JWT","credential_name":"JWT Credential","description":"Verify and authenticate JSON Web Tokens"},"key-auth":{"name":"Key Authentication","credential_name":"Key Auth Credential","description":"Add key authentication to your services"},"key-auth-enc":{"name":"Key Authentication Encrypted","credential_name":"Key Auth Encrypted","description":"Add key authentication to your services with an encrypted token"},"ldap-auth-advanced":{"name":"LDAP Authentication Advanced","description":"Integrate Kong with a LDAP server"},"ldap-auth":{"name":"LDAP Authentication","description":"Integrate Kong with a LDAP server"},"oauth2-introspection":{"name":"OAuth 2.0 Introspection","description":"Integrate Kong with a third-party OAuth 2.0 Authorization Server"},"oauth2":{"name":"OAuth 2.0 Authentication","credential_name":"OAuth 2.0 Application","description":"Add OAuth 2.0 authentication to your services"},"openid-connect":{"name":"OpenID Connect","description":"Integrate Kong with a third-party OpenID Connect 1.0 provider"},"mtls-auth":{"name":"Mutual TLS Authentication","description":"Secure routes and services with client certificate and mutual TLS authentication"},"vault-auth":{"name":"Vault Authentication","description":"Secure routes and services with an access token and secret token, stored securely via Vault"},"bot-detection":{"name":"Bot Detection","description":"Detect and clock bots or custom clients"},"cors":{"name":"CORS","description":"Allow developers to make requests from the browser"},"ip-restriction":{"name":"IP Restriction","description":"Whitelist or blacklist IPs that can make requests"},"opa":{"name":"OPA","description":"Authorize requests against Open Policy Agent"},"kubernetes-sidecar-injector":{"name":"Kubernetes Sidecar Injector","description":"This plugin will inject Kong dataplane nodes and form a service mesh on top of Kubernetes"},"request-validator":{"name":"Request Validator","description":"Validate requests before they reach their upstream service."},"acl":{"name":"ACL","credential_name":"Access Control Group","description":"Control which consumers can access services"},"canary":{"name":"Canary Release","description":"Methodically roll out software changes to a subset of users"},"forward-proxy":{"name":"Forward Proxy","description":"Allow Kong to connect to intermediary transparent HTTP proxies"},"proxy-cache":{"name":"Proxy Caching","description":"Cache and serve commonly requested responses in Kong"},"proxy-cache-advanced":{"name":"Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"graphql-proxy-cache-advanced":{"name":"GraphQL Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"rate-limiting-advanced":{"name":"Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"rate-limiting":{"name":"Rate Limiting","description":"Rate-limit how many HTTP requests a developer can make"},"graphql-rate-limiting-advanced":{"name":"GraphQL Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"mocking":{"name":"Mocking","description":"Provide mock endpoints to test your APIs in development against your services"},"request-size-limiting":{"name":"Request Size Limiting","description":"Block requests with bodies greater than a specific size"},"request-termination":{"name":"Request Termination","description":"Terminate all requests with a specific response"},"response-ratelimiting":{"name":"Response Rate Limiting","description":"Rate-Limiting based on a custom response header value"},"route-by-header":{"name":"Route by Header","description":"Route requests based on request headers"},"ai-proxy":{"name":"AI Proxy","description":"Directly call a configured LLM, with mediated security and tuning parameters, and using standardised Kong request and response formats."},"ai-prompt-decorator":{"name":"AI Prompt Decorator","description":"Prepend and append chat prompts to AI Proxy plugin LLM requests."},"ai-prompt-template":{"name":"AI Prompt Template","description":"Define a set of templates, containing string variable placeholders, that can be consumed by users when used with the AI Proxy plugin."},"ai-prompt-guard":{"name":"AI Prompt Guard","description":"Define a set of valid, and a set of invalid, regular expression patterns when calling LLM models with the AI Proxy plugin."},"ai-request-transformer":{"name":"AI Request Transformer","description":"Use an LLM to transform API request from a user, before sending to the upstream service."},"ai-response-transformer":{"name":"AI Response Transformer","description":"Use an LLM to transform API responses from the upstream service, before returning to the user."},"ai-rate-limiting-advanced":{"name":"AI Rate Limiting Advanced","description":"Provides rate limiting for the providers used by any AI plugins."},"ai-azure-content-safety":{"name":"AI Azure Content Safety","description":"Allows checking and auditing of AI-Proxy plugin messages, using Azure Cognitive Services, before proxying to upstream large-language model."},"aws-lambda":{"name":"AWS Lambda","description":"Invoke and manage AWS Lambda functions from Kong"},"azure-functions":{"name":"Azure Functions","description":"Invoke Azure functions"},"openwhisk":{"name":"OpenWhisk","description":"Invoke and manage OpenWhisk actions from Kong"},"pre-function":{"name":"Kong Functions (Pre-Plugins)","description":"Add and manage custom lua functions to run before other plugins"},"post-function":{"name":"Kong Functions (Post-Plugins)","description":"Add and manage custom lua functions to run after other plugins"},"datadog":{"name":"Datadog","description":"Visualize metrics on Datadog"},"prometheus":{"name":"Prometheus","description":"Export performance metrics to Prometheus"},"zipkin":{"name":"Zipkin","description":"Propagate zipkin spans and report spans to a zipkin server"},"collector":{"name":"Collector","description":"Automate spec-driven development & anomaly detection (Early Access)"},"response-transformer-advanced":{"name":"Response Transformer Advanced","description":"Transform the response sent by the upstream server on the fly on Kong, before returning the response to the client."},"correlation-id":{"name":"Correlation ID","description":"Correlate requests and responses using a unique ID"},"request-transformer-advanced":{"name":"Request Transformer Advanced","description":"Use powerful regular expressions, variables and templates to transform API requests"},"request-transformer":{"name":"Request Transformer","description":"Modify the request before hitting the upstream server"},"response-transformer":{"name":"Response Transformer","description":"Modify the upstream response before returning it to the client"},"route-transformer-advanced":{"name":"Route Transformer Advanced","description":"Transforms the routing on the fly in Kong, changing the upstream server/port/path to hit"},"kafka-upstream":{"name":"Kafka Upstream","description":"Transform requests into Kafka messages in a topic"},"degraphql":{"name":"DeGraphQL","description":"Transform a GraphQL upstream into a REST API"},"exit-transformer":{"name":"Exit Transformer","description":"Customize Kong exit responses sent downstream"},"jq":{"name":"jq","description":"Transform JSON objects included in API requests or responses using jq programs"},"file-log":{"name":"File Log","description":"Append request and response data to a log file on disk"},"http-log":{"name":"HTTP Log","description":"Send request and response logs to an HTTP server"},"loggly":{"name":"Loggly","description":"Send request and response logs to Loggly"},"statsd-advanced":{"name":"StatsD Advanced","description":"Send traffic and Kong performance metrics to StatsD"},"statsd":{"name":"StatsD","description":"Send request and response logs to StatsD"},"syslog":{"name":"Syslog","description":"Send request and response logs to Syslog"},"tcp-log":{"name":"TCP Log","description":"Send request and response logs to a TCP server"},"udp-log":{"name":"UDP Log","description":"Send request and response logs to a UDP server"},"kafka-log":{"name":"Kafka Log","description":"Publish request and response logs to a Kafka topic"},"session":{"name":"Session","description":"Sessions for Kong authentication"},"upstream-tls":{"name":"Upstream TLS","description":"Enable TLS on upstream traffic by providing Kong with a list of trusted certificates."},"application-registration":{"name":"Portal Application Registration","description":"Allow portal developers to register applications against services"},"konnect-application-auth":{"name":"Konnect Application Auth","description":"Allow Konnect portal developers to register applications against services"},"acme":{"name":"ACME","description":"Let\'s Encrypt and ACMEv2 integration with Kong"},"grpc-gateway":{"name":"gRPC Gateway","description":"Access gRPC services through HTTP REST"},"grpc-web":{"name":"gRPC Web","description":"Allow browser clients to call gRPC services"},"upstream-timeout":{"name":"Upstream Timeout","description":"Configure read, send and connect timeouts to an upstream"},"opentelemetry":{"name":"OpenTelemetry","description":"Propagate distributed tracing spans and report low-level spans to a OTLP-compatible server"},"websocket-validator":{"name":"WebSocket Validator","description":"Validate individual WebSocket messages against to a user-specified schema before proxying them"},"websocket-size-limit":{"name":"WebSocket Size Limit","description":"Allows operators to specify a maximum size for incoming WebSocket messages"},"tls-metadata-headers":{"name":"TLS Metadata Headers","description":"Detects client certificates in requests, retrieves the TLS metadata, and proxies this metadata via HTTP headers"},"tls-handshake-modifier":{"name":"TLS Handshake Modifier","description":"Requests the client certificate and if it exists, makes it available to other plugins acting on the request"},"oas-validation":{"name":"OAS Validation","description":"Validate HTTP requests and responses based on an API specification."},"jwe-decrypt":{"name":"Kong JWE Decrypt","description":"The Kong JWE Decrypt plugin makes it possible to decrypt an inbound token(JWE) in a request."},"xml-threat-protection":{"name":"XML Threat Protection","description":"Reduce the risk of XML attacks by checking the structure of XML payloads."},"saml":{"name":"SAML","description":"Security Assertion Markup Language (SAML) is an open standard for exchanging authentication and authorization data between an identity provider and a service provider."},"app-dynamics":{"name":"AppDynamics","description":"This plugin integrates Kong with the AppDynamics APM platform so that proxy requests handled by Kong can be identified and analyzed in AppDynamics."},"json-threat-protection":{"name":"JSON Threat Protection","description":"Apply size checks on JSON payload and minimize risk of content-level attacks"},"standard-webhooks":{"name":"Standard Webhooks","description":"Validate incoming webhooks adhere to the Standard Webhooks specification, to which Kong is a contributor"},"ai-proxy-advanced":{"name":"AI Proxy Advanced","description":"Route across different LLMs and models using advanced load balancing algorithms, including semantic routing."},"ai-semantic-cache":{"name":"AI Semantic Cache","description":"Semantically cache AI requests to any LLM to reduce latency, improve end-user experiences and optimize GenAI costs."},"ai-semantic-prompt-guard":{"name":"AI Semantic Prompt Guard","description":"Semantically and intelligently create allow and deny lists of topics that can be requested across every LLM."},"header-cert-auth":{"name":"Header Certificate Authentication","description":"Authenticate clients with MTLS certificate passed in header by a WAF or load balancer"},"upstream-oauth":{"name":"Upstream OAuth","description":"Configure Kong to obtain a OAuth2 token to consume an upstream API"},"confluent":{"name":"Confluent","description":"Streamlines integration with Confluent Cloud and transforms requests into messages published to a Confluent topic."},"service-protection":{"name":"Service Protection","description":"Prevent abuse and protect services with absolute limits on the number of requests reaching the service."},"injection-protection":{"name":"Injection Protection","description":"Protect against injection attacks by rejecting requests that match common injections patterns."},"redirect":{"name":"Redirect","description":"Redirect incoming requests to a new URL"},"kafka-consume":{"name":"Kafka Consume","description":"Consume messages from Kafka topics over HTTP protocols."},"confluent-consume":{"name":"Confluent Consume","description":"Consume messages from Confluent Kafka topics over HTTP protocols"},"request-callout":{"name":"Request Callout","description":"Callout to third party APIs as part of request processing."},"ai-sanitizer":{"name":"AI Sanitizer","description":"Sanitize personal or sensitive information from prompts before sending to LLM."},"ai-rag-injector":{"name":"AI RAG Injector","description":"Attach contextual knowledge from vector databases with flexible template to LLM prompts."},"datakit":{"name":"Datakit","description":"Datakit is a workflow engine for working with external APIs."},"ai-prompt-compressor":{"name":"AI Prompt Compressor","description":"The AI Prompt Compressor reduces costs associated with LLMs by compressing prompts."},"solace-upstream":{"name":"Solace Upstream","description":"Transform requests into Solace messages in a Solace queue or topic."},"ai-aws-guardrails":{"name":"AI AWS GuardRails","description":"The AI AWS GuardRails enables enforcement of introspection with the AWS GuardRails service for all requests processed by the AI Proxy plugin."},"ace":{"name":"Konnect Access Control Enforcement","description":"Enable Developer Self-Service for Konnect Dev Portals."},"solace-consume":{"name":"Solace Consume","description":"Consume messages from Solace and make them available through HTTP endpoints."},"solace-log":{"name":"Solace Log","description":"Publish request and response logs to a Solace topic."},"ai-llm-as-judge":{"name":"AI LLM Judge","description":"Evaluate LLM responses with an external LLM service and use accuracy scores to drive dynamic load balancing for `llm/v1/chat` requests."},"ai-mcp-proxy":{"name":"AI MCP Proxy","description":"Convert APIs into MCP tools, proxy MCP servers, expose multiple MCP tools, and observe MCP traffic in real time."},"ai-gcp-model-armor":{"name":"AI GCP Model Armor","description":"Audit and validate AI Proxy messages with Google Cloud Model Armor before forwarding them to an upstream LLM."},"ai-mcp-oauth2":{"name":"AI MCP OAuth2","description":"Secure MCP server access with OAuth2 authentication."},"ai-semantic-response-guard":{"name":"AI Semantic Response Guard","description":"Permit or block prompts based on semantic similarity to known LLM responses, preventing misuse of `llm/v1/chat` or `llm/v1/completions` requests."},"ai-lakera-guard":{"name":"AI Lakera Guard","description":"Audit and enforce safety policies on LLM requests and responses using the AI AWS Lakera plugin before they reach upstream LLMs."},"ai-a2a-proxy":{"name":"AI A2A Proxy","description":"Securely proxy A2A agents, with real-time RPC tracing and monitoring."},"ai-custom-guardrail":{"name":"AI Custom Guardrail","description":"Integrate with any 3rd-party Guardrail service, with customizable enforcement modes — choose whether violations block, log, or allow traffic to proceed."},"metering-and-billing":{"name":"Metering & Billing","description":"Meter API requests and AI token usage for usage-based billing. Supports flexible customer identification, custom pricing dimensions, and fine-grained traffic filtering. Integrates natively with Konnect Metering & Billing."},"governance":{"name":"Governance","description":"Enforce feature-level access control and credit-balance gating for API consumers. Integrates with Konnect Metering & Billing to allow or deny requests based on customer entitlements."}},"fields":{"service":"Service ID","route":"Route ID","consumer":"Consumer ID","consumer_group":"Consumer group ID"},"select":{"custom_badge_text":"This plugin is data plane node specific","cloned_from_badge":"Cloned from {link}","installed_custom_badge":"Installed custom","streamed_custom_badge":"Streamed custom","unavailable_tooltip":"This plugin is not available","already_exists":"This plugin is already applied to this resource","misc_plugins":"Other plugins","show_all":"Show all","view_more":"View more","view_less":"View less","filter":{"title":"Filter plugins","featured":"Featured","type":"Type","clear":"Clear"},"list":{"table_headers":{"name":"Plugin","description":"Description"}},"tabs":{"kong":{"title":"Kong plugins","description":"Kong plugins are bundled by default with Kong Gateway and are available across all control planes.","empty_title":"No plugins","empty_description":"No plugins are available."},"custom":{"title":"Custom plugins","description":"Custom plugins will be available in this control plane only.","disabled_tooltip":"Custom plugins are not available with this gateway. Create a hybrid or dedicated cloud gateway to leverage custom plugins.","fetch_error":"Unable to load some custom plugins. Bundled plugins are still available.","license_required":"Plugin cloning requires a license to be used.","empty_title":"No custom plugins","empty_description":"No custom plugins have been added to this control plane.","create":{"name":"Custom plugin","description":"Upload schema file to create custom plugin"}}},"highlighted_plugins":{"title":"Highlighted plugins"}},"form":{"button_deck_customize":"Customize before copying to CLI","disable_data_retrieving":"You do not have permission to select {scope}","disable_source_scope_change":"Changing the {scope} is not allowed when configuring a plugin under it","no_selection":"No selection...","fields":{"enabled":{"label":"Enabled","on_text":"This plugin is enabled","off_text":"This plugin is disabled"},"plugin_status":{"label":"Plugin status","text_on":"Enabled","text_off":"Disabled"},"instance_name":{"label":"Name","placeholder":"Enter a unique name","help":"A custom name for this plugin instance to help with identifying from the list view."},"condition":{"label":"Execution condition","placeholder":"Enter an expression","tooltip":"An expression used for conditional control over plugin execution. If the expression evaluates to true during the request flow, the plugin is executed; otherwise, it is skipped.","help":{"learn":"Learn more","about":"{link} about plugin conditions."}},"protocols":{"label":"Protocols","placeholder":"Select valid protocols for the plugin","placeholderWithDefaultValues":"Select valid protocols for the plugin. Default protocols: {protocols}","help":"A list of the request protocols that will trigger this plugin. The default value, as well as the possible values allowed on this field, may change depending on the plugin type."},"tags":{"label":"Tags","help":"An optional set of strings for grouping and filtering, separated by commas.","placeholder":"Tag1, Tag2, Tag3"}},"scoping":{"label":"Scoped","placeholder":"Search by name or UUID","disable_global_radio":"The plugin is set to \'scoped\' by default. To apply a plugin globally, please navigate to the global plugin list page.","global":{"label":"Global","help":"All services, routes, and consumers"},"gateway_service":{"label":"Select a gateway service","help":"The gateway service to which this plugin configuration will apply","placeholder":"Select a gateway service","plural":"Gateway services"},"route":{"label":"Select a route","help":"The route that this plugin configuration will target","placeholder":"Select a route","plural":"Routes"},"consumer":{"label":"Select a consumer","help":"The consumer that this plugin configuration will target","placeholder":"Select a consumer","plural":"Consumers"},"consumer_group":{"label":"Select a consumer group","help":"The consumer group that this plugin configuration will target","placeholder":"Select a consumer group","plural":"Consumer groups"}},"grouping":{"plugin_configuration":{"title":"Plugin configuration","description":"Configuration parameters for this plugin. View advanced parameters for extended configuration.","empty":"This plugin does not have required parameters."},"advanced_parameters":{"view":"Show additional settings","hide":"Hide additional settings"}},"field_rules":{"at_least_one_of":"At least one of the following values is required: {parameters}.","only_one_of":"Exactly one of these parameters is required: {parameters}","mutually_required":"These values must be used together: {parameters}.","mutually_exclusive":"Only one of these values can be used: {parameters}.","only_one_of_mutually_required":"Exactly one of the following parameter combinations is required (all parameters within a chosen combination are required):"},"sections":{"plugin_scope":{"title":"Plugin scope","description":"Choose whether this plugin applies to all traffic (global) or is scoped to a specific service, route, or consumer."},"general_info":{"title":"General information","description":"Add details to help identify and manage your plugin."},"plugin_config":{"title":"Plugin configuration","description":"Set the plugin\'s behavior by defining its configuration settings."},"plugin_general_info":{"description":"Add a name or tags to help you identify and manage this plugin later."},"code_mode":{"title":"Code editor","description":"Configure this plugin by using YAML configuration."}}},"free-form":{"editor_mode":{"visual":"Visual editor","code":"Code editor"},"code-lens":{"entity":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","certificate":"Certificate"},"field":{"name":"{entity} \\"{value}\\"","username":"Username \\"{value}\\"","custom_id":"Custom ID \\"{value}\\"","subject":"Subject \\"{value}\\"","expires_after":"Expires after \\"{value}\\""},"action":{"view_entity":"View {title}","copy_certificate":"Copy certificate","copy_uuid":"Copy UUID","retry_fetch":"Retry fetch (Hover for details)"},"unknown_error":"Unknown error"},"acl":{"mode":{"allow":"Use allow list","deny":"Use deny list"}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"request-callout":{"entity_name":"Request callout","by_lua_placeholder":"Enter Lua script here..."},"jwt-signer":{"keyset_url_required":"Provide a valid HTTP/HTTPS URL to ensure signing works correctly when \\"{signingField}\\" is enabled and \\"{headerField}\\" is set."},"metering-and-billing":{"sections":{"plugin_config":{"title":"Plugin configuration","description":"Configure the Metering & Billing plugin."},"metering":{"title":"What to meter"},"subject":{"title":"Who to bill (subject)","description":"Define how billing subjects are identified."},"ingestion":{"title":"Connection","description":"Configure how metered data is delivered to the billing service."},"queue":{"title":"Queue","description":"Configure internal event queue settings."}},"fields":{"meter_api_requests":{"label":"Meter API requests","description":"Emit a usage event for each API Gateway request."},"meter_ai_token_usage":{"label":"Meter AI token usage","description":"Emit events for LLM input and output tokens on AI Gateway requests. Each request produces separate input/output events so they can be priced independently."},"ingest_endpoint":{"description":"The URL of the metering data ingest endpoint.","help":"For Konnect Metering & Billing, use the regional endpoint from your Metering & Billing settings. For self-hosted OpenMeter, use your ingest URL."},"api_token":{"description":"Bearer token for authenticating requests to the ingest endpoint."},"look_up_value_in":{"label":"Look up subject in","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"e.g. x-customer-id, x-api-key, x-tenant"},"queue":{"max_coalescing_delay":{"label":"Max coalescing delay (s)"},"initial_retry_delay":{"label":"Initial retry delay (s)"},"max_retry_delay":{"label":"Max retry delay (s)"},"max_retry_time":{"label":"Max retry time (s)"}},"attributes":{"title":"Event attributes","description":"Attach custom dimensions to metered events.","look_up_value_in":{"placeholder":"e.g., x-priority-id"},"event_property_name":{"placeholder":"e.g., priority"}},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"}}},"governance":{"sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Governance plugin subject, feature, and connection settings."},"governance":{"title":"Governance settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to govern (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the governance query endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to govern (Look up subject in)","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"Name of the header or query parameter that carries the customer identifier."},"feature_key":{"label":"Feature to govern access","help":"Feature that will control access to the scope where the plugin is applied.","metered_badge":"Metered feature","load_error":"Could not load features from the governance service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing Query Governance Access. For self-hosted OpenMeter, use the Query Governance Access endpoint of your self-hosted instance."},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"},"sync_rate":{"label":"Sync rate (s)"},"refresh_interval":{"label":"Refresh interval (s)"},"max_stale_seconds":{"label":"Max stale seconds"},"l1_ttl":{"label":"L1 TTL (s)"},"l2_ttl":{"label":"L2 TTL (s)"},"credit_balance_required":{"label":"Credit balance lookup","yes_label":"Yes","yes_description":"A credit balance above zero is required for access to this feature.","no_label":"No","no_description":"Customers can access this feature regardless of their credit balance."},"fail_policy":{"label":"Plugin failure mode","allow_label":"Allow access","allow_description":"In the case of plugin failure, allow access to feature.","deny_label":"Deny access","deny_description":"In the case of plugin failure, deny access to feature."},"deny_unknown_customers":{"label":"Unknown customer access","allow_label":"Allow access","allow_description":"The gateway will allow access for unknown customers.","deny_label":"Deny access","deny_description":"The gateway will deny access for unknown customers."},"response":{"label":"Response mapping","columns":{"code":"Response code","status":"Status code","message":"Message"},"defaults":{"NO_CREDIT_AVAILABLE":"Customer has no credit available.","USAGE_LIMIT_REACHED":"Customer has reached usage limit for feature.","FEATURE_UNAVAILABLE":"Feature is not available for the customer.","FEATURE_NOT_FOUND":"Feature not found.","CUSTOMER_NOT_FOUND":"Customer is not found by subject."}}}},"datakit":{"plugin_config":{"title":"Flow editor"},"description_code":"Configure this plugin by using YAML configuration. If you are copy/pasting in examples from the documentation - paste from below the <code>config</code> block.","description_flow":"Build flows visually with a drag-and-drop editor for Datakit. Visualize node connections, inputs, and outputs as you design.","description_example":"Start with a use case:","detected_config_format":"Detected {format} configuration. Do you want to convert it to Datakit configuration?","detected_config_format_title":"Convert configuration","detected_config_format_confirm":"Convert","examples":{"authenticateThirdPartyWithDynamicUrl":"Authenticate Kong to a third-party service resolved at runtime","authenticateThirdParty":"Authenticate Kong to a third-party service","authenticateWithVaultSecret":"Authenticate to a third-party service using Vault secrets","clearHeaders":"Clear request headers","combineTwoApisIntoOneResponse":"Combine multiple API responses","conditionallyStoreCachedItems":"Conditionally fetch or store cache data","convertJsonIntoXml":"Transform JSON into XML","convertJsonToXmlAndBack":"Transform JSON into XML and back","convertXmlIntoJson":"Transform XML into JSON","manipulateRequestHeaders":"Manipulate request headers"},"flow_editor":{"mode":"Flow editor","name":"Datakit flow editor","cta":"Go to flow editor","disabled_tooltip":"The flow editor is unavailable due to critical configuration errors or features not supported in the flow editor:<br/><code>{reason}</code>","expand_panel":"Expand panel","collapse_panel":"Collapse panel","return_to_config":"Return to plugin configuration","canvas_panel":{"request":"Request","response":"Response","node_count_plural":"{count} nodes","node_count_singular":"1 node"},"panel_segments":{"nodes":"Nodes","resources":{"title":"Resources","vault":{"title":"Vault secrets","add_button":"Add vault resource","name_exists_error":"Vault name already exists","name_required_error":"Vault name is required","edit":"Edit","delete":"Delete"},"cache":{"title":"Cache configuration","add_button":"Add cache configuration","strategy_options":{"memory":"Memory","redis":"Redis"},"select_redis_configuration":"Select a shared Redis configuration","inline_config":"Inline config","inline_config_preview":"You are using a dedicated Redis configuration, This is a preview of your current setup, please edit it in code editor"}}},"vault_secret_picker":{"title":"Add secret to Datakit","proceed_button_text":"Add secret","secret_name":{"label":"Secret name","placeholder":"Enter a name","help":"A unique identifier for this secret in your Datakit configuration"}},"node_panel":{"title":"Node types","description":"Drag a node onto the canvas to add it to your data flow.","groups":{"external_interaction":"External interaction","control_flow":"Control flow","data_transformation":"Data transformation","data_value":"Data value","authentication":"Authentication"}},"examples":"Examples","debug":{"label":"Debug","description":"Enables detailed error messages in client responses, making debugging easier. <a href=\\"https://developer.konghq.com/plugins/datakit/#debugging\\" target=\\"_blank\\">See the docs</a> for details."},"actions":{"zoom_in":"Zoom in","zoom_out":"Zoom out","fit_view":"Zoom to fit","auto_layout":"Auto layout","undo":"Undo","redo":"Redo","duplicate":"Duplicate","remove_from_branch":"Remove from branch","delete":"Delete","view_docs":"View docs","done":"Done"},"node_types":{"call":{"summary":"Call a third-party API","description":"Send an HTTP request and retrieve the response."},"jq":{"summary":"Transform data and cast variables with jq","description":"The <code>jq</code> node executes a jq script for processing JSON. See the official <a href=\\"https://jqlang.org\\" target=\\"_blank\\">jq docs</a> for more details."},"exit":{"summary":"Return directly to the client","description":"Trigger an early exit that produces a direct response, rather than forwarding a proxied response."},"property":{"summary":"Get and set Kong Gateway-specific data","description":"Get and set Kong Gateway host and request properties."},"static":{"summary":"Configure static input values ahead of time","description":"Emits static values to be used as inputs for other nodes. The <code>static</code> node can help you with hardcoding some known value for an input."},"branch":{"summary":"Execute nodes based on matching input conditions","description":"Execute different nodes based on matching input conditions, such as a cache hit or miss."},"cache":{"summary":"Store and fetch cached data","description":"Store data into cache and fetch cached data from cache."},"xml_to_json":{"summary":"Transform XML to JSON","description":"Transform XML to JSON."},"json_to_xml":{"summary":"Transform JSON to XML","description":"Transform JSON to XML."},"jwt_decode":{"summary":"Decode JWT headers and claims","description":"Parse a JWT without verifying its signature."},"jwt_sign":{"summary":"Create and sign JWTs","description":"Generate a signed JWT from configured claims and a signing key."},"jwt_verify":{"summary":"Verify JWT signature and claims","description":"Verify a JWT signature and validate claims such as exp, nbf, iss, and aud."},"request":{"name":"request","description":"Reads incoming client request properties. You cannot specify request node input."},"response":{"name":"response","description":"Updates properties of the outgoing client response."},"service_request":{"name":"service request","description":"Updates properties of the request sent to the service being proxied to."},"service_response":{"name":"service response","description":"Reads response properties from the service being proxied to."},"vault":{"name":"Vault","description":"Vault is a tool for securely accessing secrets."}},"node_properties":{"name":"Name","configuration":"Configuration","input":{"label":"Inputs configuration","placeholder":"Select a source","add_button":"Add an input","or":"or","input":"Input","fields":"Fields","source":"Source","tooltip":"Fields are part of the node input. A source can connect to either the fields or the input, but not both."},"input_name":{"label":"Input name","placeholder":"Enter an input name"},"jq":{"label":"jq script","help":"Refer to {link} for full documentation."},"output_value":{"label":"Output value","value_name":"Value name","value":"Value","add_button":"Add a value"},"property":{"get":"get","set":"set"},"branch":{"placeholder":"Select nodes"},"jwt":{"static_claims":{"label":"Static claims","help":"Enter a JSON object. It will be stored as the node\'s static claims map.","errors":{"invalid_json_object":"Static claims must be a valid JSON object"}}},"errors":{"invalid_identifier_format":"{fieldName} must start with a letter or underscore and contain only letters, numbers, underscores, or hyphens","invalid_url_format":"Not a valid URL format","not_empty":"{fieldName} is required","not_float":"{fieldName} must be a float","not_integer":"{fieldName} must be an integer","not_number":"{fieldName} must be a number","not_unique":"{fieldName} must be unique","number_range":"{fieldName} must be between {min} and {max}","string_len_range":"{fieldName} must be between {minLength} and {maxLength} characters","reserved_node_name":"\\"{nodeName}\\" is a reserved node name","attributes_required":"Provide at least one of attributes_block_name or attributes_name_prefix"}},"error":{"invalid_connection":"Invalid connection","branch_cycle":"Cannot create a circular branch relationship"},"confirm":{"title":"Connection conflict","message":{"confirm":"Are you sure you want to make this change?","switch":"You can connect an output source to either all inputs of a node or to individual inputs.","override":"Each input can connect to only one output, but one output can connect to many inputs.","branch_replace":"This node already belongs to another branch. Move it to the new branch?"},"proceed":"Yes, update"},"leave_confirm":"Leave current page? Changes you made may not be saved."},"code_editor":{"mode":"Code editor"}},"vault_picker":{"component_error":"The vault secret picker is not available"},"tag_helper":"Use comma to separate values. eg: value1, value2","foreign_placeholder":"Enter a UUID of {entity}"}}'), gn = { title: "Redis configuration", managed_ui: { title: "Redis", shared_configuration: { label: "Use shared configuration", description: "Select an existing shared Redis configuration or create a new one. Any updates to this configuration will automatically apply to all associated plugins.", badge: "Recommended" }, dedicated_configuration: { label: "Use locally-scoped configuration", description: "Create and use a Redis configuration specifically for this plugin." }, selector: { placeholder: "Filter Redis configurations...", create_new: "New Redis" } }, shared_configuration: { label: "Shared configuration", description: "Select an existing shared Redis configuration or create a new one. Changes to this configuration automatically apply to all associated plugins.", title: "Shared Redis configuration", error: "Fetching shared Redis configurations failed." }, dedicated_configuration: { label: "Dedicated configuration", description: "Create a Redis configuration that is used only by this plugin. Changes won’t affect other plugins." }, config_card: { common_fields: { created_at_label: "Created at", updated_at_label: "Last updated at", type_label: "Redis type" } } }, yn = { plugin: "plugin" }, vn = { key_auth_identity_realms: { cp_label: "Current control plane", cp_group_label: "Control plane", realm_group_label: "Realms (can only select one)" }, kong_identity: { title: "Who should manage authentication and credentials?", description_with_realms: "Use Consumers or centrally managed consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", description_without_realms: "Use Consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", learn_more: "Learn more.", incompatible_data_plane_alert: "We detected that one or more data plane nodes are running a version earlier than 3.15. Requests handled by those data plane nodes will use consumers instead of Kong Identity principals.", kong_identity_label: "Kong Identity", kong_identity_description_key_auth: "Use Kong Identity to authenticate API keys and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", kong_identity_description_basic_auth: "Use Kong Identity to authenticate Basic Auth credentials and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", consumers_label: "Consumers", consumers_description_key_auth: "Use consumer-managed API keys. Consumers provide their API key in a request header, query parameter, or request body to authenticate requests.", consumers_description_basic_auth: "Use consumer-managed Basic Auth credentials. Consumers authenticate requests using a username and password.", centrally_managed_label: "Centrally managed consumers", centrally_managed_description: "Authenticate centrally managed consumers in Konnect using identity realms. Identity realms are scoped to the control plane by default.", identity_realms_required: "To use centrally managed consumers, you must select at least one Centrally managed consumer realm.", error_on_miss_label: "If principal lookup fails", error_on_miss_reject_label: "Reject the request", error_on_miss_reject_description: "Treat the request as unauthenticated if Kong Identity cannot resolve the principal.", error_on_miss_continue_label: "Continue without a principal", error_on_miss_continue_description: "Allow the request to continue without resolving a principal.", configure_title: "Configure Kong Identity", configure_description: "Kong Identity uses principals to represent authenticated services or applications. Create your first principal in Kong Identity to start using principal-based authentication. On data plane nodes running versions earlier than 3.15, authentication continues using consumers.", create_principal: "Create principal", configure_learn_more: "Learn more", leave_prompt_title: "Leave this page?", leave_prompt_message: "Your unsaved changes will be lost if you continue.", leave_prompt_action: "Leave page" } }, bn = { window_type: { label: "Rate limit window type", help: "Sets the time window type to either <code>sliding</code> (default) or <code>fixed</code>.<br><ul><li>Sliding windows apply the rate limiting logic while taking into account previous hit rates (from the window that immediately precedes the current) using a dynamic weight.</li><li>Fixed windows consist of buckets that are statically assigned to a definitive time range, each request is mapped to only one fixed window based on its timestamp and will affect only that window's counters.</li></ul>", options: { fixed: "Fixed", sliding: "Sliding" } }, request_limits: { title: "Request limits", subtitle: "Set one or more limits on the number of API requests allowed within a defined timeframe.", label: "Limit", label_index: "Limit {index}", request_number: "Request number", time_interval: "Time interval", interval_determiner: "Every", seconds: "Seconds" }, error_message: { label: "Error message", code_placeholder: "Code message", message_placeholder: "Error message", help: "Set a custom error code and message to be returned when the rate limit is exceeded." }, start_with_a_use_case: "Start with a use case:", use_cases: { fixed: { hourly_500: { label: "500 requests every hour", description: "A fixed limit of 500 requests per hour resetting sharply on the hour, ensuring no user can exceed this limit." }, half_hourly_200: { label: "200 requests every 30 minutes", description: "Users are allowed 200 requests per 30 minutes, resetting exactly on the 30 minute mark with no carryover of unused limits." }, daily_500: { label: "500 requests every day", description: "A strict limit of 5000 requests per day resetting promptly at midnight, preventing any burst traffic or inconsistent user experiences." } }, sliding: { hourly_100: { label: "100 requests every hour", description: "Maximum of 100 requests every rolling hour, continuously adjusting the count over the course of the hour. No hard limit or known reset." }, half_hourly_300: { label: "300 requests every 30 minutes", description: "Each user can make up to 300 requests in any rolling 30 minute period, with older requests dropping off as new requests are made." }, hourly_500: { label: "500 requests every hour", description: `Each user is allowed 500 requests per hour.
|
|
2253
2256
|
If the limit is exceeded and the user receives a 429 error, each additional request within the sliding window (hour)
|
|
2254
|
-
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } } },
|
|
2255
|
-
actions:
|
|
2256
|
-
view_configuration:
|
|
2257
|
+
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } } }, _n = { step1: { title: "Custom plugin type", types: { installed: { label: "Installed custom plugin", description: "Install and manage plugins with full control over deployment and runtime. Requires restarting data planes." }, streamed: { label: "Streamed custom plugin", description: "Deploy and update plugins on running data planes without requiring gateway access." }, cloned: { label: "Cloned plugin", description: "Duplicate an existing plugin to run multiple instances within a single request." } }, compare_trigger: "Compare deployment options", compare_table: { columns: { installed: "Installed custom plugin", streamed: "Streamed custom plugin", cloned: "Cloned plugin" }, rows: { main_use_case: { header: "Main use case", installed: "Extend Kong functionality with custom plugins and control who can modify and roll out changes.", streamed: "Extend Kong functionality with plugins without requiring sysadmin access to data plane instances.", cloned: "Modify an existing plugin to run multiple instances with different names or priorities." }, file_supplied: { header: "File supplied", installed: { handler: "handler.lua", schema: "schema.lua", additional: "Any additional files or libraries needed" }, streamed: { handler: "handler.lua", schema: "schema.lua" } }, how_installed: { header: "How it's installed", installed: "Install directly on the data plane", streamed: "Through gateway configuration changes", cloned: "Through gateway configuration changes" }, sandboxing: { header: "Sandboxing", streamed: "Follows the standard sandboxing settings. {link}", streamed_link: "Link to docs", cloned: "Inherit the same sandboxing as the original plugins" }, data_plane_reload: { header: "Data plane reload" } } } }, step2_files: { title: "Custom plugin files", schema_file: { label: "Upload schema file", placeholder: "No file selected", placeholder_edit: "File not changed", button_text: "Select File", help: "Only Lua based schemas are supported by Konnect. Other plugin modules can be in any language as desired. Learn more" }, handler_file: { label: "Upload handler file", placeholder: "No file selected", placeholder_edit: "File not changed", button_text: "Select File", help: "Upload plugin handler to the data plane." }, plugin_modules: { label: "Plugin modules", alert: "Upload all plugin modules to the data plane: schema.lua, handler.lua" } }, step2_clone: { title: "Clone plugin", select_plugin: { label: "Select a plugin", placeholder: "Type to search" } }, step3: { title: "General information", description: "Enter a custom name for this custom plugin", name: { label: "Name", placeholder: "Enter a unique name", help: "The name must be identical to the name of the plugin in the schema file." }, alias_name: { label: "Alias name", placeholder: "Enter a unique name", help: "Format: ^[a-z][a-z0-9-]*[a-z0-9]$. The name must be unique enough to avoid future conflicts with bundled plugins." }, priority: { label: "Priority", tooltip: "Set the execution priority for this cloned plugin", help: { text: "Optional. Use a number to set the absolute execution priority. If priority isn't set, plugins run in alphabetical order. {link} in the docs.", link: "Learn more" } } }, errors: { file_read_error: "Failed to read file content. Please try again.", file_too_large: "File size exceeds the maximum limit of 1 MB.", plugin_not_found: "The selected plugin could not be found. Please refresh the list and try again.", no_supported_types: "No supported custom plugin types are available in this context.", unsupported_plugin_type: "Unsupported plugin type {type}." } }, An = {
|
|
2258
|
+
actions: un,
|
|
2259
|
+
view_configuration: cn,
|
|
2257
2260
|
delete: { title: "Delete a plugin", custom_title: "Delete {name}", custom_plugin: "Custom plugin", description: "This action cannot be reversed.", description_custom: "Please ensure this plugin is not in use. This action cannot be reversed.", plugin_schema_in_use_title: "Unable to delete custom plugin", plugin_schema_in_use_message: "This custom plugin is currently in use in this control plane. Please delete any existing instances before removing this schema.", confirmModalText1: "Are you sure you want to delete", confirmModalText2: "Please ensure this plugin is not in use. This delete action cannot be reversed.", confirm_text: "Type {name} to confirm your action", success_message: "Successfully deleted custom plugin {name}" },
|
|
2258
|
-
copy:
|
|
2259
|
-
errors:
|
|
2260
|
-
search:
|
|
2261
|
-
labels:
|
|
2262
|
-
plugins:
|
|
2263
|
-
redis:
|
|
2264
|
-
glossary:
|
|
2265
|
-
custom_field:
|
|
2266
|
-
sp:
|
|
2267
|
-
custom_plugin_form:
|
|
2261
|
+
copy: dn,
|
|
2262
|
+
errors: pn,
|
|
2263
|
+
search: mn,
|
|
2264
|
+
labels: fn,
|
|
2265
|
+
plugins: hn,
|
|
2266
|
+
redis: gn,
|
|
2267
|
+
glossary: yn,
|
|
2268
|
+
custom_field: vn,
|
|
2269
|
+
sp: bn,
|
|
2270
|
+
custom_plugin_form: _n
|
|
2268
2271
|
};
|
|
2269
|
-
function
|
|
2270
|
-
const e =
|
|
2272
|
+
function wn() {
|
|
2273
|
+
const e = nt("en-us", An);
|
|
2271
2274
|
return {
|
|
2272
2275
|
i18n: e,
|
|
2273
|
-
i18nT:
|
|
2276
|
+
i18nT: it(e)
|
|
2274
2277
|
// Translation component <i18n-t>
|
|
2275
2278
|
};
|
|
2276
2279
|
}
|
|
2277
|
-
const
|
|
2280
|
+
const kn = ["data-testid"], Sn = /* @__PURE__ */ U({
|
|
2278
2281
|
__name: "SwitchField",
|
|
2279
2282
|
props: {
|
|
2280
2283
|
labelAttributes: {},
|
|
@@ -2284,78 +2287,78 @@ const Sn = ["data-testid"], Tn = /* @__PURE__ */ U({
|
|
|
2284
2287
|
name: {}
|
|
2285
2288
|
},
|
|
2286
2289
|
emits: ["update:modelValue"],
|
|
2287
|
-
setup(e, { emit:
|
|
2288
|
-
const { i18n: { t } } =
|
|
2289
|
-
|
|
2290
|
-
}, m =
|
|
2291
|
-
return (
|
|
2292
|
-
const u =
|
|
2293
|
-
return d.error ? (_(),
|
|
2290
|
+
setup(e, { emit: r }) {
|
|
2291
|
+
const { i18n: { t } } = wn(), n = se(e, ["name", "enabledText", "disabledText"]), { value: s, hide: a, emptyOrDefaultValue: c, ...d } = Y(j(() => e.name)), p = r, i = (h) => {
|
|
2292
|
+
s.value = h, p("update:modelValue", h);
|
|
2293
|
+
}, m = ne(d.path, n);
|
|
2294
|
+
return (h, l) => {
|
|
2295
|
+
const u = F("KAlert");
|
|
2296
|
+
return d.error ? (_(), I(u, {
|
|
2294
2297
|
key: 0,
|
|
2295
2298
|
appearance: "danger",
|
|
2296
2299
|
message: d.error.message
|
|
2297
|
-
}, null, 8, ["message"])) :
|
|
2300
|
+
}, null, 8, ["message"])) : G((_(), K("div", {
|
|
2298
2301
|
key: 1,
|
|
2299
2302
|
class: "ff-switch-field",
|
|
2300
2303
|
"data-testid": `ff-${d.path.value}`
|
|
2301
2304
|
}, [
|
|
2302
|
-
|
|
2303
|
-
"model-value": !!(o(
|
|
2305
|
+
V(o(jt), z(o(m), {
|
|
2306
|
+
"model-value": !!(o(s) == null ? o(c) : o(s)),
|
|
2304
2307
|
"onUpdate:modelValue": i
|
|
2305
2308
|
}), {
|
|
2306
|
-
label:
|
|
2307
|
-
pe(ce(o(
|
|
2309
|
+
label: x(() => [
|
|
2310
|
+
pe(ce(o(s) ? e.enabledText || o(t)("actions.enabled") : e.disabledText || o(t)("actions.disabled")), 1)
|
|
2308
2311
|
]),
|
|
2309
2312
|
_: 1
|
|
2310
2313
|
}, 16, ["model-value"])
|
|
2311
|
-
], 8,
|
|
2312
|
-
[
|
|
2314
|
+
], 8, kn)), [
|
|
2315
|
+
[J, !o(a)]
|
|
2313
2316
|
]);
|
|
2314
2317
|
};
|
|
2315
2318
|
}
|
|
2316
|
-
}),
|
|
2319
|
+
}), On = /* @__PURE__ */ H(Sn, [["__scopeId", "data-v-0b4c3942"]]);
|
|
2317
2320
|
export {
|
|
2318
|
-
|
|
2319
|
-
|
|
2321
|
+
Ia as ArrayField,
|
|
2322
|
+
ya as BooleanField,
|
|
2320
2323
|
Se as EnumField,
|
|
2321
|
-
|
|
2324
|
+
Ge as FIELD_PATH_KEY,
|
|
2322
2325
|
ke as FIELD_RENDERERS,
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2326
|
+
Oe as FIELD_RENDERER_SLOTS,
|
|
2327
|
+
Je as FIELD_RESET_LABEL_PATH_SETTING,
|
|
2328
|
+
ge as Field,
|
|
2329
|
+
En as FieldRenderer,
|
|
2330
|
+
tn as ForeignField,
|
|
2331
|
+
jn as Form,
|
|
2332
|
+
Qa as JsonField,
|
|
2333
|
+
ln as MapField,
|
|
2334
|
+
Ha as NumberField,
|
|
2335
|
+
Ba as ObjectField,
|
|
2336
|
+
ht as StringArrayField,
|
|
2337
|
+
ft as StringField,
|
|
2338
|
+
On as SwitchField,
|
|
2339
|
+
Ut as buildAncestor,
|
|
2337
2340
|
qe as buildArraySchemaMap,
|
|
2338
2341
|
Me as buildMapSchemaMap,
|
|
2339
2342
|
Le as buildRecordSchemaMap,
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2343
|
+
zt as buildSchemaMap,
|
|
2344
|
+
mt as defaultLabelFormatter,
|
|
2345
|
+
he as generalizePath,
|
|
2346
|
+
ta as provideFormShared,
|
|
2347
|
+
Vn as renderRuleExactMatch,
|
|
2348
|
+
dt as replaceByDictionary,
|
|
2349
|
+
pt as replaceByDictionaryInFieldName,
|
|
2350
|
+
Y as useField,
|
|
2351
|
+
ut as useFieldAncestors,
|
|
2352
|
+
ne as useFieldAttrs,
|
|
2353
|
+
la as useFieldLabel,
|
|
2354
|
+
ct as useFieldPath,
|
|
2355
|
+
na as useFieldRenderer,
|
|
2356
|
+
ia as useFormData,
|
|
2357
|
+
ae as useFormShared,
|
|
2358
|
+
oa as useItemKeys,
|
|
2359
|
+
sa as useLabelPath,
|
|
2360
|
+
ua as useMapField,
|
|
2361
|
+
aa as useOptionalFormShared,
|
|
2362
|
+
Kn as useSchemaExposer,
|
|
2363
|
+
Ht as useSchemaHelpers
|
|
2361
2364
|
};
|