@kong-ui-public/entities-plugins 9.246.1 → 9.247.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entities-plugins.es.js +10516 -10135
- package/dist/entities-plugins.umd.js +93 -93
- package/dist/freeform/index.js +340 -340
- package/dist/style.css +1 -1
- package/dist/types/components/free-form/plugins/governance/CardRadioField.vue.d.ts +15 -0
- package/dist/types/components/free-form/plugins/governance/CardRadioField.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/governance/FeatureSelectField.vue.d.ts +4 -0
- package/dist/types/components/free-form/plugins/governance/FeatureSelectField.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/governance/GovernanceForm.vue.d.ts +16 -0
- package/dist/types/components/free-form/plugins/governance/GovernanceForm.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/governance/ResponseMappingField.vue.d.ts +4 -0
- package/dist/types/components/free-form/plugins/governance/ResponseMappingField.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/governance/index.d.ts +3 -0
- package/dist/types/components/free-form/plugins/governance/index.d.ts.map +1 -0
- package/dist/types/definitions/metadata.d.ts.map +1 -1
- package/package.json +10 -10
package/dist/freeform/index.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { toValue as
|
|
1
|
+
import { toValue as V, computed as k, ref as le, readonly as vt, watch as J, onBeforeUnmount as bt, reactive as Ze, toRef as j, useSlots as we, provide as Ie, inject as ke, toRaw as et, onUnmounted as _t, defineComponent as N, useAttrs as ye, openBlock as _, createBlock as T, unref as o, mergeProps as W, createSlots as Y, renderList as se, withCtx as q, renderSlot as F, normalizeProps as Be, guardReactiveProps as tt, createPropsRestProxy as ue, resolveComponent as D, withDirectives as X, createElementBlock as K, createVNode as $, createElementVNode as U, resolveDynamicComponent as oe, createCommentVNode as z, Fragment as te, vShow as Q, useCssVars as At, useTemplateRef as at, normalizeClass as Ce, createTextVNode as pe, toDisplayString as ce, withModifiers as Pe, nextTick as $e, Transition as wt, useId as kt, useModel as Ve, onBeforeMount as St, mergeModels as Ke, withKeys as He } from "vue";
|
|
2
2
|
import { marked as Tt } from "marked";
|
|
3
3
|
import Ct from "dompurify";
|
|
4
|
-
import { get as Ue, isEqual as he, omit as Pt, cloneDeep as We, set as nt, isFunction as
|
|
5
|
-
import { createInjectionState as
|
|
4
|
+
import { get as Ue, isEqual as he, omit as Pt, cloneDeep as We, set as nt, isFunction as Ge, uniqueId as It, upperFirst as Lt } from "lodash-es";
|
|
5
|
+
import { createInjectionState as qt } from "@vueuse/core";
|
|
6
6
|
import { AUTOFILL_SLOT as it } from "@kong-ui-public/forms";
|
|
7
7
|
import { createI18n as ot, i18nTComponent as rt } from "@kong-ui-public/i18n";
|
|
8
|
-
import { KTextArea as Mt, KInput as
|
|
9
|
-
import { AddIcon as
|
|
10
|
-
import { KUI_ICON_SIZE_30 as
|
|
11
|
-
function
|
|
8
|
+
import { KTextArea as Mt, KInput as xt, KCheckbox as Rt, KCard as Ee, KLabel as $t, KMultiselect as Vt, KSelect as Kt, KInputSwitch as Et } from "@kong/kongponents";
|
|
9
|
+
import { AddIcon as je, CloseIcon as st, TrashIcon as jt, ChevronRightIcon as Ot } from "@kong/icons";
|
|
10
|
+
import { KUI_ICON_SIZE_30 as Ft } from "@kong/design-tokens";
|
|
11
|
+
function Dt(e) {
|
|
12
12
|
return e.map((l) => ({ value: l, label: `${l}` }));
|
|
13
13
|
}
|
|
14
|
-
const Ne = "*", ze = "#", de = "$",
|
|
15
|
-
function
|
|
16
|
-
return e.join(
|
|
14
|
+
const Ne = "*", ze = "#", de = "$", Le = ".";
|
|
15
|
+
function R(...e) {
|
|
16
|
+
return e.join(Le);
|
|
17
17
|
}
|
|
18
18
|
function Oe(...e) {
|
|
19
|
-
return
|
|
19
|
+
return R(de, ...e);
|
|
20
20
|
}
|
|
21
|
-
function
|
|
22
|
-
return e.startsWith(
|
|
21
|
+
function Je(e) {
|
|
22
|
+
return e.startsWith(R(de, ""));
|
|
23
23
|
}
|
|
24
24
|
function ae(e) {
|
|
25
|
-
return e.split(
|
|
25
|
+
return e.split(Le).filter((l) => l !== "");
|
|
26
26
|
}
|
|
27
27
|
function me(e) {
|
|
28
28
|
const l = ae(e);
|
|
29
29
|
return l[l.length - 1];
|
|
30
30
|
}
|
|
31
31
|
function Bt(e) {
|
|
32
|
-
return e.startsWith(de) && (e =
|
|
32
|
+
return e.startsWith(de) && (e = R(...ae(e).slice(1))), e;
|
|
33
33
|
}
|
|
34
34
|
function Ut(e) {
|
|
35
|
-
const l =
|
|
35
|
+
const l = V(e);
|
|
36
36
|
return l ? l.type === "set" && l.elements.type === "string" && !l.elements.one_of : !1;
|
|
37
37
|
}
|
|
38
38
|
function lt(e, l) {
|
|
@@ -97,14 +97,14 @@ function Nt(e) {
|
|
|
97
97
|
let t = { parent: null };
|
|
98
98
|
for (l.pop(); l.length; ) {
|
|
99
99
|
const n = l.shift();
|
|
100
|
-
t.path = t.parent?.path ?
|
|
100
|
+
t.path = t.parent?.path ? R(t.parent.path, n) : n, t = { parent: t };
|
|
101
101
|
}
|
|
102
102
|
return t;
|
|
103
103
|
}
|
|
104
104
|
function ct(e) {
|
|
105
|
-
return k(() => Nt(
|
|
105
|
+
return k(() => Nt(V(e)));
|
|
106
106
|
}
|
|
107
|
-
const
|
|
107
|
+
const Ye = /* @__PURE__ */ Symbol("free-form-field-path"), Fe = /* @__PURE__ */ Symbol("free-form-field-renderer-slots"), Xe = /* @__PURE__ */ Symbol("free-form-field-reset-label-path-setting"), Se = "free-form-field-renderers-slot", zt = {
|
|
108
108
|
tooltipAttributes: {
|
|
109
109
|
maxWidth: "300px",
|
|
110
110
|
placement: "top"
|
|
@@ -112,21 +112,21 @@ const Xe = /* @__PURE__ */ Symbol("free-form-field-path"), De = /* @__PURE__ */
|
|
|
112
112
|
};
|
|
113
113
|
function Ht(e, l = "") {
|
|
114
114
|
const t = {}, n = e;
|
|
115
|
-
return Array.isArray(n.fields) ? Object.assign(t,
|
|
115
|
+
return Array.isArray(n.fields) ? Object.assign(t, qe(n, l)) : e.type === "array" && e.elements ? Object.assign(t, Me(e, l)) : e.type === "map" && e.values && Object.assign(t, xe(e, l)), t;
|
|
116
116
|
}
|
|
117
|
-
function
|
|
117
|
+
function qe(e, l = "") {
|
|
118
118
|
const t = {};
|
|
119
119
|
if (Array.isArray(e.fields))
|
|
120
120
|
for (const n of e.fields) {
|
|
121
|
-
const r = Object.keys(n)[0], a = n[r], d = l ?
|
|
121
|
+
const r = Object.keys(n)[0], a = n[r], d = l ? R(l, r) : r;
|
|
122
122
|
if (t[d] = a, a.type === "record" && Array.isArray(a.fields)) {
|
|
123
|
-
const c =
|
|
123
|
+
const c = qe(a, d);
|
|
124
124
|
Object.assign(t, c);
|
|
125
125
|
} else if (a.type === "array" && a.elements) {
|
|
126
126
|
const c = Me(a, d);
|
|
127
127
|
Object.assign(t, c);
|
|
128
128
|
} else if (a.type === "map" && a.values) {
|
|
129
|
-
const c =
|
|
129
|
+
const c = xe(a, d);
|
|
130
130
|
Object.assign(t, c);
|
|
131
131
|
}
|
|
132
132
|
}
|
|
@@ -135,30 +135,30 @@ function Le(e, l = "") {
|
|
|
135
135
|
function Me(e, l = "") {
|
|
136
136
|
const t = {};
|
|
137
137
|
if (e.elements) {
|
|
138
|
-
const n = e.elements, r =
|
|
138
|
+
const n = e.elements, r = R(l, Ne);
|
|
139
139
|
if (t[r] = n, n.type === "record" && Array.isArray(n.fields)) {
|
|
140
|
-
const a =
|
|
140
|
+
const a = qe(n, r);
|
|
141
141
|
Object.assign(t, a);
|
|
142
142
|
} else if (n.type === "array" && n.elements) {
|
|
143
143
|
const a = Me(n, r);
|
|
144
144
|
Object.assign(t, a);
|
|
145
145
|
} else if (n.type === "map" && n.values) {
|
|
146
|
-
const a =
|
|
146
|
+
const a = xe(n, r);
|
|
147
147
|
Object.assign(t, a);
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
return t;
|
|
151
151
|
}
|
|
152
|
-
function
|
|
153
|
-
const t = {}, n =
|
|
152
|
+
function xe(e, l = "") {
|
|
153
|
+
const t = {}, n = R(l, ze);
|
|
154
154
|
if (t[n] = e.values, e.values.type === "record" && Array.isArray(e.values.fields)) {
|
|
155
|
-
const r =
|
|
155
|
+
const r = qe(e.values, n);
|
|
156
156
|
Object.assign(t, r);
|
|
157
157
|
} else if ((e.values.type === "array" || e.values.type === "set") && e.values.elements) {
|
|
158
158
|
const r = Me(e.values, n);
|
|
159
159
|
Object.assign(t, r);
|
|
160
160
|
} else if (e.values.type === "map" && e.values.values) {
|
|
161
|
-
const r =
|
|
161
|
+
const r = xe(e.values, n);
|
|
162
162
|
Object.assign(t, r);
|
|
163
163
|
}
|
|
164
164
|
return t;
|
|
@@ -166,17 +166,17 @@ function $e(e, l = "") {
|
|
|
166
166
|
function Ae(e, l) {
|
|
167
167
|
const t = ae(e), n = [];
|
|
168
168
|
for (let r = 0; r < t.length; r++) {
|
|
169
|
-
const a = t[r], d = n.length > 0 ?
|
|
169
|
+
const a = t[r], d = n.length > 0 ? R(...n) : "", c = d ? l[d] : void 0;
|
|
170
170
|
c?.type === "map" ? n.push(ze) : c?.type === "array" ? n.push(Ne) : n.push(a);
|
|
171
171
|
}
|
|
172
|
-
return
|
|
172
|
+
return R(...n);
|
|
173
173
|
}
|
|
174
174
|
function Wt(e) {
|
|
175
|
-
const l =
|
|
175
|
+
const l = V(e), t = k(() => l ? Ht(l) : {});
|
|
176
176
|
function n(s) {
|
|
177
177
|
if (s) {
|
|
178
178
|
let u = Ae(s, t.value || {});
|
|
179
|
-
return u.startsWith(`${de}${
|
|
179
|
+
return u.startsWith(`${de}${Le}`) && (u = u.slice(2)), t.value?.[u];
|
|
180
180
|
}
|
|
181
181
|
return l;
|
|
182
182
|
}
|
|
@@ -206,7 +206,7 @@ function Wt(e) {
|
|
|
206
206
|
}
|
|
207
207
|
function p(s) {
|
|
208
208
|
const u = n(s);
|
|
209
|
-
return
|
|
209
|
+
return Dt(u?.one_of || u.elements?.one_of || []);
|
|
210
210
|
}
|
|
211
211
|
function i(s) {
|
|
212
212
|
const u = n(s), f = u?.default;
|
|
@@ -241,11 +241,11 @@ function Wt(e) {
|
|
|
241
241
|
getEmptyOrDefault: g
|
|
242
242
|
};
|
|
243
243
|
}
|
|
244
|
-
const
|
|
245
|
-
function
|
|
246
|
-
return { [
|
|
244
|
+
const De = /* @__PURE__ */ Symbol("ff-render-rule-exact-match");
|
|
245
|
+
function Vn(e) {
|
|
246
|
+
return { [De]: e };
|
|
247
247
|
}
|
|
248
|
-
function
|
|
248
|
+
function Gt(e, l) {
|
|
249
249
|
const t = le({}), n = le(/* @__PURE__ */ new Set());
|
|
250
250
|
function r(h, y) {
|
|
251
251
|
const v = h.map((A) => ae(A).length), b = v[0];
|
|
@@ -277,18 +277,18 @@ ${A}`
|
|
|
277
277
|
for (const A of b.keys()) {
|
|
278
278
|
let C = function(P) {
|
|
279
279
|
if (S.includes(P)) {
|
|
280
|
-
const
|
|
280
|
+
const E = [...S, P].join(" -> ");
|
|
281
281
|
throw new Error(
|
|
282
282
|
`Circular bundle detected in path '${y}':
|
|
283
|
-
${
|
|
283
|
+
${E}`
|
|
284
284
|
);
|
|
285
285
|
}
|
|
286
286
|
if (w.has(P)) return;
|
|
287
287
|
w.add(P), S.push(P);
|
|
288
|
-
const
|
|
289
|
-
if (
|
|
290
|
-
for (const
|
|
291
|
-
C(
|
|
288
|
+
const x = b.get(P);
|
|
289
|
+
if (x)
|
|
290
|
+
for (const E of x)
|
|
291
|
+
C(E);
|
|
292
292
|
S.pop();
|
|
293
293
|
};
|
|
294
294
|
const w = /* @__PURE__ */ new Set(), S = [];
|
|
@@ -302,18 +302,18 @@ ${j}`
|
|
|
302
302
|
for (const b of Object.keys(v.dependencies)) {
|
|
303
303
|
let A = function(S) {
|
|
304
304
|
if (w.includes(S)) {
|
|
305
|
-
const
|
|
305
|
+
const x = [...w, S].join(" -> ");
|
|
306
306
|
throw new Error(
|
|
307
307
|
`Circular dependency detected in path '${y}':
|
|
308
|
-
${
|
|
308
|
+
${x}`
|
|
309
309
|
);
|
|
310
310
|
}
|
|
311
311
|
if (C.has(S)) return;
|
|
312
312
|
C.add(S), w.push(S);
|
|
313
313
|
const P = v.dependencies[S];
|
|
314
314
|
if (P) {
|
|
315
|
-
const [
|
|
316
|
-
v.dependencies[
|
|
315
|
+
const [x] = P;
|
|
316
|
+
v.dependencies[x] && A(x);
|
|
317
317
|
}
|
|
318
318
|
w.pop();
|
|
319
319
|
};
|
|
@@ -322,17 +322,17 @@ ${$}`
|
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
324
|
function c(h, y) {
|
|
325
|
-
const v = h.map((A) => y ?
|
|
326
|
-
return b.pop(),
|
|
325
|
+
const v = h.map((A) => y ? R(y, A) : A), b = ae(v[0]);
|
|
326
|
+
return b.pop(), R(...b);
|
|
327
327
|
}
|
|
328
328
|
function p(h, y) {
|
|
329
329
|
if (!y) return h;
|
|
330
|
-
const v = `${y}${
|
|
330
|
+
const v = `${y}${Le}`;
|
|
331
331
|
return h.startsWith(v) ? h.slice(v.length) : h;
|
|
332
332
|
}
|
|
333
333
|
function i(h) {
|
|
334
334
|
const y = ae(h);
|
|
335
|
-
return y.pop(),
|
|
335
|
+
return y.pop(), R(...y);
|
|
336
336
|
}
|
|
337
337
|
const m = k(() => {
|
|
338
338
|
const h = {};
|
|
@@ -344,7 +344,7 @@ ${$}`
|
|
|
344
344
|
throw new Error(
|
|
345
345
|
`Bundle must contain at least 2 fields. Found ${A.length} field(s) in bundle: [${A.join(", ")}]`
|
|
346
346
|
);
|
|
347
|
-
const C = A.map((P) => b ?
|
|
347
|
+
const C = A.map((P) => b ? R(b, P) : P);
|
|
348
348
|
r(C, `Bundle [${A.join(", ")}]`);
|
|
349
349
|
const w = c(A, b) || de;
|
|
350
350
|
h[w] || (h[w] = {}), h[w].bundles || (h[w].bundles = []);
|
|
@@ -353,15 +353,15 @@ ${$}`
|
|
|
353
353
|
}
|
|
354
354
|
if (v.dependencies)
|
|
355
355
|
for (const [A, [C, w]] of Object.entries(v.dependencies)) {
|
|
356
|
-
const S = b ?
|
|
356
|
+
const S = b ? R(b, A) : A, P = b ? R(b, C) : C;
|
|
357
357
|
r(
|
|
358
358
|
[S, P],
|
|
359
359
|
`Dependency '${A}' -> '${C}'`
|
|
360
360
|
);
|
|
361
|
-
const
|
|
362
|
-
h[
|
|
363
|
-
const
|
|
364
|
-
h[
|
|
361
|
+
const x = i(S) || de;
|
|
362
|
+
h[x] || (h[x] = {}), h[x].dependencies || (h[x].dependencies = {});
|
|
363
|
+
const E = p(S, x), L = p(P, x);
|
|
364
|
+
h[x].dependencies[E] = [L, w];
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
367
|
return a(h), d(h), h;
|
|
@@ -376,7 +376,7 @@ ${$}`
|
|
|
376
376
|
let y = !1;
|
|
377
377
|
return k(() => {
|
|
378
378
|
if (y) return;
|
|
379
|
-
const v =
|
|
379
|
+
const v = V(h);
|
|
380
380
|
try {
|
|
381
381
|
return g(v);
|
|
382
382
|
} catch (b) {
|
|
@@ -392,25 +392,25 @@ ${$}`
|
|
|
392
392
|
parentValue: b,
|
|
393
393
|
omittedFields: A
|
|
394
394
|
} = h;
|
|
395
|
-
|
|
396
|
-
() =>
|
|
397
|
-
() =>
|
|
395
|
+
J([
|
|
396
|
+
() => V(v),
|
|
397
|
+
() => V(y)
|
|
398
398
|
], ([w, S], [, P]) => {
|
|
399
399
|
w ? t.value[S] = w : delete t.value[S], P && P !== S && delete t.value[P];
|
|
400
400
|
}, { immediate: !0, deep: !0 });
|
|
401
401
|
const C = s(y);
|
|
402
|
-
return
|
|
402
|
+
return J(
|
|
403
403
|
[
|
|
404
|
-
() =>
|
|
405
|
-
() =>
|
|
406
|
-
() =>
|
|
407
|
-
() =>
|
|
404
|
+
() => V(b),
|
|
405
|
+
() => V(C)?.dependencies,
|
|
406
|
+
() => V(y),
|
|
407
|
+
() => V(A)
|
|
408
408
|
],
|
|
409
|
-
([w, S, P,
|
|
410
|
-
!S || !w || Object.entries(S).forEach(([
|
|
411
|
-
if (
|
|
412
|
-
const I = Ue(w,
|
|
413
|
-
if (typeof M == "object" && M !== null &&
|
|
409
|
+
([w, S, P, x]) => {
|
|
410
|
+
!S || !w || Object.entries(S).forEach(([E, [L, M]]) => {
|
|
411
|
+
if (x?.includes(E)) return;
|
|
412
|
+
const I = Ue(w, L), B = P ? Bt(R(P, E)) : E;
|
|
413
|
+
if (typeof M == "object" && M !== null && De in M ? he(I, M[De]) : Array.isArray(M) ? M.some((fe) => he(I, fe)) : he(I, M)) {
|
|
414
414
|
n.value.delete(B), e();
|
|
415
415
|
return;
|
|
416
416
|
}
|
|
@@ -419,7 +419,7 @@ ${$}`
|
|
|
419
419
|
},
|
|
420
420
|
{ deep: !0, immediate: !0 }
|
|
421
421
|
), bt(() => {
|
|
422
|
-
const w =
|
|
422
|
+
const w = V(y);
|
|
423
423
|
delete t.value[w];
|
|
424
424
|
}), C;
|
|
425
425
|
}
|
|
@@ -433,14 +433,14 @@ ${$}`
|
|
|
433
433
|
isFieldHidden: f
|
|
434
434
|
};
|
|
435
435
|
}
|
|
436
|
-
let
|
|
437
|
-
function
|
|
438
|
-
return `kid:${++
|
|
436
|
+
let Jt = 0;
|
|
437
|
+
function Yt() {
|
|
438
|
+
return `kid:${++Jt}`;
|
|
439
439
|
}
|
|
440
|
-
function
|
|
440
|
+
function Xt(e) {
|
|
441
441
|
const l = Ze(/* @__PURE__ */ new Map());
|
|
442
442
|
function t(i = "") {
|
|
443
|
-
const m =
|
|
443
|
+
const m = Yt();
|
|
444
444
|
return l.set(m, i), m;
|
|
445
445
|
}
|
|
446
446
|
function n(i) {
|
|
@@ -477,19 +477,19 @@ function Qt(e, l, t) {
|
|
|
477
477
|
return r;
|
|
478
478
|
if (Array.isArray(r))
|
|
479
479
|
return r.map((p, i) => {
|
|
480
|
-
const m = a ?
|
|
480
|
+
const m = a ? R(a, `${i}`) : `${i}`;
|
|
481
481
|
return n(p, m);
|
|
482
482
|
});
|
|
483
483
|
if ((a ? l(a) : l())?.type === "map") {
|
|
484
484
|
const p = r, i = {};
|
|
485
485
|
return Object.keys(p).forEach((m) => {
|
|
486
|
-
const g = t(m), s = p[m], u = a ?
|
|
486
|
+
const g = t(m), s = p[m], u = a ? R(a, m) : m;
|
|
487
487
|
i[g] = n(s, u);
|
|
488
488
|
}), i;
|
|
489
489
|
}
|
|
490
490
|
const c = {};
|
|
491
491
|
return Object.keys(r).forEach((p) => {
|
|
492
|
-
const i = a ?
|
|
492
|
+
const i = a ? R(a, p) : p;
|
|
493
493
|
c[p] = n(r[p], i);
|
|
494
494
|
}), c;
|
|
495
495
|
};
|
|
@@ -501,7 +501,7 @@ function Zt(e, l, t) {
|
|
|
501
501
|
return r;
|
|
502
502
|
if (Array.isArray(r))
|
|
503
503
|
return r.map((p, i) => {
|
|
504
|
-
const m = a ?
|
|
504
|
+
const m = a ? R(a, `${i}`) : `${i}`;
|
|
505
505
|
return n(p, m);
|
|
506
506
|
});
|
|
507
507
|
if ((a ? l(a) : l())?.type === "map") {
|
|
@@ -512,13 +512,13 @@ function Zt(e, l, t) {
|
|
|
512
512
|
console.error(`[FreeForm] Missing name for key ID: ${String(g)}`);
|
|
513
513
|
return;
|
|
514
514
|
}
|
|
515
|
-
const f = u || ze, h = a ?
|
|
515
|
+
const f = u || ze, h = a ? R(a, f) : f;
|
|
516
516
|
i[u] = n(s, h);
|
|
517
517
|
}), i;
|
|
518
518
|
}
|
|
519
519
|
const c = {};
|
|
520
520
|
return Object.keys(r).forEach((p) => {
|
|
521
|
-
const i = a ?
|
|
521
|
+
const i = a ? R(a, p) : p;
|
|
522
522
|
c[p] = n(r[p], i);
|
|
523
523
|
}), c;
|
|
524
524
|
};
|
|
@@ -527,7 +527,7 @@ function Zt(e, l, t) {
|
|
|
527
527
|
function ea(e) {
|
|
528
528
|
return /^kid:\d+$/.test(e);
|
|
529
529
|
}
|
|
530
|
-
const [ta, aa] =
|
|
530
|
+
const [ta, aa] = qt(
|
|
531
531
|
function(l) {
|
|
532
532
|
const {
|
|
533
533
|
schema: t,
|
|
@@ -539,14 +539,14 @@ const [ta, aa] = Lt(
|
|
|
539
539
|
getDefault: c,
|
|
540
540
|
getEmptyOrDefault: p,
|
|
541
541
|
...i
|
|
542
|
-
} = Wt(t), m =
|
|
543
|
-
Ie(
|
|
542
|
+
} = Wt(t), m = Xt(i.getSchema), g = /* @__PURE__ */ new Map(), s = Ze({}), u = j(() => d ?? {}), f = we();
|
|
543
|
+
Ie(Fe, Pt(f, "default", Se));
|
|
544
544
|
const {
|
|
545
545
|
useCurrentRules: h,
|
|
546
546
|
createComputedRules: y,
|
|
547
547
|
hiddenPaths: v,
|
|
548
548
|
isFieldHidden: b
|
|
549
|
-
} =
|
|
549
|
+
} = Gt(() => r?.(P()), i.getSchemaMap), A = h({
|
|
550
550
|
fieldPath: de,
|
|
551
551
|
rules: a,
|
|
552
552
|
parentValue: s
|
|
@@ -558,13 +558,13 @@ const [ta, aa] = Lt(
|
|
|
558
558
|
}
|
|
559
559
|
function w(I) {
|
|
560
560
|
let B;
|
|
561
|
-
!I || !S(
|
|
561
|
+
!I || !S(V(I)) ? B = c() : B = We(V(I)), Ge(u.value.prepareFormData) ? C(u.value.prepareFormData(B)) : C(B);
|
|
562
562
|
}
|
|
563
563
|
function S(I) {
|
|
564
|
-
return
|
|
564
|
+
return Ge(u.value.hasValue) ? u.value.hasValue(I) : !!I;
|
|
565
565
|
}
|
|
566
566
|
function P() {
|
|
567
|
-
const I =
|
|
567
|
+
const I = V(s), B = We(I);
|
|
568
568
|
if (v.value.size > 0)
|
|
569
569
|
for (const H of v.value) {
|
|
570
570
|
const ee = ae(H), fe = ee.slice(0, -1);
|
|
@@ -572,21 +572,21 @@ const [ta, aa] = Lt(
|
|
|
572
572
|
}
|
|
573
573
|
return m.deserialize(B);
|
|
574
574
|
}
|
|
575
|
-
|
|
575
|
+
J(s, () => {
|
|
576
576
|
r?.(P());
|
|
577
577
|
}, { deep: !0 });
|
|
578
|
-
let
|
|
579
|
-
|
|
580
|
-
|
|
578
|
+
let x = !1;
|
|
579
|
+
J(() => n?.value, (I) => {
|
|
580
|
+
x && he(P(), V(I)) || (w(I), x = !0);
|
|
581
581
|
}, { deep: !0, immediate: !0 });
|
|
582
|
-
function
|
|
582
|
+
function E(I) {
|
|
583
583
|
return I != null && typeof I == "object" && !Array.isArray(I) ? m.serialize(I) : I;
|
|
584
584
|
}
|
|
585
|
-
function
|
|
586
|
-
return
|
|
585
|
+
function L(I) {
|
|
586
|
+
return E(c(I));
|
|
587
587
|
}
|
|
588
588
|
function M(I) {
|
|
589
|
-
return
|
|
589
|
+
return E(p(I));
|
|
590
590
|
}
|
|
591
591
|
return {
|
|
592
592
|
/**
|
|
@@ -604,7 +604,7 @@ const [ta, aa] = Lt(
|
|
|
604
604
|
getValue: P,
|
|
605
605
|
isFieldHidden: b,
|
|
606
606
|
keyIdMap: m,
|
|
607
|
-
getDefault:
|
|
607
|
+
getDefault: L,
|
|
608
608
|
getEmptyOrDefault: M
|
|
609
609
|
};
|
|
610
610
|
}
|
|
@@ -616,23 +616,23 @@ function ne() {
|
|
|
616
616
|
return e;
|
|
617
617
|
}
|
|
618
618
|
const dt = (e) => {
|
|
619
|
-
const l = ke(
|
|
620
|
-
const n =
|
|
619
|
+
const l = ke(Ye, k(() => "")), t = k(() => {
|
|
620
|
+
const n = V(e);
|
|
621
621
|
let r = n;
|
|
622
|
-
return !
|
|
622
|
+
return !Je(n) && l.value && (r = R(l.value, n)), Je(n) && (r = r.slice(Oe("").length)), r;
|
|
623
623
|
});
|
|
624
|
-
return Ie(
|
|
624
|
+
return Ie(Ye, t), t;
|
|
625
625
|
}, na = (e) => {
|
|
626
|
-
const { getSchema: l, getSchemaMap: t, fieldRendererRegistry: n } = ne(), { default: r, ...a } = we(), d = ke(
|
|
627
|
-
const p =
|
|
628
|
-
const u = Ae(
|
|
626
|
+
const { getSchema: l, getSchemaMap: t, fieldRendererRegistry: n } = ne(), { default: r, ...a } = we(), d = ke(Fe), c = k(() => {
|
|
627
|
+
const p = V(d), i = t(), m = Object.keys(a).filter((g) => g !== Se && g !== "item").reduce((g, s) => {
|
|
628
|
+
const u = Ae(R(V(e), s), i);
|
|
629
629
|
return { ...g, [u]: a[s] };
|
|
630
630
|
}, {});
|
|
631
631
|
return p ? { ...p, ...m } : m;
|
|
632
632
|
});
|
|
633
|
-
return Ie(
|
|
633
|
+
return Ie(Fe, c), k(() => {
|
|
634
634
|
if (r) return;
|
|
635
|
-
const p =
|
|
635
|
+
const p = V(e), i = c.value[Ae(p, t())];
|
|
636
636
|
if (i) return i;
|
|
637
637
|
const m = t();
|
|
638
638
|
for (const [g, s] of n) {
|
|
@@ -682,8 +682,8 @@ function oa(e, l) {
|
|
|
682
682
|
const p = n.has(c) ? n.get(c) : r();
|
|
683
683
|
return n.set(c, p), t.set(d, p), p;
|
|
684
684
|
}
|
|
685
|
-
return
|
|
686
|
-
const c =
|
|
685
|
+
return J(l, (d) => {
|
|
686
|
+
const c = V(d), p = /* @__PURE__ */ new Set();
|
|
687
687
|
c.forEach((i, m) => {
|
|
688
688
|
p.add(m);
|
|
689
689
|
}), Array.from(n.keys()).forEach((i) => {
|
|
@@ -692,7 +692,7 @@ function oa(e, l) {
|
|
|
692
692
|
}, { immediate: !0, deep: !0 }), { getKey: a };
|
|
693
693
|
}
|
|
694
694
|
function Kn(e, l) {
|
|
695
|
-
|
|
695
|
+
J(e, (t) => {
|
|
696
696
|
window[_e] || (window[_e] = {}), window[_e][l] = et(t);
|
|
697
697
|
}, { immediate: !0, deep: !0 }), _t(() => {
|
|
698
698
|
window[_e] && delete window[_e][l];
|
|
@@ -738,15 +738,15 @@ function mt(e) {
|
|
|
738
738
|
return e.split("_").map(pt).join(" ");
|
|
739
739
|
}
|
|
740
740
|
function sa(e, l) {
|
|
741
|
-
const t = ke(
|
|
741
|
+
const t = ke(Xe, {
|
|
742
742
|
parentPath: null,
|
|
743
743
|
isolate: !1
|
|
744
|
-
}), { parentPath: n, isolate: r } =
|
|
744
|
+
}), { parentPath: n, isolate: r } = V(t), a = le(n ? R(n, e) : e), d = le({
|
|
745
745
|
parentPath: a.value,
|
|
746
746
|
isolate: r
|
|
747
747
|
});
|
|
748
|
-
return
|
|
749
|
-
const { parentPath: i, isolate: m } = p, g = i ?
|
|
748
|
+
return J([j(l), j(t)], ([c, p]) => {
|
|
749
|
+
const { parentPath: i, isolate: m } = p, g = i ? R(i, e) : e;
|
|
750
750
|
c ? {
|
|
751
751
|
isolate: () => {
|
|
752
752
|
a.value = e, d.value.isolate = !0, d.value.parentPath = null;
|
|
@@ -764,13 +764,13 @@ function sa(e, l) {
|
|
|
764
764
|
a.value = g, d.value.isolate = !1, d.value.parentPath = g;
|
|
765
765
|
}
|
|
766
766
|
}[c]?.() : m && (a.value = e, d.value.isolate = !0, d.value.parentPath = null);
|
|
767
|
-
}, { deep: !0, immediate: !0 }), Ie(
|
|
767
|
+
}, { deep: !0, immediate: !0 }), Ie(Xe, d), a;
|
|
768
768
|
}
|
|
769
769
|
function ft(e) {
|
|
770
|
-
return ae(e).map((t) => t.split("_").map(pt).join(" ")).map(
|
|
770
|
+
return ae(e).map((t) => t.split("_").map(pt).join(" ")).map(Lt).join(" › ");
|
|
771
771
|
}
|
|
772
772
|
function la(e, l) {
|
|
773
|
-
const t =
|
|
773
|
+
const t = V(e), n = me(t), { config: r, getSchema: a } = ne(), d = sa(n, l), c = ct(e);
|
|
774
774
|
return k(() => {
|
|
775
775
|
const p = d.value ?? n, i = c.value.parent?.path ? a(c.value.parent.path) : null, m = i?.type === "array", g = i?.type === "map";
|
|
776
776
|
if (m || g)
|
|
@@ -780,7 +780,7 @@ function la(e, l) {
|
|
|
780
780
|
});
|
|
781
781
|
}
|
|
782
782
|
function ie(e, l) {
|
|
783
|
-
const { getLabelAttributes: t, getPlaceholder: n, getSchema: r } = ne(), a =
|
|
783
|
+
const { getLabelAttributes: t, getPlaceholder: n, getSchema: r } = ne(), a = V(e), d = V(l), c = la(e, j(() => V(l).resetLabelPath));
|
|
784
784
|
return k(() => ({
|
|
785
785
|
...d,
|
|
786
786
|
placeholder: d.placeholder ?? n(a) ?? void 0,
|
|
@@ -802,7 +802,7 @@ function ua(e, l) {
|
|
|
802
802
|
}
|
|
803
803
|
function i() {
|
|
804
804
|
if (!t) return;
|
|
805
|
-
const u = a.createKey(), f = r(
|
|
805
|
+
const u = a.createKey(), f = r(R(n.path.value, u));
|
|
806
806
|
return t.value = {
|
|
807
807
|
...t.value,
|
|
808
808
|
[u]: f
|
|
@@ -832,7 +832,7 @@ function ua(e, l) {
|
|
|
832
832
|
}
|
|
833
833
|
return h;
|
|
834
834
|
}, f = null;
|
|
835
|
-
|
|
835
|
+
J(() => t?.value, (h) => {
|
|
836
836
|
const y = u();
|
|
837
837
|
he(f, y) || (f = y, l?.(y));
|
|
838
838
|
}, { deep: !0 });
|
|
@@ -866,8 +866,8 @@ const be = /* @__PURE__ */ N({
|
|
|
866
866
|
},
|
|
867
867
|
emits: ["update:modelValue"],
|
|
868
868
|
setup(e, { emit: l }) {
|
|
869
|
-
const t = e, n = ye(), r = l, a = k(() => t.multiline ? Mt :
|
|
870
|
-
|
|
869
|
+
const t = e, n = ye(), r = l, a = k(() => t.multiline ? Mt : xt), d = k(() => n.characterLimit ?? (t.multiline ? !1 : void 0)), c = le(t.modelValue);
|
|
870
|
+
J(() => t.modelValue, (g) => {
|
|
871
871
|
c.value = g;
|
|
872
872
|
});
|
|
873
873
|
const { config: p } = ne(), i = (g) => {
|
|
@@ -881,11 +881,11 @@ const be = /* @__PURE__ */ N({
|
|
|
881
881
|
resizable: e.multiline ? !0 : void 0,
|
|
882
882
|
onChange: m,
|
|
883
883
|
"onUpdate:modelValue": i
|
|
884
|
-
}),
|
|
884
|
+
}), Y({ _: 2 }, [
|
|
885
885
|
se(we(), (u, f) => ({
|
|
886
886
|
name: f,
|
|
887
|
-
fn:
|
|
888
|
-
|
|
887
|
+
fn: q((h) => [
|
|
888
|
+
F(g.$slots, f, Be(tt(h)))
|
|
889
889
|
])
|
|
890
890
|
}))
|
|
891
891
|
]), 1040, ["character-limit", "model-value", "resizable"]));
|
|
@@ -916,19 +916,19 @@ const be = /* @__PURE__ */ N({
|
|
|
916
916
|
},
|
|
917
917
|
emits: ["update:modelValue"],
|
|
918
918
|
setup(e, { emit: l }) {
|
|
919
|
-
const t = ye(), { i18n: n } = ve(), r = ue(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), a = l, { value: d, hide: c, ...p } = Z(
|
|
919
|
+
const t = ye(), { i18n: n } = ve(), r = ue(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), a = l, { value: d, hide: c, ...p } = Z(j(() => e.name)), i = ie(p.path, j({ ...r, ...t })), m = d?.value;
|
|
920
920
|
function g(v) {
|
|
921
921
|
m !== void 0 && v === "" && v !== m ? (d.value = null, a("update:modelValue", null)) : (d.value = v.trim(), a("update:modelValue", v.trim()));
|
|
922
922
|
}
|
|
923
923
|
const s = k(() => e.showPasswordMaskToggle !== void 0 ? e.showPasswordMaskToggle : r.type === "password" ? !0 : !!(p.schema?.value).encrypted), u = ke(it, void 0), f = k(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!p.schema.value?.referenceable), h = k(() => ({ referenceable: f.value })), y = k(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
924
924
|
return (v, b) => {
|
|
925
|
-
const A =
|
|
925
|
+
const A = D("KAlert");
|
|
926
926
|
return p.error ? (_(), T(A, {
|
|
927
927
|
key: 0,
|
|
928
928
|
appearance: "danger",
|
|
929
929
|
message: p.error.message
|
|
930
|
-
}, null, 8, ["message"])) :
|
|
931
|
-
|
|
930
|
+
}, null, 8, ["message"])) : X((_(), K("div", Be(W({ key: 1 }, v.$attrs)), [
|
|
931
|
+
$(be, W({
|
|
932
932
|
...o(i),
|
|
933
933
|
showPasswordMaskToggle: s.value,
|
|
934
934
|
type: s.value ? "password" : "text"
|
|
@@ -945,11 +945,11 @@ const be = /* @__PURE__ */ N({
|
|
|
945
945
|
multiline: e.multiline,
|
|
946
946
|
placeholder: e.placeholder ?? o(i).placeholder,
|
|
947
947
|
"onUpdate:modelValue": g
|
|
948
|
-
}),
|
|
948
|
+
}), Y({ _: 2 }, [
|
|
949
949
|
o(i).labelAttributes?.info ? {
|
|
950
950
|
name: "label-tooltip",
|
|
951
|
-
fn:
|
|
952
|
-
|
|
951
|
+
fn: q(() => [
|
|
952
|
+
F(v.$slots, "tooltip", {}, () => [
|
|
953
953
|
U("div", {
|
|
954
954
|
innerHTML: o(i).labelAttributes.info
|
|
955
955
|
}, null, 8, ma)
|
|
@@ -959,14 +959,14 @@ const be = /* @__PURE__ */ N({
|
|
|
959
959
|
} : void 0,
|
|
960
960
|
!(e.multiline && e.error) && v.$slots.help ? {
|
|
961
961
|
name: "help",
|
|
962
|
-
fn:
|
|
963
|
-
|
|
962
|
+
fn: q(() => [
|
|
963
|
+
F(v.$slots, "help", {}, void 0, !0)
|
|
964
964
|
]),
|
|
965
965
|
key: "1"
|
|
966
966
|
} : void 0,
|
|
967
967
|
!e.multiline && e.inlineVaultPicker ? {
|
|
968
968
|
name: "after",
|
|
969
|
-
fn:
|
|
969
|
+
fn: q(() => [
|
|
970
970
|
o(u) && f.value ? (_(), T(oe(o(u)), {
|
|
971
971
|
key: 0,
|
|
972
972
|
schema: h.value,
|
|
@@ -1002,12 +1002,12 @@ const be = /* @__PURE__ */ N({
|
|
|
1002
1002
|
]);
|
|
1003
1003
|
};
|
|
1004
1004
|
}
|
|
1005
|
-
}),
|
|
1005
|
+
}), G = (e, l) => {
|
|
1006
1006
|
const t = e.__vccOpts || e;
|
|
1007
1007
|
for (const [n, r] of l)
|
|
1008
1008
|
t[n] = r;
|
|
1009
1009
|
return t;
|
|
1010
|
-
}, ht = /* @__PURE__ */
|
|
1010
|
+
}, ht = /* @__PURE__ */ G(fa, [["__scopeId", "data-v-5cb8f07e"]]), ha = ["innerHTML"], ga = /* @__PURE__ */ N({
|
|
1011
1011
|
inheritAttrs: !1,
|
|
1012
1012
|
__name: "BooleanField",
|
|
1013
1013
|
props: {
|
|
@@ -1018,26 +1018,26 @@ const be = /* @__PURE__ */ N({
|
|
|
1018
1018
|
},
|
|
1019
1019
|
emits: ["update:modelValue"],
|
|
1020
1020
|
setup(e, { emit: l }) {
|
|
1021
|
-
const t = ue(e, ["autofocus", "name"]), { value: n, hide: r, emptyOrDefaultValue: a, ...d } = Z(
|
|
1021
|
+
const t = ue(e, ["autofocus", "name"]), { value: n, hide: r, emptyOrDefaultValue: a, ...d } = Z(j(() => e.name)), c = l, p = (m) => {
|
|
1022
1022
|
n.value = m, c("update:modelValue", m);
|
|
1023
1023
|
}, i = ie(d.path, t);
|
|
1024
1024
|
return (m, g) => {
|
|
1025
|
-
const s =
|
|
1025
|
+
const s = D("KAlert");
|
|
1026
1026
|
return d.error ? (_(), T(s, {
|
|
1027
1027
|
key: 0,
|
|
1028
1028
|
appearance: "danger",
|
|
1029
1029
|
message: d.error.message
|
|
1030
|
-
}, null, 8, ["message"])) :
|
|
1030
|
+
}, null, 8, ["message"])) : X((_(), T(o(Rt), W({ key: 1 }, { ...o(i), ...m.$attrs }, {
|
|
1031
1031
|
class: "ff-boolean-field",
|
|
1032
1032
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1033
1033
|
"data-testid": `ff-${d.path.value}`,
|
|
1034
1034
|
"model-value": !!(o(n) == null ? o(a) : o(n)),
|
|
1035
1035
|
"onUpdate:modelValue": p
|
|
1036
|
-
}),
|
|
1036
|
+
}), Y({ _: 2 }, [
|
|
1037
1037
|
o(i).labelAttributes?.info ? {
|
|
1038
1038
|
name: "tooltip",
|
|
1039
|
-
fn:
|
|
1040
|
-
|
|
1039
|
+
fn: q(() => [
|
|
1040
|
+
F(m.$slots, "tooltip", {}, () => [
|
|
1041
1041
|
U("div", {
|
|
1042
1042
|
innerHTML: o(i).labelAttributes.info
|
|
1043
1043
|
}, null, 8, ha)
|
|
@@ -1050,7 +1050,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1050
1050
|
]);
|
|
1051
1051
|
};
|
|
1052
1052
|
}
|
|
1053
|
-
}), ya = /* @__PURE__ */
|
|
1053
|
+
}), ya = /* @__PURE__ */ G(ga, [["__scopeId", "data-v-a1c08c7f"]]), va = ["data-testid"], ba = ["innerHTML"], _a = /* @__PURE__ */ N({
|
|
1054
1054
|
inheritAttrs: !1,
|
|
1055
1055
|
__name: "StringArrayField",
|
|
1056
1056
|
props: {
|
|
@@ -1061,7 +1061,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1061
1061
|
},
|
|
1062
1062
|
emits: ["update:modelValue"],
|
|
1063
1063
|
setup(e, { emit: l }) {
|
|
1064
|
-
const t = ye(), n = ue(e, ["autofocus", "name"]), r = l, { value: a, hide: d, ...c } = Z(
|
|
1064
|
+
const t = ye(), n = ue(e, ["autofocus", "name"]), r = l, { value: a, hide: d, ...c } = Z(j(() => e.name)), p = ie(c.path, j({ ...n, ...t })), i = k(() => c.schema?.value?.len_min && c.schema.value.len_min > 0), m = le("");
|
|
1065
1065
|
function g(h) {
|
|
1066
1066
|
return h.map((y) => y.trim()).filter(Boolean).join(", ");
|
|
1067
1067
|
}
|
|
@@ -1074,31 +1074,31 @@ const be = /* @__PURE__ */ N({
|
|
|
1074
1074
|
a.value = v, r("update:modelValue", v);
|
|
1075
1075
|
}
|
|
1076
1076
|
const f = k(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1077
|
-
return
|
|
1077
|
+
return J(a, (h) => {
|
|
1078
1078
|
const y = h ? g(h) : "";
|
|
1079
1079
|
g(s(m.value)) !== y && (m.value = y);
|
|
1080
1080
|
}, { immediate: !0 }), (h, y) => {
|
|
1081
|
-
const v =
|
|
1081
|
+
const v = D("KAlert");
|
|
1082
1082
|
return c.error ? (_(), T(v, {
|
|
1083
1083
|
key: 0,
|
|
1084
1084
|
appearance: "danger",
|
|
1085
1085
|
message: c.error.message
|
|
1086
|
-
}, null, 8, ["message"])) :
|
|
1086
|
+
}, null, 8, ["message"])) : X((_(), K("div", {
|
|
1087
1087
|
key: 1,
|
|
1088
1088
|
"data-testid": `ff-tag-${c.path.value}`
|
|
1089
1089
|
}, [
|
|
1090
|
-
|
|
1090
|
+
$(be, W(o(p), {
|
|
1091
1091
|
class: "ff-tag-field",
|
|
1092
1092
|
"data-1p-ignore": f.value,
|
|
1093
1093
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1094
1094
|
"data-testid": `ff-${c.path.value}`,
|
|
1095
1095
|
"model-value": m.value ?? "",
|
|
1096
1096
|
"onUpdate:modelValue": u
|
|
1097
|
-
}),
|
|
1097
|
+
}), Y({ _: 2 }, [
|
|
1098
1098
|
o(p).labelAttributes?.info ? {
|
|
1099
1099
|
name: "label-tooltip",
|
|
1100
|
-
fn:
|
|
1101
|
-
|
|
1100
|
+
fn: q(() => [
|
|
1101
|
+
F(h.$slots, "tooltip", {}, () => [
|
|
1102
1102
|
U("div", {
|
|
1103
1103
|
innerHTML: o(p).labelAttributes.info
|
|
1104
1104
|
}, null, 8, ba)
|
|
@@ -1112,7 +1112,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1112
1112
|
]);
|
|
1113
1113
|
};
|
|
1114
1114
|
}
|
|
1115
|
-
}), gt = /* @__PURE__ */
|
|
1115
|
+
}), gt = /* @__PURE__ */ G(_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"], Re = 'input:not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled), [contenteditable="true"], [tabindex]:not([tabindex="-1"]):not(:disabled)', Pa = /* @__PURE__ */ N({
|
|
1116
1116
|
__name: "ArrayField",
|
|
1117
1117
|
props: {
|
|
1118
1118
|
name: {},
|
|
@@ -1127,54 +1127,54 @@ const be = /* @__PURE__ */ N({
|
|
|
1127
1127
|
},
|
|
1128
1128
|
emits: ["add", "remove"],
|
|
1129
1129
|
setup(e, { emit: l }) {
|
|
1130
|
-
At((
|
|
1131
|
-
v2cc732dc:
|
|
1130
|
+
At((L) => ({
|
|
1131
|
+
v2cc732dc: E.value
|
|
1132
1132
|
}));
|
|
1133
|
-
const t = e, n = l, { i18n: { t: r } } = ve(), { getDefault: a, getSchema: d } = ne(), { value: c, hide: p, ...i } = Z(
|
|
1133
|
+
const t = e, n = l, { i18n: { t: r } } = ve(), { getDefault: a, getSchema: d } = ne(), { value: c, hide: p, ...i } = Z(j(t, "name")), m = ie(i.path, j({ ...t, ...ye() })), g = k(() => {
|
|
1134
1134
|
if (!i.path) throw new Error("Field path is required for sub-schema retrieval");
|
|
1135
|
-
const
|
|
1136
|
-
if (!
|
|
1137
|
-
return
|
|
1135
|
+
const L = d(i.path.value);
|
|
1136
|
+
if (!L) throw new Error(`Schema not found for path: ${i.path.value}`);
|
|
1137
|
+
return L.elements;
|
|
1138
1138
|
}), s = k(() => {
|
|
1139
1139
|
if (!i.path) return "";
|
|
1140
|
-
const
|
|
1141
|
-
return mt(
|
|
1142
|
-
}), u = k(() => t.items ??
|
|
1143
|
-
function v(
|
|
1144
|
-
return typeof t.itemLabel == "function" ? t.itemLabel(
|
|
1140
|
+
const L = me(i.path.value);
|
|
1141
|
+
return mt(L);
|
|
1142
|
+
}), u = k(() => t.items ?? V(c) ?? []), { getKey: f } = oa("ff-array-field", u), h = k(() => t.appearance ? t.appearance : g.value.type === "record" || g.value.type === "map" ? "card" : "default"), y = k(() => h.value === "card" ? Ee : "div");
|
|
1143
|
+
function v(L, M) {
|
|
1144
|
+
return typeof t.itemLabel == "function" ? t.itemLabel(L, M) : t.itemLabel || m.value.label || `Item #${M}`;
|
|
1145
1145
|
}
|
|
1146
|
-
const b = k(() => u.value.map((
|
|
1147
|
-
hash: `#${f(
|
|
1146
|
+
const b = k(() => u.value.map((L, M) => ({
|
|
1147
|
+
hash: `#${f(L, M)}`,
|
|
1148
1148
|
title: ""
|
|
1149
1149
|
}))), A = le(b.value[0]?.hash), C = async () => {
|
|
1150
|
-
const
|
|
1151
|
-
Array.isArray(c.value) || (c.value = []), c.value.push(
|
|
1152
|
-
}, w = async (
|
|
1153
|
-
Array.isArray(c.value) && (c.value.splice(
|
|
1150
|
+
const L = a(R(i.path.value, Ne));
|
|
1151
|
+
Array.isArray(c.value) || (c.value = []), c.value.push(L), n("add"), t.appearance === "tabs" && (await $e(), A.value = b.value[b.value.length - 1]?.hash), await $e(), P(u.value.length + 1);
|
|
1152
|
+
}, w = async (L) => {
|
|
1153
|
+
Array.isArray(c.value) && (c.value.splice(L, 1), c.value.length === 0 && !m.value.required && (c.value = null)), n("remove", L), t.appearance === "tabs" && (A.value = b.value[Math.max(0, L - 1)]?.hash);
|
|
1154
1154
|
}, S = at("root");
|
|
1155
|
-
function P(
|
|
1155
|
+
function P(L) {
|
|
1156
1156
|
if (!S.value)
|
|
1157
1157
|
return;
|
|
1158
|
-
const M = Math.max(0, Math.min(
|
|
1158
|
+
const M = Math.max(0, Math.min(L, u.value.length - 1)), I = S.value.querySelector(`[data-index="${M}"]`);
|
|
1159
1159
|
if (!I)
|
|
1160
1160
|
return;
|
|
1161
|
-
|
|
1161
|
+
x(I)?.focus();
|
|
1162
1162
|
}
|
|
1163
|
-
function
|
|
1164
|
-
const M =
|
|
1165
|
-
return M ? M.matches(
|
|
1163
|
+
function x(L) {
|
|
1164
|
+
const M = L.querySelector('[data-autofocus="true"]');
|
|
1165
|
+
return M ? M.matches(Re) ? M : M.querySelector(Re) : L.querySelector(Re);
|
|
1166
1166
|
}
|
|
1167
|
-
const
|
|
1168
|
-
const { appearance:
|
|
1169
|
-
return
|
|
1167
|
+
const E = k(() => {
|
|
1168
|
+
const { appearance: L, stickyTabs: M } = t;
|
|
1169
|
+
return L !== "tabs" || M == null || M === !1 ? null : typeof M == "number" ? `${t.stickyTabs}px` : typeof M == "string" ? M : "0";
|
|
1170
1170
|
});
|
|
1171
|
-
return (
|
|
1172
|
-
const I =
|
|
1171
|
+
return (L, M) => {
|
|
1172
|
+
const I = D("KAlert"), B = D("KLabel"), H = D("KButton"), ee = D("KTooltip"), fe = D("KTabs");
|
|
1173
1173
|
return i.error ? (_(), T(I, {
|
|
1174
1174
|
key: 0,
|
|
1175
1175
|
appearance: "danger",
|
|
1176
1176
|
message: i.error.message
|
|
1177
|
-
}, null, 8, ["message"])) :
|
|
1177
|
+
}, null, 8, ["message"])) : X((_(), K("div", {
|
|
1178
1178
|
key: 1,
|
|
1179
1179
|
ref_key: "root",
|
|
1180
1180
|
ref: S,
|
|
@@ -1190,19 +1190,19 @@ const be = /* @__PURE__ */ N({
|
|
|
1190
1190
|
class: "ff-array-field-header",
|
|
1191
1191
|
"data-testid": `ff-array-header-${i.path.value}`
|
|
1192
1192
|
}, [
|
|
1193
|
-
|
|
1193
|
+
$(B, W({ class: "ff-array-field-label" }, o(m), {
|
|
1194
1194
|
"data-testid": `ff-label-${i.path.value}`,
|
|
1195
1195
|
"tooltip-attributes": o(m).labelAttributes.tooltipAttributes
|
|
1196
|
-
}),
|
|
1197
|
-
default:
|
|
1196
|
+
}), Y({
|
|
1197
|
+
default: q(() => [
|
|
1198
1198
|
pe(ce(o(m).label) + " ", 1)
|
|
1199
1199
|
]),
|
|
1200
1200
|
_: 2
|
|
1201
1201
|
}, [
|
|
1202
1202
|
o(m).labelAttributes?.info ? {
|
|
1203
1203
|
name: "tooltip",
|
|
1204
|
-
fn:
|
|
1205
|
-
|
|
1204
|
+
fn: q(() => [
|
|
1205
|
+
F(L.$slots, "tooltip", {}, () => [
|
|
1206
1206
|
U("div", {
|
|
1207
1207
|
innerHTML: o(m).labelAttributes.info
|
|
1208
1208
|
}, null, 8, ka)
|
|
@@ -1219,8 +1219,8 @@ const be = /* @__PURE__ */ N({
|
|
|
1219
1219
|
icon: "",
|
|
1220
1220
|
onClick: C
|
|
1221
1221
|
}, {
|
|
1222
|
-
default:
|
|
1223
|
-
|
|
1222
|
+
default: q(() => [
|
|
1223
|
+
$(o(je))
|
|
1224
1224
|
]),
|
|
1225
1225
|
_: 1
|
|
1226
1226
|
}, 8, ["aria-label", "data-testid"])) : z("", !0)
|
|
@@ -1236,9 +1236,9 @@ const be = /* @__PURE__ */ N({
|
|
|
1236
1236
|
"data-index": O,
|
|
1237
1237
|
"data-testid": `ff-array-item-${i.path.value}.${O}`
|
|
1238
1238
|
}, {
|
|
1239
|
-
default:
|
|
1239
|
+
default: q(() => [
|
|
1240
1240
|
U("div", Ta, [
|
|
1241
|
-
|
|
1241
|
+
L.$slots.item ? F(L.$slots, "item", {
|
|
1242
1242
|
key: 0,
|
|
1243
1243
|
autofocus: !0,
|
|
1244
1244
|
fieldName: String(O),
|
|
@@ -1254,12 +1254,12 @@ const be = /* @__PURE__ */ N({
|
|
|
1254
1254
|
name: String(O)
|
|
1255
1255
|
}, null, 8, ["name"]))
|
|
1256
1256
|
]),
|
|
1257
|
-
|
|
1257
|
+
$(ee, {
|
|
1258
1258
|
class: "ff-array-field-item-remove-tooltip",
|
|
1259
1259
|
text: o(r)("actions.remove_entity", { entity: s.value })
|
|
1260
1260
|
}, {
|
|
1261
|
-
default:
|
|
1262
|
-
|
|
1261
|
+
default: q(() => [
|
|
1262
|
+
$(H, {
|
|
1263
1263
|
appearance: "tertiary",
|
|
1264
1264
|
"aria-label": o(r)("actions.remove_entity", { entity: s.value }),
|
|
1265
1265
|
class: "ff-array-field-item-remove",
|
|
@@ -1267,8 +1267,8 @@ const be = /* @__PURE__ */ N({
|
|
|
1267
1267
|
icon: "",
|
|
1268
1268
|
onClick: Pe((yt) => w(O), ["stop"])
|
|
1269
1269
|
}, {
|
|
1270
|
-
default:
|
|
1271
|
-
|
|
1270
|
+
default: q(() => [
|
|
1271
|
+
$(o(st))
|
|
1272
1272
|
]),
|
|
1273
1273
|
_: 1
|
|
1274
1274
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1279,39 +1279,39 @@ const be = /* @__PURE__ */ N({
|
|
|
1279
1279
|
_: 2
|
|
1280
1280
|
}, 1032, ["class", "data-index", "data-testid"]))), 128))
|
|
1281
1281
|
], 8, Sa),
|
|
1282
|
-
|
|
1282
|
+
$(H, {
|
|
1283
1283
|
appearance: "tertiary",
|
|
1284
1284
|
"aria-label": o(r)("actions.add_entity", { entity: s.value }),
|
|
1285
1285
|
class: "ff-array-field-add-item-btn",
|
|
1286
1286
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1287
1287
|
onClick: C
|
|
1288
1288
|
}, {
|
|
1289
|
-
default:
|
|
1290
|
-
|
|
1289
|
+
default: q(() => [
|
|
1290
|
+
$(o(je)),
|
|
1291
1291
|
pe(" " + ce(o(r)("actions.add_entity", { entity: s.value })), 1)
|
|
1292
1292
|
]),
|
|
1293
1293
|
_: 1
|
|
1294
1294
|
}, 8, ["aria-label", "data-testid"])
|
|
1295
|
-
], 64)) : u.value.length ? (_(), T(o(
|
|
1295
|
+
], 64)) : u.value.length ? (_(), T(o(Ee), {
|
|
1296
1296
|
key: 2,
|
|
1297
1297
|
"data-testid": `ff-array-tab-container-${i.path.value}`
|
|
1298
1298
|
}, {
|
|
1299
|
-
default:
|
|
1300
|
-
|
|
1299
|
+
default: q(() => [
|
|
1300
|
+
$(fe, {
|
|
1301
1301
|
modelValue: A.value,
|
|
1302
1302
|
"onUpdate:modelValue": M[0] || (M[0] = (re) => A.value = re),
|
|
1303
1303
|
"data-testid": `ff-array-tabs-${i.path.value}`,
|
|
1304
1304
|
tabs: b.value
|
|
1305
|
-
},
|
|
1305
|
+
}, Y({ _: 2 }, [
|
|
1306
1306
|
se(u.value, (re, O) => ({
|
|
1307
1307
|
name: o(f)(re, O),
|
|
1308
|
-
fn:
|
|
1308
|
+
fn: q(() => [
|
|
1309
1309
|
U("div", {
|
|
1310
1310
|
class: "ff-array-field-item",
|
|
1311
1311
|
"data-index": O,
|
|
1312
1312
|
"data-testid": `ff-array-item-${i.path.value}.${O}`
|
|
1313
1313
|
}, [
|
|
1314
|
-
|
|
1314
|
+
L.$slots.item ? F(L.$slots, "item", {
|
|
1315
1315
|
key: 0,
|
|
1316
1316
|
autofocus: !0,
|
|
1317
1317
|
fieldName: String(O),
|
|
@@ -1326,9 +1326,9 @@ const be = /* @__PURE__ */ N({
|
|
|
1326
1326
|
})),
|
|
1327
1327
|
se(u.value, (re, O) => ({
|
|
1328
1328
|
name: `${o(f)(re, O)}-anchor`,
|
|
1329
|
-
fn:
|
|
1329
|
+
fn: q(() => [
|
|
1330
1330
|
pe(ce(v(re, O)) + " ", 1),
|
|
1331
|
-
|
|
1331
|
+
$(H, {
|
|
1332
1332
|
appearance: "tertiary",
|
|
1333
1333
|
"aria-label": o(r)("actions.remove_entity", { entity: s.value }),
|
|
1334
1334
|
class: "ff-array-field-item-remove",
|
|
@@ -1336,8 +1336,8 @@ const be = /* @__PURE__ */ N({
|
|
|
1336
1336
|
icon: "",
|
|
1337
1337
|
onClick: Pe((yt) => w(O), ["stop"])
|
|
1338
1338
|
}, {
|
|
1339
|
-
default:
|
|
1340
|
-
|
|
1339
|
+
default: q(() => [
|
|
1340
|
+
$(o(jt))
|
|
1341
1341
|
]),
|
|
1342
1342
|
_: 1
|
|
1343
1343
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1352,7 +1352,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1352
1352
|
]);
|
|
1353
1353
|
};
|
|
1354
1354
|
}
|
|
1355
|
-
}), Ia = /* @__PURE__ */
|
|
1355
|
+
}), Ia = /* @__PURE__ */ G(Pa, [["__scopeId", "data-v-04b60981"]]), La = /* @__PURE__ */ N({
|
|
1356
1356
|
__name: "SlideTransition",
|
|
1357
1357
|
setup(e) {
|
|
1358
1358
|
const l = [
|
|
@@ -1418,13 +1418,13 @@ const be = /* @__PURE__ */ N({
|
|
|
1418
1418
|
onEnter: c,
|
|
1419
1419
|
onLeave: m
|
|
1420
1420
|
}, {
|
|
1421
|
-
default:
|
|
1422
|
-
|
|
1421
|
+
default: q(() => [
|
|
1422
|
+
F(s.$slots, "default", {}, void 0, !0)
|
|
1423
1423
|
]),
|
|
1424
1424
|
_: 3
|
|
1425
1425
|
}));
|
|
1426
1426
|
}
|
|
1427
|
-
}),
|
|
1427
|
+
}), qa = /* @__PURE__ */ G(La, [["__scopeId", "data-v-4969409d"]]), Ma = { class: "ff-entity-checks-list" }, xa = /* @__PURE__ */ N({
|
|
1428
1428
|
__name: "EntityChecksAlert",
|
|
1429
1429
|
props: {
|
|
1430
1430
|
entityChecks: {},
|
|
@@ -1460,12 +1460,12 @@ const be = /* @__PURE__ */ N({
|
|
|
1460
1460
|
return Array.isArray(e.visibleFields) ? a.filter((d) => e.visibleFields.includes(d.split(".")[0])) : a;
|
|
1461
1461
|
}
|
|
1462
1462
|
return (a, d) => {
|
|
1463
|
-
const c =
|
|
1463
|
+
const c = D("KAlert");
|
|
1464
1464
|
return t.value ? (_(), T(c, {
|
|
1465
1465
|
key: 0,
|
|
1466
1466
|
"data-testid": "ff-entity-checks-alert"
|
|
1467
1467
|
}, {
|
|
1468
|
-
default:
|
|
1468
|
+
default: q(() => [
|
|
1469
1469
|
U("ul", Ma, [
|
|
1470
1470
|
(_(!0), K(te, null, se(t.value, (p) => (_(), K("li", {
|
|
1471
1471
|
key: p,
|
|
@@ -1477,10 +1477,10 @@ const be = /* @__PURE__ */ N({
|
|
|
1477
1477
|
})) : z("", !0);
|
|
1478
1478
|
};
|
|
1479
1479
|
}
|
|
1480
|
-
}), Qe = /* @__PURE__ */
|
|
1480
|
+
}), Qe = /* @__PURE__ */ G(xa, [["__scopeId", "data-v-374c59bc"]]), Ra = ["data-testid"], $a = ["data-testid"], Va = ["data-testid"], Ka = { class: "ff-object-field-header-toggle" }, Ea = ["aria-controls", "aria-expanded", "aria-label", "data-testid", "disabled"], ja = ["innerHTML"], Oa = ["data-testid"], Fa = {
|
|
1481
1481
|
key: 0,
|
|
1482
1482
|
class: "indent-guide"
|
|
1483
|
-
},
|
|
1483
|
+
}, Da = /* @__PURE__ */ N({
|
|
1484
1484
|
inheritAttrs: !1,
|
|
1485
1485
|
__name: "ObjectField",
|
|
1486
1486
|
props: /* @__PURE__ */ Ke({
|
|
@@ -1506,16 +1506,16 @@ const be = /* @__PURE__ */ N({
|
|
|
1506
1506
|
}),
|
|
1507
1507
|
emits: ["update:added", "update:expanded"],
|
|
1508
1508
|
setup(e) {
|
|
1509
|
-
const l = kt(), t = ue(e, ["defaultAdded", "collapsible", "omit", "required", "asChild", "resetLabelPath", "fieldsOrder"]), { value: n, hide: r, ...a } = Z(
|
|
1509
|
+
const l = kt(), t = ue(e, ["defaultAdded", "collapsible", "omit", "required", "asChild", "resetLabelPath", "fieldsOrder"]), { value: n, hide: r, ...a } = Z(j(t, "name")), {
|
|
1510
1510
|
getSchema: d,
|
|
1511
1511
|
getDefault: c,
|
|
1512
1512
|
useCurrentRenderRules: p
|
|
1513
1513
|
} = ne(), i = p({
|
|
1514
1514
|
fieldPath: a.path,
|
|
1515
|
-
rules:
|
|
1516
|
-
omittedFields:
|
|
1515
|
+
rules: j(t, "renderRules"),
|
|
1516
|
+
omittedFields: j(() => e.omit),
|
|
1517
1517
|
parentValue: n
|
|
1518
|
-
}), m =
|
|
1518
|
+
}), m = Ve(e, "added"), g = Ve(e, "expanded"), s = k(() => {
|
|
1519
1519
|
if (a.ancestors?.value) {
|
|
1520
1520
|
const w = a.ancestors.value.parent;
|
|
1521
1521
|
if (w?.path)
|
|
@@ -1539,39 +1539,39 @@ const be = /* @__PURE__ */ N({
|
|
|
1539
1539
|
function C() {
|
|
1540
1540
|
m.value ? n.value = c(a.path.value) : n.value = null;
|
|
1541
1541
|
}
|
|
1542
|
-
return
|
|
1542
|
+
return J(h, (w) => {
|
|
1543
1543
|
e.collapsible && (g.value = w);
|
|
1544
1544
|
}), St(() => {
|
|
1545
1545
|
if (a.error || !n) return;
|
|
1546
1546
|
const w = n.value != null;
|
|
1547
1547
|
m.value = w, (f.value.required || w) && (g.value = !0);
|
|
1548
1548
|
}), (w, S) => {
|
|
1549
|
-
const P =
|
|
1549
|
+
const P = D("KAlert"), x = D("KInputSwitch");
|
|
1550
1550
|
return _(), K(te, null, [
|
|
1551
1551
|
(_(), T(oe(w.$slots[o(Se)]))),
|
|
1552
1552
|
a.error ? (_(), T(P, {
|
|
1553
1553
|
key: 0,
|
|
1554
1554
|
appearance: "danger",
|
|
1555
1555
|
message: a.error.message
|
|
1556
|
-
}, null, 8, ["message"])) : y.value ?
|
|
1556
|
+
}, null, 8, ["message"])) : y.value ? X((_(), K("div", W({
|
|
1557
1557
|
key: 1,
|
|
1558
1558
|
class: "ff-object-field ff-object-field-as-child"
|
|
1559
1559
|
}, w.$attrs, {
|
|
1560
1560
|
"data-testid": `ff-object-${a.path.value}`
|
|
1561
1561
|
}), [
|
|
1562
|
-
|
|
1563
|
-
|
|
1562
|
+
F(w.$slots, "default", {}, () => [
|
|
1563
|
+
$(Qe, {
|
|
1564
1564
|
"entity-checks": a.schema.value?.entity_checks,
|
|
1565
1565
|
"visible-fields": b.value
|
|
1566
1566
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1567
|
-
(_(!0), K(te, null, se(v.value, (
|
|
1568
|
-
key: Object.keys(
|
|
1569
|
-
name: Object.keys(
|
|
1567
|
+
(_(!0), K(te, null, se(v.value, (E) => (_(), T(ge, {
|
|
1568
|
+
key: Object.keys(E)[0],
|
|
1569
|
+
name: Object.keys(E)[0]
|
|
1570
1570
|
}, null, 8, ["name"]))), 128))
|
|
1571
1571
|
], !0)
|
|
1572
|
-
], 16,
|
|
1572
|
+
], 16, Ra)), [
|
|
1573
1573
|
[Q, !o(r)]
|
|
1574
|
-
]) :
|
|
1574
|
+
]) : X((_(), K("div", W({
|
|
1575
1575
|
key: 2,
|
|
1576
1576
|
class: ["ff-object-field", { "ff-object-field-collapsed": !g.value }],
|
|
1577
1577
|
"data-testid": `ff-object-${a.path.value}`
|
|
@@ -1591,14 +1591,14 @@ const be = /* @__PURE__ */ N({
|
|
|
1591
1591
|
type: "button",
|
|
1592
1592
|
onClick: Pe(A, ["prevent", "stop"])
|
|
1593
1593
|
}, [
|
|
1594
|
-
|
|
1594
|
+
$(o(Ot), {
|
|
1595
1595
|
class: Ce(["ff-object-field-toggle-btn-trigger-icon", { "collapse-expanded": g.value }]),
|
|
1596
1596
|
"data-testid": `ff-object-toggle-trigger-icon-${a.path.value}`,
|
|
1597
1597
|
decorative: "",
|
|
1598
|
-
size: `var(--kui-icon-size-30, ${o(
|
|
1598
|
+
size: `var(--kui-icon-size-30, ${o(Ft)})`
|
|
1599
1599
|
}, null, 8, ["class", "data-testid", "size"])
|
|
1600
|
-
], 8,
|
|
1601
|
-
u.value ? z("", !0) : (_(), T(o(
|
|
1600
|
+
], 8, Ea),
|
|
1601
|
+
u.value ? z("", !0) : (_(), T(o($t), W({
|
|
1602
1602
|
key: 0,
|
|
1603
1603
|
class: "ff-object-field-label",
|
|
1604
1604
|
"data-testid": `ff-label-${a.path.value}`
|
|
@@ -1607,64 +1607,64 @@ const be = /* @__PURE__ */ N({
|
|
|
1607
1607
|
required: !1
|
|
1608
1608
|
}, {
|
|
1609
1609
|
"tooltip-attributes": o(f).labelAttributes.tooltipAttributes
|
|
1610
|
-
}),
|
|
1611
|
-
default:
|
|
1610
|
+
}), Y({
|
|
1611
|
+
default: q(() => [
|
|
1612
1612
|
pe(ce(o(f).label) + " ", 1)
|
|
1613
1613
|
]),
|
|
1614
1614
|
_: 2
|
|
1615
1615
|
}, [
|
|
1616
1616
|
o(f).labelAttributes?.info ? {
|
|
1617
1617
|
name: "tooltip",
|
|
1618
|
-
fn:
|
|
1619
|
-
|
|
1618
|
+
fn: q(() => [
|
|
1619
|
+
F(w.$slots, "tooltip", {}, () => [
|
|
1620
1620
|
U("div", {
|
|
1621
1621
|
innerHTML: o(f).labelAttributes.info
|
|
1622
|
-
}, null, 8,
|
|
1622
|
+
}, null, 8, ja)
|
|
1623
1623
|
], !0)
|
|
1624
1624
|
]),
|
|
1625
1625
|
key: "0"
|
|
1626
1626
|
} : void 0
|
|
1627
1627
|
]), 1040, ["data-testid", "tooltip-attributes"]))
|
|
1628
1628
|
]),
|
|
1629
|
-
o(f).required ? z("", !0) : (_(), T(
|
|
1629
|
+
o(f).required ? z("", !0) : (_(), T(x, {
|
|
1630
1630
|
key: 0,
|
|
1631
1631
|
modelValue: m.value,
|
|
1632
1632
|
"onUpdate:modelValue": [
|
|
1633
|
-
S[0] || (S[0] = (
|
|
1633
|
+
S[0] || (S[0] = (E) => m.value = E),
|
|
1634
1634
|
C
|
|
1635
1635
|
],
|
|
1636
1636
|
"data-testid": `ff-object-switch-${a.path.value}`
|
|
1637
1637
|
}, null, 8, ["modelValue", "data-testid"]))
|
|
1638
|
-
], 8,
|
|
1639
|
-
|
|
1640
|
-
default:
|
|
1638
|
+
], 8, Va),
|
|
1639
|
+
$(qa, null, {
|
|
1640
|
+
default: q(() => [
|
|
1641
1641
|
g.value ? (_(), K("div", {
|
|
1642
1642
|
key: 0,
|
|
1643
1643
|
class: "ff-object-field-content",
|
|
1644
1644
|
"data-testid": `ff-object-content-${a.path.value}`
|
|
1645
1645
|
}, [
|
|
1646
|
-
|
|
1647
|
-
|
|
1646
|
+
F(w.$slots, "default", {}, () => [
|
|
1647
|
+
$(Qe, {
|
|
1648
1648
|
"entity-checks": a.schema.value?.entity_checks,
|
|
1649
1649
|
"visible-fields": b.value
|
|
1650
1650
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1651
|
-
(_(!0), K(te, null, se(v.value, (
|
|
1652
|
-
key: Object.keys(
|
|
1653
|
-
name: Object.keys(
|
|
1651
|
+
(_(!0), K(te, null, se(v.value, (E) => (_(), T(ge, {
|
|
1652
|
+
key: Object.keys(E)[0],
|
|
1653
|
+
name: Object.keys(E)[0]
|
|
1654
1654
|
}, null, 8, ["name"]))), 128))
|
|
1655
1655
|
], !0)
|
|
1656
1656
|
], 8, Oa)) : z("", !0)
|
|
1657
1657
|
]),
|
|
1658
1658
|
_: 3
|
|
1659
1659
|
}),
|
|
1660
|
-
g.value ? (_(), K("div",
|
|
1661
|
-
], 16,
|
|
1660
|
+
g.value ? (_(), K("div", Fa)) : z("", !0)
|
|
1661
|
+
], 16, $a)), [
|
|
1662
1662
|
[Q, !o(r)]
|
|
1663
1663
|
])
|
|
1664
1664
|
], 64);
|
|
1665
1665
|
};
|
|
1666
1666
|
}
|
|
1667
|
-
}), Ba = /* @__PURE__ */
|
|
1667
|
+
}), Ba = /* @__PURE__ */ G(Da, [["__scopeId", "data-v-7a5e2610"]]), Ua = {
|
|
1668
1668
|
key: 1,
|
|
1669
1669
|
class: "ff-number-field-wrapper"
|
|
1670
1670
|
}, Na = ["innerHTML"], za = /* @__PURE__ */ N({
|
|
@@ -1689,7 +1689,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1689
1689
|
},
|
|
1690
1690
|
emits: ["update:modelValue"],
|
|
1691
1691
|
setup(e, { emit: l }) {
|
|
1692
|
-
const t = ue(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: n, hide: r, ...a } = Z(
|
|
1692
|
+
const t = ue(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: n, hide: r, ...a } = Z(j(() => e.name)), d = ie(a.path, t), { i18n: c } = ve(), p = k(() => {
|
|
1693
1693
|
const b = a.schema?.value;
|
|
1694
1694
|
if (typeof b.gt == "number")
|
|
1695
1695
|
return { min: b.type === "integer" ? b.gt + 1 : b.gt };
|
|
@@ -1718,13 +1718,13 @@ const be = /* @__PURE__ */ N({
|
|
|
1718
1718
|
}
|
|
1719
1719
|
const f = ke(it, void 0), h = k(() => ({ referenceable: y.value })), y = k(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!a.schema.value?.referenceable), v = k(() => y.value ? "text" : "number");
|
|
1720
1720
|
return (b, A) => {
|
|
1721
|
-
const C =
|
|
1721
|
+
const C = D("KAlert");
|
|
1722
1722
|
return a.error ? (_(), T(C, {
|
|
1723
1723
|
key: 0,
|
|
1724
1724
|
appearance: "danger",
|
|
1725
1725
|
message: a.error.message
|
|
1726
|
-
}, null, 8, ["message"])) :
|
|
1727
|
-
|
|
1726
|
+
}, null, 8, ["message"])) : X((_(), K("div", Ua, [
|
|
1727
|
+
$(be, W({ class: "ff-number-field" }, {
|
|
1728
1728
|
...o(d),
|
|
1729
1729
|
min: p.value.min,
|
|
1730
1730
|
max: p.value.max
|
|
@@ -1734,11 +1734,11 @@ const be = /* @__PURE__ */ N({
|
|
|
1734
1734
|
"model-value": g.value,
|
|
1735
1735
|
type: v.value,
|
|
1736
1736
|
"onUpdate:modelValue": s
|
|
1737
|
-
}),
|
|
1737
|
+
}), Y({ _: 2 }, [
|
|
1738
1738
|
o(d).labelAttributes?.info ? {
|
|
1739
1739
|
name: "label-tooltip",
|
|
1740
|
-
fn:
|
|
1741
|
-
|
|
1740
|
+
fn: q(() => [
|
|
1741
|
+
F(b.$slots, "tooltip", {}, () => [
|
|
1742
1742
|
U("div", {
|
|
1743
1743
|
innerHTML: o(d).labelAttributes.info
|
|
1744
1744
|
}, null, 8, Na)
|
|
@@ -1764,7 +1764,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1764
1764
|
]);
|
|
1765
1765
|
};
|
|
1766
1766
|
}
|
|
1767
|
-
}), Ha = /* @__PURE__ */
|
|
1767
|
+
}), Ha = /* @__PURE__ */ G(za, [["__scopeId", "data-v-f303431f"]]), Wa = ["innerHTML"], Ga = /* @__PURE__ */ N({
|
|
1768
1768
|
__name: "EnumField",
|
|
1769
1769
|
props: /* @__PURE__ */ Ke({
|
|
1770
1770
|
labelAttributes: {},
|
|
@@ -1803,25 +1803,25 @@ const be = /* @__PURE__ */ N({
|
|
|
1803
1803
|
emits: /* @__PURE__ */ Ke(["update"], ["update:modelValue"]),
|
|
1804
1804
|
setup(e, { emit: l }) {
|
|
1805
1805
|
const t = l, n = ue(e, ["name", "items", "multiple", "autofocus"]), { getSelectItems: r } = ne(), { value: a, hide: d, ...c } = Z(
|
|
1806
|
-
|
|
1806
|
+
j(() => e.name)
|
|
1807
1807
|
), p = ie(c.path, n);
|
|
1808
1808
|
function i(f) {
|
|
1809
1809
|
return s.value && Array.isArray(f) && f.length === 0 && !p.value.required ? null : f;
|
|
1810
1810
|
}
|
|
1811
|
-
const m =
|
|
1811
|
+
const m = Ve(e, "modelValue", {
|
|
1812
1812
|
// If multiple and value is null/undefined, return empty array for v-model
|
|
1813
1813
|
get: () => s.value && a?.value == null ? [] : a.value,
|
|
1814
1814
|
set: (f) => {
|
|
1815
1815
|
a.value = i(f);
|
|
1816
1816
|
}
|
|
1817
|
-
}), g = k(() => e.items ? e.items : c.path ? r(c.path.value) : []), s = k(() => e.multiple !== void 0 ? e.multiple : c.schema.value?.type === "set"), u = k(() => s.value ?
|
|
1817
|
+
}), g = k(() => e.items ? e.items : c.path ? r(c.path.value) : []), s = k(() => e.multiple !== void 0 ? e.multiple : c.schema.value?.type === "set"), u = k(() => s.value ? Vt : Kt);
|
|
1818
1818
|
return (f, h) => {
|
|
1819
|
-
const y =
|
|
1819
|
+
const y = D("KAlert");
|
|
1820
1820
|
return c.error ? (_(), T(y, {
|
|
1821
1821
|
key: 0,
|
|
1822
1822
|
appearance: "danger",
|
|
1823
1823
|
message: c.error.message
|
|
1824
|
-
}, null, 8, ["message"])) :
|
|
1824
|
+
}, null, 8, ["message"])) : X((_(), T(o(u), W({ key: 1 }, { ...n, ...o(p) }, {
|
|
1825
1825
|
modelValue: m.value,
|
|
1826
1826
|
"onUpdate:modelValue": [
|
|
1827
1827
|
h[0] || (h[0] = (v) => m.value = v),
|
|
@@ -1833,11 +1833,11 @@ const be = /* @__PURE__ */ N({
|
|
|
1833
1833
|
"data-testid": `ff-${c.path.value}`,
|
|
1834
1834
|
items: g.value,
|
|
1835
1835
|
"kpop-attributes": { "data-testid": `ff-enum-${c.path.value}-items` }
|
|
1836
|
-
}),
|
|
1836
|
+
}), Y({ _: 2 }, [
|
|
1837
1837
|
"tooltip" in f.$slots || o(p).labelAttributes?.info ? {
|
|
1838
1838
|
name: "label-tooltip",
|
|
1839
|
-
fn:
|
|
1840
|
-
|
|
1839
|
+
fn: q(() => [
|
|
1840
|
+
F(f.$slots, "tooltip", {}, () => [
|
|
1841
1841
|
U("div", {
|
|
1842
1842
|
innerHTML: o(p).labelAttributes.info
|
|
1843
1843
|
}, null, 8, Wa)
|
|
@@ -1847,8 +1847,8 @@ const be = /* @__PURE__ */ N({
|
|
|
1847
1847
|
} : void 0,
|
|
1848
1848
|
f.$slots["item-label"] ? {
|
|
1849
1849
|
name: "item-template",
|
|
1850
|
-
fn:
|
|
1851
|
-
|
|
1850
|
+
fn: q(({ item: v }) => [
|
|
1851
|
+
F(f.$slots, "item-label", Be(tt(v)), void 0, !0)
|
|
1852
1852
|
]),
|
|
1853
1853
|
key: "1"
|
|
1854
1854
|
} : void 0
|
|
@@ -1857,7 +1857,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1857
1857
|
]);
|
|
1858
1858
|
};
|
|
1859
1859
|
}
|
|
1860
|
-
}), Te = /* @__PURE__ */
|
|
1860
|
+
}), Te = /* @__PURE__ */ G(Ga, [["__scopeId", "data-v-b283cc11"]]), Ja = ["data-testid"], Ya = ["innerHTML"], Xa = /* @__PURE__ */ N({
|
|
1861
1861
|
inheritAttrs: !1,
|
|
1862
1862
|
__name: "JsonField",
|
|
1863
1863
|
props: {
|
|
@@ -1867,7 +1867,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1867
1867
|
},
|
|
1868
1868
|
emits: ["update:modelValue"],
|
|
1869
1869
|
setup(e, { emit: l }) {
|
|
1870
|
-
const t = ye(), n = ue(e, ["autofocus", "name"]), r = l, { value: a, hide: d, ...c } = Z(
|
|
1870
|
+
const t = ye(), n = ue(e, ["autofocus", "name"]), r = l, { value: a, hide: d, ...c } = Z(j(() => e.name)), p = ie(c.path, j({ ...n, ...t })), i = le("");
|
|
1871
1871
|
function m(s) {
|
|
1872
1872
|
i.value = s;
|
|
1873
1873
|
let u = s || null;
|
|
@@ -1879,7 +1879,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1879
1879
|
a.value = u, r("update:modelValue", u);
|
|
1880
1880
|
}
|
|
1881
1881
|
const g = k(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1882
|
-
return
|
|
1882
|
+
return J(a, (s) => {
|
|
1883
1883
|
if (s && typeof s == "object") {
|
|
1884
1884
|
try {
|
|
1885
1885
|
const u = JSON.parse(i.value);
|
|
@@ -1891,16 +1891,16 @@ const be = /* @__PURE__ */ N({
|
|
|
1891
1891
|
}
|
|
1892
1892
|
i.value = s || "";
|
|
1893
1893
|
}, { immediate: !0 }), (s, u) => {
|
|
1894
|
-
const f =
|
|
1894
|
+
const f = D("KAlert");
|
|
1895
1895
|
return c.error ? (_(), T(f, {
|
|
1896
1896
|
key: 0,
|
|
1897
1897
|
appearance: "danger",
|
|
1898
1898
|
message: c.error.message
|
|
1899
|
-
}, null, 8, ["message"])) :
|
|
1899
|
+
}, null, 8, ["message"])) : X((_(), K("div", {
|
|
1900
1900
|
key: 1,
|
|
1901
1901
|
"data-testid": `ff-json-${c.path.value}`
|
|
1902
1902
|
}, [
|
|
1903
|
-
|
|
1903
|
+
$(be, W(o(p), {
|
|
1904
1904
|
class: "ff-json-field",
|
|
1905
1905
|
"data-1p-ignore": g.value,
|
|
1906
1906
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
@@ -1908,25 +1908,25 @@ const be = /* @__PURE__ */ N({
|
|
|
1908
1908
|
"model-value": i.value ?? "",
|
|
1909
1909
|
multiline: "",
|
|
1910
1910
|
"onUpdate:modelValue": m
|
|
1911
|
-
}),
|
|
1911
|
+
}), Y({ _: 2 }, [
|
|
1912
1912
|
o(p).labelAttributes?.info ? {
|
|
1913
1913
|
name: "label-tooltip",
|
|
1914
|
-
fn:
|
|
1915
|
-
|
|
1914
|
+
fn: q(() => [
|
|
1915
|
+
F(s.$slots, "tooltip", {}, () => [
|
|
1916
1916
|
U("div", {
|
|
1917
1917
|
innerHTML: o(p).labelAttributes.info
|
|
1918
|
-
}, null, 8,
|
|
1918
|
+
}, null, 8, Ya)
|
|
1919
1919
|
], !0)
|
|
1920
1920
|
]),
|
|
1921
1921
|
key: "0"
|
|
1922
1922
|
} : void 0
|
|
1923
1923
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1924
|
-
], 8,
|
|
1924
|
+
], 8, Ja)), [
|
|
1925
1925
|
[Q, !o(d)]
|
|
1926
1926
|
]);
|
|
1927
1927
|
};
|
|
1928
1928
|
}
|
|
1929
|
-
}), Qa = /* @__PURE__ */
|
|
1929
|
+
}), Qa = /* @__PURE__ */ G(Xa, [["__scopeId", "data-v-6f302da9"]]), Za = ["innerHTML"], en = /* @__PURE__ */ N({
|
|
1930
1930
|
inheritAttrs: !1,
|
|
1931
1931
|
__name: "ForeignField",
|
|
1932
1932
|
props: {
|
|
@@ -1945,15 +1945,15 @@ const be = /* @__PURE__ */ N({
|
|
|
1945
1945
|
},
|
|
1946
1946
|
emits: ["update:modelValue"],
|
|
1947
1947
|
setup(e, { emit: l }) {
|
|
1948
|
-
const t = ye(), { i18n: { t: n } } = ve(), r = ue(e, ["autofocus", "name"]), a = l, { value: d, hide: c, ...p } = Z(
|
|
1948
|
+
const t = ye(), { i18n: { t: n } } = ve(), r = ue(e, ["autofocus", "name"]), a = l, { value: d, hide: c, ...p } = Z(j(() => e.name));
|
|
1949
1949
|
if (p.error)
|
|
1950
1950
|
throw new Error(p.error.message);
|
|
1951
|
-
const i = ie(p.path,
|
|
1951
|
+
const i = ie(p.path, j({ ...r, ...t })), m = d.value ? d.value.id : null, g = k(() => i.value.placeholder ? i.value.placeholder : n("plugins.free-form.foreign_placeholder", { entity: p.schema.value?.reference ?? "entity" })), s = le(m ?? "");
|
|
1952
1952
|
function u(h) {
|
|
1953
1953
|
m !== void 0 && h === "" && h !== m ? (d.value = null, a("update:modelValue", null)) : (d.value = { id: h.trim() }, a("update:modelValue", d.value));
|
|
1954
1954
|
}
|
|
1955
1955
|
const f = k(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1956
|
-
return (h, y) =>
|
|
1956
|
+
return (h, y) => X((_(), T(be, W(o(i), {
|
|
1957
1957
|
class: "ff-foreign-field",
|
|
1958
1958
|
"data-1p-ignore": f.value,
|
|
1959
1959
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
@@ -1964,11 +1964,11 @@ const be = /* @__PURE__ */ N({
|
|
|
1964
1964
|
"model-value": s.value,
|
|
1965
1965
|
placeholder: g.value,
|
|
1966
1966
|
"onUpdate:modelValue": u
|
|
1967
|
-
}),
|
|
1967
|
+
}), Y({ _: 2 }, [
|
|
1968
1968
|
o(i).labelAttributes?.info ? {
|
|
1969
1969
|
name: "label-tooltip",
|
|
1970
|
-
fn:
|
|
1971
|
-
|
|
1970
|
+
fn: q(() => [
|
|
1971
|
+
F(h.$slots, "tooltip", {}, () => [
|
|
1972
1972
|
U("div", {
|
|
1973
1973
|
innerHTML: o(i).labelAttributes.info
|
|
1974
1974
|
}, null, 8, Za)
|
|
@@ -1980,7 +1980,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1980
1980
|
[Q, !o(c)]
|
|
1981
1981
|
]);
|
|
1982
1982
|
}
|
|
1983
|
-
}), tn = /* @__PURE__ */
|
|
1983
|
+
}), tn = /* @__PURE__ */ G(en, [["__scopeId", "data-v-8c298e9f"]]), an = ["data-testid"], nn = ["data-testid"], on = ["innerHTML"], rn = { class: "ff-map-field-fields" }, sn = /* @__PURE__ */ N({
|
|
1984
1984
|
__name: "MapField",
|
|
1985
1985
|
props: {
|
|
1986
1986
|
keyPlaceholder: {},
|
|
@@ -1999,28 +1999,28 @@ const be = /* @__PURE__ */ N({
|
|
|
1999
1999
|
removeKey: p,
|
|
2000
2000
|
field: i,
|
|
2001
2001
|
fieldDisplayName: m
|
|
2002
|
-
} = ua(
|
|
2002
|
+
} = ua(j(n, "name"), w), g = ie(i.path, n), s = ["string", "number", "boolean", "integer", "foreign"], u = k(() => n.oneLine ? !0 : i.schema?.value?.type === "map" && s.includes(i.schema.value.values.type) && !n.appearance?.string?.multiline), f = k(() => i.schema?.value?.type === "map" ? i.schema.value.values : void 0), h = k(() => f.value?.type === "string" && !f.value?.one_of), y = k(() => u.value ? "div" : Ee), v = at("root");
|
|
2003
2003
|
function b(S, P) {
|
|
2004
2004
|
n.appearance?.string?.multiline || (S.preventDefault(), P === a.value.length - 1 && c(), A(P + 1));
|
|
2005
2005
|
}
|
|
2006
2006
|
async function A(S) {
|
|
2007
|
-
v.value && (await
|
|
2007
|
+
v.value && (await $e(), v.value.querySelector(`[data-key-input="${S}"]`)?.focus());
|
|
2008
2008
|
}
|
|
2009
2009
|
function C() {
|
|
2010
2010
|
c();
|
|
2011
|
-
const S = a.value.findIndex(([P,
|
|
2011
|
+
const S = a.value.findIndex(([P, x]) => !x);
|
|
2012
2012
|
A(S === -1 ? a.value.length - 1 : S);
|
|
2013
2013
|
}
|
|
2014
2014
|
function w(S) {
|
|
2015
2015
|
r("legacyValueChange", S);
|
|
2016
2016
|
}
|
|
2017
2017
|
return (S, P) => {
|
|
2018
|
-
const
|
|
2019
|
-
return o(i).error ? (_(), T(
|
|
2018
|
+
const x = D("KAlert"), E = D("KLabel"), L = D("KButton"), M = D("KTooltip");
|
|
2019
|
+
return o(i).error ? (_(), T(x, {
|
|
2020
2020
|
key: 0,
|
|
2021
2021
|
appearance: "danger",
|
|
2022
2022
|
message: o(i).error.message
|
|
2023
|
-
}, null, 8, ["message"])) :
|
|
2023
|
+
}, null, 8, ["message"])) : X((_(), K("div", {
|
|
2024
2024
|
key: 1,
|
|
2025
2025
|
ref_key: "root",
|
|
2026
2026
|
ref: v,
|
|
@@ -2032,20 +2032,20 @@ const be = /* @__PURE__ */ N({
|
|
|
2032
2032
|
class: "ff-map-field-header",
|
|
2033
2033
|
"data-testid": `ff-map-header-${o(i).path.value}`
|
|
2034
2034
|
}, [
|
|
2035
|
-
|
|
2035
|
+
$(E, W({ class: "ff-map-field-label" }, o(g).labelAttributes, {
|
|
2036
2036
|
"data-testid": `ff-label-${o(i).path.value}`,
|
|
2037
2037
|
required: o(g).required,
|
|
2038
2038
|
"tooltip-attributes": o(g).labelAttributes.tooltipAttributes
|
|
2039
|
-
}),
|
|
2040
|
-
default:
|
|
2039
|
+
}), Y({
|
|
2040
|
+
default: q(() => [
|
|
2041
2041
|
pe(ce(o(g).label) + " ", 1)
|
|
2042
2042
|
]),
|
|
2043
2043
|
_: 2
|
|
2044
2044
|
}, [
|
|
2045
2045
|
o(g).labelAttributes?.info ? {
|
|
2046
2046
|
name: "tooltip",
|
|
2047
|
-
fn:
|
|
2048
|
-
|
|
2047
|
+
fn: q(() => [
|
|
2048
|
+
F(S.$slots, "tooltip", {}, () => [
|
|
2049
2049
|
U("div", {
|
|
2050
2050
|
innerHTML: o(g).labelAttributes.info
|
|
2051
2051
|
}, null, 8, on)
|
|
@@ -2063,9 +2063,9 @@ const be = /* @__PURE__ */ N({
|
|
|
2063
2063
|
}]),
|
|
2064
2064
|
"data-testid": `ff-map-container-${o(i).path.value}.${H}`
|
|
2065
2065
|
}, {
|
|
2066
|
-
default:
|
|
2066
|
+
default: q(() => [
|
|
2067
2067
|
U("div", rn, [
|
|
2068
|
-
|
|
2068
|
+
$(be, {
|
|
2069
2069
|
class: "ff-map-field-fields-key",
|
|
2070
2070
|
"data-key-input": H,
|
|
2071
2071
|
"data-testid": `ff-map-key-${o(i).path.value}.${H}`,
|
|
@@ -2074,7 +2074,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2074
2074
|
onKeydown: He(Pe((ee) => A(H), ["prevent"]), ["enter"]),
|
|
2075
2075
|
"onUpdate:modelValue": (ee) => o(d)(I, ee)
|
|
2076
2076
|
}, null, 8, ["data-key-input", "data-testid", "model-value", "placeholder", "onKeydown", "onUpdate:modelValue"]),
|
|
2077
|
-
|
|
2077
|
+
F(S.$slots, "default", { keyId: I }, () => [
|
|
2078
2078
|
h.value ? (_(), T(ht, {
|
|
2079
2079
|
key: 0,
|
|
2080
2080
|
"inline-vault-picker": "",
|
|
@@ -2087,19 +2087,19 @@ const be = /* @__PURE__ */ N({
|
|
|
2087
2087
|
}, null, 8, ["name"]))
|
|
2088
2088
|
], !0)
|
|
2089
2089
|
]),
|
|
2090
|
-
|
|
2090
|
+
$(M, {
|
|
2091
2091
|
text: o(t).t("actions.remove_entity", { entity: o(m) })
|
|
2092
2092
|
}, {
|
|
2093
|
-
default:
|
|
2094
|
-
|
|
2093
|
+
default: q(() => [
|
|
2094
|
+
$(L, {
|
|
2095
2095
|
appearance: "tertiary",
|
|
2096
2096
|
"aria-label": o(t).t("actions.remove_entity", { entity: o(m) }),
|
|
2097
2097
|
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${H}`,
|
|
2098
2098
|
icon: "",
|
|
2099
2099
|
onClick: (ee) => o(p)(I)
|
|
2100
2100
|
}, {
|
|
2101
|
-
default:
|
|
2102
|
-
|
|
2101
|
+
default: q(() => [
|
|
2102
|
+
$(o(st))
|
|
2103
2103
|
]),
|
|
2104
2104
|
_: 1
|
|
2105
2105
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -2109,15 +2109,15 @@ const be = /* @__PURE__ */ N({
|
|
|
2109
2109
|
]),
|
|
2110
2110
|
_: 2
|
|
2111
2111
|
}, 1032, ["class", "data-testid"]))), 128)),
|
|
2112
|
-
|
|
2112
|
+
$(L, {
|
|
2113
2113
|
appearance: "tertiary",
|
|
2114
2114
|
"aria-label": o(t).t("actions.add_entity", { entity: o(m) }),
|
|
2115
2115
|
class: "ff-map-field-add-entry-btn",
|
|
2116
2116
|
"data-testid": `ff-map-add-btn-${o(i).path.value}`,
|
|
2117
2117
|
onClick: C
|
|
2118
2118
|
}, {
|
|
2119
|
-
default:
|
|
2120
|
-
|
|
2119
|
+
default: q(() => [
|
|
2120
|
+
$(o(je)),
|
|
2121
2121
|
pe(" " + ce(o(t).t("actions.add_entity", { entity: o(m) })), 1)
|
|
2122
2122
|
]),
|
|
2123
2123
|
_: 1
|
|
@@ -2127,7 +2127,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2127
2127
|
]);
|
|
2128
2128
|
};
|
|
2129
2129
|
}
|
|
2130
|
-
}), ln = /* @__PURE__ */
|
|
2130
|
+
}), ln = /* @__PURE__ */ G(sn, [["__scopeId", "data-v-dca94ae5"]]), ge = /* @__PURE__ */ N({
|
|
2131
2131
|
name: "AutoField",
|
|
2132
2132
|
__name: "Field",
|
|
2133
2133
|
props: {
|
|
@@ -2137,7 +2137,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2137
2137
|
},
|
|
2138
2138
|
emits: ["globalAction"],
|
|
2139
2139
|
setup(e) {
|
|
2140
|
-
const l = e, t = Z(
|
|
2140
|
+
const l = e, t = Z(j(l, "name")), n = k(() => {
|
|
2141
2141
|
switch (t.schema?.value?.type) {
|
|
2142
2142
|
case "string":
|
|
2143
2143
|
return "one_of" in t.schema.value ? Te : ht;
|
|
@@ -2163,7 +2163,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2163
2163
|
}
|
|
2164
2164
|
});
|
|
2165
2165
|
return (r, a) => {
|
|
2166
|
-
const d =
|
|
2166
|
+
const d = D("KAlert");
|
|
2167
2167
|
return _(), K(te, null, [
|
|
2168
2168
|
(_(), T(oe(r.$slots[o(Se)]))),
|
|
2169
2169
|
o(t).error ? (_(), T(d, {
|
|
@@ -2185,12 +2185,12 @@ const be = /* @__PURE__ */ N({
|
|
|
2185
2185
|
appearance: "warning",
|
|
2186
2186
|
message: `${o(t).path.value} ${o(t).schema.value.type} (no renderer yet)`
|
|
2187
2187
|
}, null, 8, ["message"])),
|
|
2188
|
-
|
|
2188
|
+
F(r.$slots, "default")
|
|
2189
2189
|
], 64))
|
|
2190
2190
|
], 64);
|
|
2191
2191
|
};
|
|
2192
2192
|
}
|
|
2193
|
-
}),
|
|
2193
|
+
}), En = /* @__PURE__ */ N({
|
|
2194
2194
|
name: "SchemaForm",
|
|
2195
2195
|
__name: "Form",
|
|
2196
2196
|
props: {
|
|
@@ -2207,7 +2207,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2207
2207
|
schema: e.schema,
|
|
2208
2208
|
propsData: k(() => e.data),
|
|
2209
2209
|
propsConfig: e.config,
|
|
2210
|
-
propsRenderRules:
|
|
2210
|
+
propsRenderRules: j(() => e.renderRules),
|
|
2211
2211
|
onChange: (g) => n("change", g)
|
|
2212
2212
|
}), m = k(() => {
|
|
2213
2213
|
const { fields: g } = a();
|
|
@@ -2219,9 +2219,9 @@ const be = /* @__PURE__ */ N({
|
|
|
2219
2219
|
getRawValue: () => et(d),
|
|
2220
2220
|
setValue: c
|
|
2221
2221
|
}), (g, s) => (_(), T(oe(e.tag), null, {
|
|
2222
|
-
default:
|
|
2222
|
+
default: q(() => [
|
|
2223
2223
|
(_(), T(oe(o(r)[o(Se)]))),
|
|
2224
|
-
|
|
2224
|
+
F(g.$slots, "default", {}, () => [
|
|
2225
2225
|
(_(!0), K(te, null, se(m.value, (u) => (_(), T(ge, {
|
|
2226
2226
|
key: Object.keys(u)[0],
|
|
2227
2227
|
name: Object.keys(u)[0],
|
|
@@ -2232,7 +2232,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2232
2232
|
_: 3
|
|
2233
2233
|
}));
|
|
2234
2234
|
}
|
|
2235
|
-
}),
|
|
2235
|
+
}), jn = /* @__PURE__ */ N({
|
|
2236
2236
|
__name: "FieldRenderer",
|
|
2237
2237
|
props: {
|
|
2238
2238
|
match: { type: Function },
|
|
@@ -2242,7 +2242,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2242
2242
|
const l = e, { default: t } = we(), { fieldRendererRegistry: n } = ne();
|
|
2243
2243
|
return t && n.set(l.match, t), (r, a) => null;
|
|
2244
2244
|
}
|
|
2245
|
-
}), 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."}},"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)"}}},"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.
|
|
2245
|
+
}), 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.
|
|
2246
2246
|
If the limit is exceeded and the user receives a 429 error, each additional request within the sliding window (hour)
|
|
2247
2247
|
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 = {
|
|
2248
2248
|
actions: un,
|
|
@@ -2278,25 +2278,25 @@ const kn = ["data-testid"], Sn = /* @__PURE__ */ N({
|
|
|
2278
2278
|
},
|
|
2279
2279
|
emits: ["update:modelValue"],
|
|
2280
2280
|
setup(e, { emit: l }) {
|
|
2281
|
-
const { i18n: { t } } = wn(), n = ue(e, ["name", "enabledText", "disabledText"]), { value: r, hide: a, emptyOrDefaultValue: d, ...c } = Z(
|
|
2281
|
+
const { i18n: { t } } = wn(), n = ue(e, ["name", "enabledText", "disabledText"]), { value: r, hide: a, emptyOrDefaultValue: d, ...c } = Z(j(() => e.name)), p = l, i = (g) => {
|
|
2282
2282
|
r.value = g, p("update:modelValue", g);
|
|
2283
2283
|
}, m = ie(c.path, n);
|
|
2284
2284
|
return (g, s) => {
|
|
2285
|
-
const u =
|
|
2285
|
+
const u = D("KAlert");
|
|
2286
2286
|
return c.error ? (_(), T(u, {
|
|
2287
2287
|
key: 0,
|
|
2288
2288
|
appearance: "danger",
|
|
2289
2289
|
message: c.error.message
|
|
2290
|
-
}, null, 8, ["message"])) :
|
|
2290
|
+
}, null, 8, ["message"])) : X((_(), K("div", {
|
|
2291
2291
|
key: 1,
|
|
2292
2292
|
class: "ff-switch-field",
|
|
2293
2293
|
"data-testid": `ff-${c.path.value}`
|
|
2294
2294
|
}, [
|
|
2295
|
-
|
|
2295
|
+
$(o(Et), W(o(m), {
|
|
2296
2296
|
"model-value": !!(o(r) == null ? o(d) : o(r)),
|
|
2297
2297
|
"onUpdate:modelValue": i
|
|
2298
2298
|
}), {
|
|
2299
|
-
label:
|
|
2299
|
+
label: q(() => [
|
|
2300
2300
|
pe(ce(o(r) ? e.enabledText || o(t)("actions.enabled") : e.disabledText || o(t)("actions.disabled")), 1)
|
|
2301
2301
|
]),
|
|
2302
2302
|
_: 1
|
|
@@ -2306,19 +2306,19 @@ const kn = ["data-testid"], Sn = /* @__PURE__ */ N({
|
|
|
2306
2306
|
]);
|
|
2307
2307
|
};
|
|
2308
2308
|
}
|
|
2309
|
-
}), On = /* @__PURE__ */
|
|
2309
|
+
}), On = /* @__PURE__ */ G(Sn, [["__scopeId", "data-v-0b4c3942"]]);
|
|
2310
2310
|
export {
|
|
2311
2311
|
Ia as ArrayField,
|
|
2312
2312
|
ya as BooleanField,
|
|
2313
2313
|
Te as EnumField,
|
|
2314
|
-
|
|
2314
|
+
Ye as FIELD_PATH_KEY,
|
|
2315
2315
|
Se as FIELD_RENDERERS,
|
|
2316
|
-
|
|
2317
|
-
|
|
2316
|
+
Fe as FIELD_RENDERER_SLOTS,
|
|
2317
|
+
Xe as FIELD_RESET_LABEL_PATH_SETTING,
|
|
2318
2318
|
ge as Field,
|
|
2319
|
-
|
|
2319
|
+
jn as FieldRenderer,
|
|
2320
2320
|
tn as ForeignField,
|
|
2321
|
-
|
|
2321
|
+
En as Form,
|
|
2322
2322
|
Qa as JsonField,
|
|
2323
2323
|
ln as MapField,
|
|
2324
2324
|
Ha as NumberField,
|
|
@@ -2328,13 +2328,13 @@ export {
|
|
|
2328
2328
|
On as SwitchField,
|
|
2329
2329
|
Nt as buildAncestor,
|
|
2330
2330
|
Me as buildArraySchemaMap,
|
|
2331
|
-
|
|
2332
|
-
|
|
2331
|
+
xe as buildMapSchemaMap,
|
|
2332
|
+
qe as buildRecordSchemaMap,
|
|
2333
2333
|
Ht as buildSchemaMap,
|
|
2334
2334
|
ft as defaultLabelFormatter,
|
|
2335
2335
|
Ae as generalizePath,
|
|
2336
2336
|
ta as provideFormShared,
|
|
2337
|
-
|
|
2337
|
+
Vn as renderRuleExactMatch,
|
|
2338
2338
|
pt as replaceByDictionary,
|
|
2339
2339
|
mt as replaceByDictionaryInFieldName,
|
|
2340
2340
|
Z as useField,
|