@kong-ui-public/entities-plugins 9.271.4 → 9.272.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 +10444 -10014
- package/dist/entities-plugins.umd.js +141 -141
- package/dist/filler/cypress/index.js +146 -127
- package/dist/filler/{field-walker-DX9YG0uo.js → field-walker-SzWGNejv.js} +4472 -4434
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/cypress/create-filler.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/cypress/handlers/expression.d.ts +9 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/cypress/handlers/expression.d.ts.map +1 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/cypress/handlers/index.d.ts +3 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/cypress/handlers/index.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/create-filler.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/expression.d.ts +9 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/expression.d.ts.map +1 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/index.d.ts +3 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/playwright/handlers/index.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/shared/field-walker.d.ts +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/shared/field-walker.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/shared/selectors.d.ts +3 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/filler/shared/selectors.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/expression-paths.d.ts +55 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/expression-paths.d.ts.map +1 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/expression.d.ts +28 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/expression.d.ts.map +1 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/form-context.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/index.d.ts +2 -0
- package/dist/filler/packages/entities/entities-plugins/src/components/free-form/shared/composables/index.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/types/plugins/form-schema.d.ts +35 -1
- package/dist/filler/packages/entities/entities-plugins/src/types/plugins/form-schema.d.ts.map +1 -1
- package/dist/filler/packages/entities/entities-plugins/src/types/plugins/free-form.d.ts +5 -0
- package/dist/filler/packages/entities/entities-plugins/src/types/plugins/free-form.d.ts.map +1 -1
- package/dist/filler/playwright/index.js +146 -131
- package/dist/freeform/index.js +1336 -1094
- package/dist/freeform/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components/PluginForm.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/plugins/_shared/use-expression-mode.d.ts +18 -0
- package/dist/types/components/free-form/plugins/_shared/use-expression-mode.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/rate-limiting/ConfigForm.vue.d.ts +4 -0
- package/dist/types/components/free-form/plugins/rate-limiting/ConfigForm.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/rate-limiting/RateLimitingForm.vue.d.ts +16 -0
- package/dist/types/components/free-form/plugins/rate-limiting/RateLimitingForm.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/rate-limiting/index.d.ts +3 -0
- package/dist/types/components/free-form/plugins/rate-limiting/index.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/rate-limiting-advanced/ConfigForm.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/plugins/rate-limiting-advanced/CustomKeyField.vue.d.ts +5 -0
- package/dist/types/components/free-form/plugins/rate-limiting-advanced/CustomKeyField.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/plugins/rate-limiting-advanced/RateLimitingAdvancedForm.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/plugins/rate-limiting-advanced/RequestLimitsForm.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/ExpressionEditor.vue.d.ts +34 -0
- package/dist/types/components/free-form/shared/ExpressionEditor.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/shared/ExpressionField.vue.d.ts +19 -0
- package/dist/types/components/free-form/shared/ExpressionField.vue.d.ts.map +1 -0
- package/dist/types/components/free-form/shared/Field.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/Form.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/RadioField.vue.d.ts +10 -1
- package/dist/types/components/free-form/shared/RadioField.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/composables/expression-paths.d.ts +55 -0
- package/dist/types/components/free-form/shared/composables/expression-paths.d.ts.map +1 -0
- package/dist/types/components/free-form/shared/composables/expression.d.ts +28 -0
- package/dist/types/components/free-form/shared/composables/expression.d.ts.map +1 -0
- package/dist/types/components/free-form/shared/composables/form-context.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/composables/index.d.ts +2 -0
- package/dist/types/components/free-form/shared/composables/index.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/field-dispatch.d.ts +14 -0
- package/dist/types/components/free-form/shared/field-dispatch.d.ts.map +1 -0
- package/dist/types/components/free-form/shared/layout/StandardLayout.vue.d.ts.map +1 -1
- package/dist/types/composables/useFreeformI18n.d.ts +68 -0
- package/dist/types/composables/useFreeformI18n.d.ts.map +1 -1
- package/dist/types/freeform.d.ts +3 -1
- package/dist/types/freeform.d.ts.map +1 -1
- package/dist/types/types/plugins/form-schema.d.ts +35 -1
- package/dist/types/types/plugins/form-schema.d.ts.map +1 -1
- package/dist/types/types/plugins/free-form.d.ts +5 -0
- package/dist/types/types/plugins/free-form.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/types/components/free-form/plugins/rate-limiting.d.ts +0 -3
- package/dist/types/components/free-form/plugins/rate-limiting.d.ts.map +0 -1
package/dist/freeform/index.js
CHANGED
|
@@ -1,73 +1,76 @@
|
|
|
1
|
-
import { toValue as
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { createI18n as
|
|
9
|
-
import {
|
|
1
|
+
import { toValue as j, computed as b, ref as se, watch as te, onBeforeUnmount as It, reactive as st, toRef as O, useSlots as Se, provide as Le, inject as ve, toRaw as lt, onUnmounted as Tt, defineComponent as z, useAttrs as _e, openBlock as A, createBlock as q, unref as o, mergeProps as G, createSlots as Z, renderList as de, withCtx as L, renderSlot as D, normalizeProps as We, guardReactiveProps as ut, createPropsRestProxy as pe, resolveComponent as N, withDirectives as X, createElementBlock as $, createVNode as V, createElementVNode as B, resolveDynamicComponent as ie, createCommentVNode as H, Fragment as oe, vShow as Q, createTextVNode as ue, toDisplayString as re, useCssVars as Pt, useTemplateRef as ct, normalizeClass as Te, withModifiers as Pe, nextTick as De, Transition as qt, useId as Lt, useModel as Fe, onBeforeMount as Et, mergeModels as Ue, withKeys as Ze } from "vue";
|
|
2
|
+
import { get as ke, uniqueId as dt, isEqual as ge, omit as Kt, cloneDeep as et, isFunction as tt, set as Ne, upperFirst as Mt } from "lodash-es";
|
|
3
|
+
import { createInjectionState as Rt } from "@vueuse/core";
|
|
4
|
+
import { marked as Vt } from "marked";
|
|
5
|
+
import $t from "dompurify";
|
|
6
|
+
import { KTextArea as jt, KInput as Ot, KButton as nt, KExternalLink as Dt, KCheckbox as Ft, KCard as Be, KLabel as Ut, KMultiselect as Nt, KSelect as Bt, KInputSwitch as zt } from "@kong/kongponents";
|
|
7
|
+
import { AddIcon as qe, CloseIcon as Je, TrashIcon as Ht, ChevronRightIcon as Wt } from "@kong/icons";
|
|
8
|
+
import { createI18n as pt, i18nTComponent as mt } from "@kong-ui-public/i18n";
|
|
9
|
+
import { AUTOFILL_SLOT as ft } from "@kong-ui-public/forms";
|
|
10
|
+
import { SecretInput as Jt } from "@kong-ui-public/misc-widgets";
|
|
10
11
|
import "@kong-ui-public/misc-widgets/dist/style.css";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
function Bt(e) {
|
|
12
|
+
import { KUI_ICON_SIZE_30 as Gt } from "@kong/design-tokens";
|
|
13
|
+
function Yt(e) {
|
|
14
14
|
return e.map((r) => ({ value: r, label: `${r}` }));
|
|
15
15
|
}
|
|
16
|
-
const
|
|
17
|
-
function
|
|
18
|
-
return e.join(
|
|
16
|
+
const Ge = "*", Ye = "#", ce = "$", Ee = ".";
|
|
17
|
+
function R(...e) {
|
|
18
|
+
return e.join(Ee);
|
|
19
19
|
}
|
|
20
|
-
function
|
|
21
|
-
return
|
|
20
|
+
function Ce(...e) {
|
|
21
|
+
return R(ce, ...e);
|
|
22
22
|
}
|
|
23
|
-
function
|
|
24
|
-
return e.startsWith(
|
|
23
|
+
function at(e) {
|
|
24
|
+
return e.startsWith(R(ce, ""));
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
return e.split(
|
|
26
|
+
function U(e) {
|
|
27
|
+
return e.split(Ee).filter((r) => r !== "");
|
|
28
28
|
}
|
|
29
|
-
function
|
|
30
|
-
const r =
|
|
29
|
+
function fe(e) {
|
|
30
|
+
const r = U(e);
|
|
31
31
|
return r[r.length - 1];
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function Xe(e) {
|
|
34
|
+
return e.startsWith(ce) && (e = R(...U(e).slice(1))), e;
|
|
35
|
+
}
|
|
36
|
+
function ht(e, r, t, a = "") {
|
|
34
37
|
if (e == null || typeof e != "object") return;
|
|
35
|
-
const s = Array.isArray(e) ? e.map((
|
|
36
|
-
for (const
|
|
37
|
-
const
|
|
38
|
-
r(
|
|
38
|
+
const s = Array.isArray(e) ? e.map((n, u) => String(u)) : Object.keys(e);
|
|
39
|
+
for (const n of s) {
|
|
40
|
+
const u = a ? R(a, n) : n;
|
|
41
|
+
r(u) ? e[n] = t(u) : ht(e[n], r, t, u);
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
|
-
function
|
|
42
|
-
const r =
|
|
44
|
+
function Xt(e) {
|
|
45
|
+
const r = j(e);
|
|
43
46
|
return r ? r.type === "set" && r.elements.type === "string" && !r.elements.one_of : !1;
|
|
44
47
|
}
|
|
45
|
-
function
|
|
46
|
-
return [...e].sort((t,
|
|
47
|
-
const s = Object.keys(t)[0],
|
|
48
|
-
return
|
|
48
|
+
function gt(e, r) {
|
|
49
|
+
return [...e].sort((t, a) => {
|
|
50
|
+
const s = Object.keys(t)[0], n = Object.keys(a)[0], u = r.indexOf(s), l = r.indexOf(n);
|
|
51
|
+
return u === -1 && l === -1 ? 0 : u === -1 ? 1 : l === -1 ? -1 : u - l;
|
|
49
52
|
});
|
|
50
53
|
}
|
|
51
|
-
function
|
|
54
|
+
function yt(e, r) {
|
|
52
55
|
const t = /* @__PURE__ */ new Map();
|
|
53
56
|
e.forEach((i) => {
|
|
54
57
|
const c = Object.keys(i)[0];
|
|
55
58
|
t.set(c, i);
|
|
56
59
|
});
|
|
57
|
-
const
|
|
60
|
+
const a = /* @__PURE__ */ new Map();
|
|
58
61
|
r.forEach((i, c) => {
|
|
59
|
-
i.forEach((h,
|
|
60
|
-
|
|
62
|
+
i.forEach((h, p) => {
|
|
63
|
+
a.has(h) || a.set(h, []), a.get(h).push({ bundleIndex: c, position: p });
|
|
61
64
|
});
|
|
62
65
|
});
|
|
63
|
-
const s = /* @__PURE__ */ new Set(),
|
|
64
|
-
const c =
|
|
66
|
+
const s = /* @__PURE__ */ new Set(), n = [], u = /* @__PURE__ */ new Set(), l = (i) => {
|
|
67
|
+
const c = a.get(i);
|
|
65
68
|
if (!c) return !0;
|
|
66
|
-
for (const { bundleIndex: h, position:
|
|
67
|
-
const
|
|
68
|
-
for (let
|
|
69
|
-
const
|
|
70
|
-
if (t.has(
|
|
69
|
+
for (const { bundleIndex: h, position: p } of c) {
|
|
70
|
+
const m = r[h];
|
|
71
|
+
for (let d = 0; d < p; d++) {
|
|
72
|
+
const y = m[d];
|
|
73
|
+
if (t.has(y) && !s.has(y))
|
|
71
74
|
return !1;
|
|
72
75
|
}
|
|
73
76
|
}
|
|
@@ -76,163 +79,163 @@ function ut(e, r) {
|
|
|
76
79
|
if (s.has(i)) return;
|
|
77
80
|
const c = t.get(i);
|
|
78
81
|
if (!c) return;
|
|
79
|
-
|
|
80
|
-
const h =
|
|
82
|
+
n.push(c), s.add(i), u.delete(i);
|
|
83
|
+
const h = a.get(i);
|
|
81
84
|
if (h)
|
|
82
|
-
for (const { bundleIndex:
|
|
83
|
-
const
|
|
84
|
-
for (let v =
|
|
85
|
-
const T =
|
|
85
|
+
for (const { bundleIndex: m, position: d } of h) {
|
|
86
|
+
const y = r[m];
|
|
87
|
+
for (let v = d + 1; v < y.length; v++) {
|
|
88
|
+
const T = y[v];
|
|
86
89
|
if (!s.has(T)) {
|
|
87
|
-
const
|
|
88
|
-
|
|
90
|
+
const x = t.get(T);
|
|
91
|
+
x && (n.push(x), s.add(T), u.delete(T));
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
}
|
|
92
|
-
const
|
|
93
|
-
for (const
|
|
94
|
-
l(
|
|
95
|
+
const p = Array.from(u);
|
|
96
|
+
for (const m of p)
|
|
97
|
+
l(m) && f(m);
|
|
95
98
|
};
|
|
96
99
|
for (const i of e) {
|
|
97
100
|
const c = Object.keys(i)[0];
|
|
98
|
-
s.has(c) || (l(c) ? f(c) :
|
|
101
|
+
s.has(c) || (l(c) ? f(c) : u.add(c));
|
|
99
102
|
}
|
|
100
|
-
return
|
|
103
|
+
return n;
|
|
101
104
|
}
|
|
102
|
-
function
|
|
103
|
-
const r =
|
|
105
|
+
function Qt(e) {
|
|
106
|
+
const r = U(e);
|
|
104
107
|
let t = { parent: null };
|
|
105
108
|
for (r.pop(); r.length; ) {
|
|
106
|
-
const
|
|
107
|
-
t.path = t.parent?.path ?
|
|
109
|
+
const a = r.shift();
|
|
110
|
+
t.path = t.parent?.path ? R(t.parent.path, a) : a, t = { parent: t };
|
|
108
111
|
}
|
|
109
112
|
return t;
|
|
110
113
|
}
|
|
111
|
-
function
|
|
112
|
-
return
|
|
114
|
+
function vt(e) {
|
|
115
|
+
return b(() => Qt(j(e)));
|
|
113
116
|
}
|
|
114
|
-
const
|
|
115
|
-
function
|
|
117
|
+
const it = /* @__PURE__ */ Symbol("free-form-field-path"), ze = /* @__PURE__ */ Symbol("free-form-field-renderer-slots"), ot = /* @__PURE__ */ Symbol("free-form-field-reset-label-path-setting"), xe = "free-form-field-renderers-slot";
|
|
118
|
+
function Zt(e) {
|
|
116
119
|
return e === "undefined" ? void 0 : null;
|
|
117
120
|
}
|
|
118
|
-
const
|
|
121
|
+
const en = {
|
|
119
122
|
tooltipAttributes: {
|
|
120
123
|
maxWidth: "300px",
|
|
121
124
|
placement: "top"
|
|
122
125
|
}
|
|
123
126
|
};
|
|
124
|
-
function
|
|
125
|
-
const t = {},
|
|
126
|
-
return Array.isArray(
|
|
127
|
+
function tn(e, r = "") {
|
|
128
|
+
const t = {}, a = e;
|
|
129
|
+
return Array.isArray(a.fields) ? Object.assign(t, Ke(a, r)) : e.type === "array" && e.elements ? Object.assign(t, Me(e, r)) : e.type === "map" && e.values && Object.assign(t, Re(e, r)), t;
|
|
127
130
|
}
|
|
128
|
-
function
|
|
131
|
+
function Ke(e, r = "") {
|
|
129
132
|
const t = {};
|
|
130
133
|
if (Array.isArray(e.fields))
|
|
131
|
-
for (const
|
|
132
|
-
const s = Object.keys(
|
|
133
|
-
if (t[
|
|
134
|
-
const l =
|
|
134
|
+
for (const a of e.fields) {
|
|
135
|
+
const s = Object.keys(a)[0], n = a[s], u = r ? R(r, s) : s;
|
|
136
|
+
if (t[u] = n, n.type === "record" && Array.isArray(n.fields)) {
|
|
137
|
+
const l = Ke(n, u);
|
|
135
138
|
Object.assign(t, l);
|
|
136
|
-
} else if (
|
|
137
|
-
const l =
|
|
139
|
+
} else if (n.type === "array" && n.elements) {
|
|
140
|
+
const l = Me(n, u);
|
|
138
141
|
Object.assign(t, l);
|
|
139
|
-
} else if (
|
|
140
|
-
const l =
|
|
142
|
+
} else if (n.type === "map" && n.values) {
|
|
143
|
+
const l = Re(n, u);
|
|
141
144
|
Object.assign(t, l);
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
147
|
return t;
|
|
145
148
|
}
|
|
146
|
-
function
|
|
149
|
+
function Me(e, r = "") {
|
|
147
150
|
const t = {};
|
|
148
151
|
if (e.elements) {
|
|
149
|
-
let
|
|
150
|
-
const s =
|
|
151
|
-
if (e.encrypted &&
|
|
152
|
-
const
|
|
153
|
-
Object.assign(t,
|
|
154
|
-
} else if (
|
|
155
|
-
const
|
|
156
|
-
Object.assign(t,
|
|
157
|
-
} else if (
|
|
158
|
-
const
|
|
159
|
-
Object.assign(t,
|
|
152
|
+
let a = e.elements;
|
|
153
|
+
const s = R(r, Ge);
|
|
154
|
+
if (e.encrypted && a.type === "string" && (a = { ...a, encrypted: !0 }), t[s] = a, a.type === "record" && Array.isArray(a.fields)) {
|
|
155
|
+
const n = Ke(a, s);
|
|
156
|
+
Object.assign(t, n);
|
|
157
|
+
} else if (a.type === "array" && a.elements) {
|
|
158
|
+
const n = Me(a, s);
|
|
159
|
+
Object.assign(t, n);
|
|
160
|
+
} else if (a.type === "map" && a.values) {
|
|
161
|
+
const n = Re(a, s);
|
|
162
|
+
Object.assign(t, n);
|
|
160
163
|
}
|
|
161
164
|
}
|
|
162
165
|
return t;
|
|
163
166
|
}
|
|
164
|
-
function
|
|
165
|
-
const t = {},
|
|
166
|
-
if (t[
|
|
167
|
-
const s =
|
|
167
|
+
function Re(e, r = "") {
|
|
168
|
+
const t = {}, a = R(r, Ye);
|
|
169
|
+
if (t[a] = e.values, e.values.type === "record" && Array.isArray(e.values.fields)) {
|
|
170
|
+
const s = Ke(e.values, a);
|
|
168
171
|
Object.assign(t, s);
|
|
169
172
|
} else if ((e.values.type === "array" || e.values.type === "set") && e.values.elements) {
|
|
170
|
-
const s =
|
|
173
|
+
const s = Me(e.values, a);
|
|
171
174
|
Object.assign(t, s);
|
|
172
175
|
} else if (e.values.type === "map" && e.values.values) {
|
|
173
|
-
const s =
|
|
176
|
+
const s = Re(e.values, a);
|
|
174
177
|
Object.assign(t, s);
|
|
175
178
|
}
|
|
176
179
|
return t;
|
|
177
180
|
}
|
|
178
|
-
function
|
|
179
|
-
const t =
|
|
181
|
+
function ye(e, r) {
|
|
182
|
+
const t = U(e), a = [];
|
|
180
183
|
for (let s = 0; s < t.length; s++) {
|
|
181
|
-
const
|
|
182
|
-
l?.type === "map" ?
|
|
184
|
+
const n = t[s], u = a.length > 0 ? R(...a) : "", l = u ? r[u] : void 0;
|
|
185
|
+
l?.type === "map" ? a.push(Ye) : l?.type === "array" ? a.push(Ge) : a.push(n);
|
|
183
186
|
}
|
|
184
|
-
return
|
|
187
|
+
return R(...a);
|
|
185
188
|
}
|
|
186
|
-
function
|
|
187
|
-
const t =
|
|
188
|
-
function
|
|
189
|
-
return
|
|
190
|
-
}
|
|
191
|
-
const s =
|
|
192
|
-
function
|
|
193
|
-
if (
|
|
194
|
-
let
|
|
195
|
-
return
|
|
189
|
+
function nn(e, r) {
|
|
190
|
+
const t = j(e);
|
|
191
|
+
function a() {
|
|
192
|
+
return Zt(j(r)?.emptyFieldValue);
|
|
193
|
+
}
|
|
194
|
+
const s = b(() => t ? tn(t) : {});
|
|
195
|
+
function n(d) {
|
|
196
|
+
if (d) {
|
|
197
|
+
let y = ye(d, s.value || {});
|
|
198
|
+
return y.startsWith(`${ce}${Ee}`) && (y = y.slice(2)), s.value?.[y];
|
|
196
199
|
}
|
|
197
200
|
return t;
|
|
198
201
|
}
|
|
199
|
-
function d
|
|
200
|
-
const v =
|
|
202
|
+
function u(d, y = !1) {
|
|
203
|
+
const v = n(d);
|
|
201
204
|
if (!v)
|
|
202
205
|
return null;
|
|
203
206
|
if (v.default !== void 0)
|
|
204
207
|
return v.default;
|
|
205
208
|
if (!v.auto)
|
|
206
|
-
return
|
|
209
|
+
return y || v.required ? v.type === "record" ? l(v, d) : v.type === "array" ? [] : v.type === "map" ? {} : a() : a();
|
|
207
210
|
}
|
|
208
|
-
function l(
|
|
211
|
+
function l(d, y) {
|
|
209
212
|
const v = {};
|
|
210
|
-
if (Array.isArray(
|
|
211
|
-
for (const T of
|
|
212
|
-
const
|
|
213
|
-
|
|
213
|
+
if (Array.isArray(d.fields))
|
|
214
|
+
for (const T of d.fields) {
|
|
215
|
+
const x = Object.keys(T)[0], g = y ? `${y}.${x}` : x, w = u(g, !1);
|
|
216
|
+
w !== void 0 && (v[x] = w);
|
|
214
217
|
}
|
|
215
218
|
return v;
|
|
216
219
|
}
|
|
217
|
-
function f(
|
|
218
|
-
return
|
|
220
|
+
function f(d) {
|
|
221
|
+
return d ? u(d, !0) : l(n(), "");
|
|
219
222
|
}
|
|
220
|
-
function i(
|
|
221
|
-
const
|
|
223
|
+
function i(d) {
|
|
224
|
+
const y = n(d), v = y?.description ? $t.sanitize(Vt.parse(y.description, { async: !1 })) : void 0;
|
|
222
225
|
return {
|
|
223
|
-
...
|
|
224
|
-
"data-testid": `ff-label-${
|
|
226
|
+
...en,
|
|
227
|
+
"data-testid": `ff-label-${d}`,
|
|
225
228
|
info: v
|
|
226
229
|
};
|
|
227
230
|
}
|
|
228
|
-
function c(
|
|
229
|
-
const
|
|
230
|
-
return
|
|
231
|
+
function c(d) {
|
|
232
|
+
const y = n(d);
|
|
233
|
+
return Yt(y?.one_of || y.elements?.one_of || []);
|
|
231
234
|
}
|
|
232
|
-
function h(
|
|
233
|
-
const
|
|
235
|
+
function h(d) {
|
|
236
|
+
const y = n(d), v = y?.default;
|
|
234
237
|
let T = null;
|
|
235
|
-
if (
|
|
238
|
+
if (y?.type === "foreign" && v?.id)
|
|
236
239
|
T = v.id;
|
|
237
240
|
else {
|
|
238
241
|
if (v == null || typeof v == "object" || v === "")
|
|
@@ -246,20 +249,20 @@ function Gt(e, r) {
|
|
|
246
249
|
}
|
|
247
250
|
return `Default: ${T}`;
|
|
248
251
|
}
|
|
249
|
-
function
|
|
252
|
+
function p() {
|
|
250
253
|
return s.value;
|
|
251
254
|
}
|
|
252
|
-
function
|
|
253
|
-
return
|
|
255
|
+
function m(d) {
|
|
256
|
+
return n(d)?.required ? f(d) : a();
|
|
254
257
|
}
|
|
255
258
|
return {
|
|
256
|
-
getSchemaMap:
|
|
257
|
-
getSchema:
|
|
259
|
+
getSchemaMap: p,
|
|
260
|
+
getSchema: n,
|
|
258
261
|
getDefault: f,
|
|
259
262
|
getSelectItems: c,
|
|
260
263
|
getLabelAttributes: i,
|
|
261
264
|
getPlaceholder: h,
|
|
262
|
-
getEmptyOrDefault:
|
|
265
|
+
getEmptyOrDefault: m,
|
|
263
266
|
/**
|
|
264
267
|
* The configured empty-field sentinel on its own, with no schema/path
|
|
265
268
|
* lookup and no required/default awareness. Use this (not
|
|
@@ -268,42 +271,42 @@ function Gt(e, r) {
|
|
|
268
271
|
* back in, which would make it impossible to clear a required field
|
|
269
272
|
* that has an explicit `schema.default`.
|
|
270
273
|
*/
|
|
271
|
-
getEmptyValue:
|
|
274
|
+
getEmptyValue: a
|
|
272
275
|
};
|
|
273
276
|
}
|
|
274
|
-
const
|
|
275
|
-
function
|
|
276
|
-
return { [
|
|
277
|
+
const He = /* @__PURE__ */ Symbol("ff-render-rule-exact-match");
|
|
278
|
+
function ui(e) {
|
|
279
|
+
return { [He]: e };
|
|
277
280
|
}
|
|
278
|
-
function
|
|
279
|
-
return typeof r == "object" && r !== null &&
|
|
281
|
+
function an(e, r) {
|
|
282
|
+
return typeof r == "object" && r !== null && He in r ? ge(e, r[He]) : Array.isArray(r) ? r.some((a) => ge(e, a)) : ge(e, r);
|
|
280
283
|
}
|
|
281
|
-
function
|
|
282
|
-
const t =
|
|
283
|
-
function s(
|
|
284
|
-
|
|
285
|
-
}
|
|
286
|
-
function
|
|
287
|
-
const
|
|
288
|
-
if (!
|
|
289
|
-
const k = { ...
|
|
290
|
-
delete k[
|
|
291
|
-
}
|
|
292
|
-
function
|
|
293
|
-
const
|
|
294
|
-
if (!
|
|
295
|
-
const S =
|
|
284
|
+
function on(e, r) {
|
|
285
|
+
const t = se({}), a = se({});
|
|
286
|
+
function s(g, w, _) {
|
|
287
|
+
a.value[g] = { ...a.value[g], [w]: _ ? [..._] : [] };
|
|
288
|
+
}
|
|
289
|
+
function n(g, w) {
|
|
290
|
+
const _ = a.value[g];
|
|
291
|
+
if (!_ || !(w in _)) return;
|
|
292
|
+
const k = { ..._ };
|
|
293
|
+
delete k[w], Object.keys(k).length ? a.value[g] = k : delete a.value[g];
|
|
294
|
+
}
|
|
295
|
+
function u(g, w) {
|
|
296
|
+
const _ = g.map((S) => U(S).length), k = _[0];
|
|
297
|
+
if (!_.every((S) => S === k)) {
|
|
298
|
+
const S = g.map((M, P) => ` - '${M}' is at level ${_[P]}`).join(`
|
|
296
299
|
`);
|
|
297
300
|
throw new Error(
|
|
298
|
-
`${
|
|
301
|
+
`${w}: Fields must be at the same level. Found mixed levels:
|
|
299
302
|
${S}`
|
|
300
303
|
);
|
|
301
304
|
}
|
|
302
305
|
}
|
|
303
|
-
function l(
|
|
304
|
-
for (const [
|
|
305
|
-
if (!
|
|
306
|
-
for (const S of
|
|
306
|
+
function l(g) {
|
|
307
|
+
for (const [w, _] of Object.entries(g)) {
|
|
308
|
+
if (!_.bundles) continue;
|
|
309
|
+
for (const S of _.bundles)
|
|
307
310
|
if (new Set(S).size !== S.length) {
|
|
308
311
|
const P = S.filter((K, C) => S.indexOf(K) !== C);
|
|
309
312
|
throw new Error(
|
|
@@ -311,7 +314,7 @@ ${S}`
|
|
|
311
314
|
);
|
|
312
315
|
}
|
|
313
316
|
const k = /* @__PURE__ */ new Map();
|
|
314
|
-
for (const S of
|
|
317
|
+
for (const S of _.bundles)
|
|
315
318
|
for (let M = 1; M < S.length; M++) {
|
|
316
319
|
const P = S[M], K = S[M - 1];
|
|
317
320
|
k.has(P) || k.set(P, /* @__PURE__ */ new Set()), k.get(P).add(K);
|
|
@@ -319,18 +322,18 @@ ${S}`
|
|
|
319
322
|
for (const S of k.keys()) {
|
|
320
323
|
let M = function(C) {
|
|
321
324
|
if (K.includes(C)) {
|
|
322
|
-
const
|
|
325
|
+
const W = [...K, C].join(" -> ");
|
|
323
326
|
throw new Error(
|
|
324
|
-
`Circular bundle detected in path '${
|
|
325
|
-
${
|
|
327
|
+
`Circular bundle detected in path '${w}':
|
|
328
|
+
${W}`
|
|
326
329
|
);
|
|
327
330
|
}
|
|
328
331
|
if (P.has(C)) return;
|
|
329
332
|
P.add(C), K.push(C);
|
|
330
333
|
const I = k.get(C);
|
|
331
334
|
if (I)
|
|
332
|
-
for (const
|
|
333
|
-
M(
|
|
335
|
+
for (const W of I)
|
|
336
|
+
M(W);
|
|
334
337
|
K.pop();
|
|
335
338
|
};
|
|
336
339
|
const P = /* @__PURE__ */ new Set(), K = [];
|
|
@@ -338,24 +341,24 @@ ${x}`
|
|
|
338
341
|
}
|
|
339
342
|
}
|
|
340
343
|
}
|
|
341
|
-
function f(
|
|
342
|
-
for (const [
|
|
343
|
-
if (
|
|
344
|
-
for (const k of Object.keys(
|
|
344
|
+
function f(g) {
|
|
345
|
+
for (const [w, _] of Object.entries(g))
|
|
346
|
+
if (_.dependencies)
|
|
347
|
+
for (const k of Object.keys(_.dependencies)) {
|
|
345
348
|
let S = function(K) {
|
|
346
349
|
if (P.includes(K)) {
|
|
347
350
|
const I = [...P, K].join(" -> ");
|
|
348
351
|
throw new Error(
|
|
349
|
-
`Circular dependency detected in path '${
|
|
352
|
+
`Circular dependency detected in path '${w}':
|
|
350
353
|
${I}`
|
|
351
354
|
);
|
|
352
355
|
}
|
|
353
356
|
if (M.has(K)) return;
|
|
354
357
|
M.add(K), P.push(K);
|
|
355
|
-
const C =
|
|
358
|
+
const C = _.dependencies[K];
|
|
356
359
|
if (C) {
|
|
357
360
|
const [I] = C;
|
|
358
|
-
|
|
361
|
+
_.dependencies[I] && S(I);
|
|
359
362
|
}
|
|
360
363
|
P.pop();
|
|
361
364
|
};
|
|
@@ -363,347 +366,428 @@ ${I}`
|
|
|
363
366
|
S(k);
|
|
364
367
|
}
|
|
365
368
|
}
|
|
366
|
-
function i(
|
|
367
|
-
const
|
|
368
|
-
return k.pop(),
|
|
369
|
-
}
|
|
370
|
-
function c(
|
|
371
|
-
if (!
|
|
372
|
-
const
|
|
373
|
-
return
|
|
374
|
-
}
|
|
375
|
-
function h(
|
|
376
|
-
const
|
|
377
|
-
return
|
|
378
|
-
}
|
|
379
|
-
function
|
|
380
|
-
const
|
|
381
|
-
for (const [
|
|
382
|
-
const k =
|
|
383
|
-
if (
|
|
384
|
-
for (const S of
|
|
369
|
+
function i(g, w) {
|
|
370
|
+
const _ = g.map((S) => w ? R(w, S) : S), k = U(_[0]);
|
|
371
|
+
return k.pop(), R(...k);
|
|
372
|
+
}
|
|
373
|
+
function c(g, w) {
|
|
374
|
+
if (!w) return g;
|
|
375
|
+
const _ = `${w}${Ee}`;
|
|
376
|
+
return g.startsWith(_) ? g.slice(_.length) : g;
|
|
377
|
+
}
|
|
378
|
+
function h(g) {
|
|
379
|
+
const w = U(g);
|
|
380
|
+
return w.pop(), R(...w);
|
|
381
|
+
}
|
|
382
|
+
function p() {
|
|
383
|
+
const g = {};
|
|
384
|
+
for (const [w, _] of Object.entries(t.value)) {
|
|
385
|
+
const k = w === ce ? "" : w;
|
|
386
|
+
if (_.bundles)
|
|
387
|
+
for (const S of _.bundles) {
|
|
385
388
|
if (S.length < 2)
|
|
386
389
|
throw new Error(
|
|
387
390
|
`Bundle must contain at least 2 fields. Found ${S.length} field(s) in bundle: [${S.join(", ")}]`
|
|
388
391
|
);
|
|
389
|
-
const M = S.map((C) => k ?
|
|
390
|
-
|
|
392
|
+
const M = S.map((C) => k ? R(k, C) : C);
|
|
393
|
+
u(M, `Bundle [${S.join(", ")}]`);
|
|
391
394
|
const P = i(S, k) || ce;
|
|
392
|
-
|
|
395
|
+
g[P] || (g[P] = {}), g[P].bundles || (g[P].bundles = []);
|
|
393
396
|
const K = M.map((C) => c(C, P));
|
|
394
|
-
|
|
397
|
+
g[P].bundles.push(K);
|
|
395
398
|
}
|
|
396
|
-
if (
|
|
397
|
-
for (const [S, [M, P]] of Object.entries(
|
|
398
|
-
const K = k ?
|
|
399
|
-
|
|
399
|
+
if (_.dependencies)
|
|
400
|
+
for (const [S, [M, P]] of Object.entries(_.dependencies)) {
|
|
401
|
+
const K = k ? R(k, S) : S, C = k ? R(k, M) : M;
|
|
402
|
+
u(
|
|
400
403
|
[K, C],
|
|
401
404
|
`Dependency '${S}' -> '${M}'`
|
|
402
405
|
);
|
|
403
406
|
const I = h(K) || ce;
|
|
404
|
-
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
+
g[I] || (g[I] = {}), g[I].dependencies || (g[I].dependencies = {});
|
|
408
|
+
const W = c(K, I), J = c(C, I);
|
|
409
|
+
g[I].dependencies[W] = [J, P];
|
|
407
410
|
}
|
|
408
411
|
}
|
|
409
|
-
return l(
|
|
412
|
+
return l(g), f(g), g;
|
|
410
413
|
}
|
|
411
|
-
const
|
|
414
|
+
const m = b(() => {
|
|
412
415
|
try {
|
|
413
|
-
return
|
|
414
|
-
} catch (
|
|
415
|
-
return console.error("Invalid render rules:",
|
|
416
|
+
return p();
|
|
417
|
+
} catch (g) {
|
|
418
|
+
return console.error("Invalid render rules:", g instanceof Error ? g.message : String(g)), {};
|
|
416
419
|
}
|
|
417
420
|
});
|
|
418
|
-
function
|
|
419
|
-
if (!
|
|
420
|
-
return
|
|
421
|
-
const
|
|
422
|
-
return
|
|
423
|
-
}
|
|
424
|
-
function g
|
|
425
|
-
let
|
|
426
|
-
return
|
|
427
|
-
if (
|
|
428
|
-
const
|
|
421
|
+
function d(g) {
|
|
422
|
+
if (!g)
|
|
423
|
+
return m.value;
|
|
424
|
+
const w = ye(g, e());
|
|
425
|
+
return m.value[w];
|
|
426
|
+
}
|
|
427
|
+
function y(g) {
|
|
428
|
+
let w = !1;
|
|
429
|
+
return b(() => {
|
|
430
|
+
if (w) return;
|
|
431
|
+
const _ = j(g);
|
|
429
432
|
try {
|
|
430
|
-
return
|
|
433
|
+
return d(_);
|
|
431
434
|
} catch (k) {
|
|
432
|
-
|
|
435
|
+
w = !0, console.error(`Failed to get render rules for path: \`${_}\`,`, k instanceof Error ? k.message : "");
|
|
433
436
|
return;
|
|
434
437
|
}
|
|
435
438
|
});
|
|
436
439
|
}
|
|
437
|
-
const v =
|
|
438
|
-
() => Object.values(
|
|
439
|
-
(
|
|
440
|
+
const v = b(
|
|
441
|
+
() => Object.values(m.value).some(
|
|
442
|
+
(g) => g.dependencies && Object.keys(g.dependencies).length > 0
|
|
440
443
|
)
|
|
441
444
|
);
|
|
442
|
-
function T(
|
|
445
|
+
function T(g) {
|
|
443
446
|
const {
|
|
444
|
-
fieldPath:
|
|
445
|
-
rules:
|
|
447
|
+
fieldPath: w,
|
|
448
|
+
rules: _,
|
|
446
449
|
omittedFields: k
|
|
447
|
-
} =
|
|
448
|
-
|
|
449
|
-
() =>
|
|
450
|
-
() =>
|
|
451
|
-
() =>
|
|
450
|
+
} = g, S = dt("omit-");
|
|
451
|
+
te([
|
|
452
|
+
() => j(_),
|
|
453
|
+
() => j(w),
|
|
454
|
+
() => j(k)
|
|
452
455
|
], ([P, K, C], [, I]) => {
|
|
453
|
-
P ? t.value[K] = P : delete t.value[K], s(K, S, C), I && I !== K && (delete t.value[I],
|
|
456
|
+
P ? t.value[K] = P : delete t.value[K], s(K, S, C), I && I !== K && (delete t.value[I], n(I, S));
|
|
454
457
|
}, { immediate: !0, deep: !0 });
|
|
455
|
-
const M =
|
|
456
|
-
return
|
|
457
|
-
const P =
|
|
458
|
-
delete t.value[P],
|
|
458
|
+
const M = y(w);
|
|
459
|
+
return It(() => {
|
|
460
|
+
const P = j(w);
|
|
461
|
+
delete t.value[P], n(P, S);
|
|
459
462
|
}), M;
|
|
460
463
|
}
|
|
461
|
-
function
|
|
462
|
-
const
|
|
463
|
-
if (!
|
|
464
|
-
const
|
|
464
|
+
function x(g) {
|
|
465
|
+
const w = U(g);
|
|
466
|
+
if (!w.length) return !1;
|
|
467
|
+
const _ = w[w.length - 1], k = R(...w.slice(0, -1)), S = a.value[k];
|
|
465
468
|
if (S) {
|
|
466
|
-
const
|
|
467
|
-
if (
|
|
469
|
+
const J = Object.values(S);
|
|
470
|
+
if (J.length && J.every((E) => E.includes(_))) return !1;
|
|
468
471
|
}
|
|
469
|
-
const M = k === "" ? ce :
|
|
472
|
+
const M = k === "" ? ce : ye(k, e()), P = m.value[M]?.dependencies?.[_];
|
|
470
473
|
if (!P) return !1;
|
|
471
|
-
const [K, C] = P, I = k ?
|
|
472
|
-
return !
|
|
474
|
+
const [K, C] = P, I = k ? R(k, K) : K, W = ke(r(), U(I));
|
|
475
|
+
return !an(W, C);
|
|
473
476
|
}
|
|
474
477
|
return {
|
|
475
478
|
useCurrentRules: T,
|
|
476
|
-
createComputedRules:
|
|
479
|
+
createComputedRules: y,
|
|
477
480
|
hasDependencies: v,
|
|
478
|
-
isFieldHidden:
|
|
481
|
+
isFieldHidden: x
|
|
479
482
|
};
|
|
480
483
|
}
|
|
481
|
-
|
|
482
|
-
function
|
|
483
|
-
|
|
484
|
+
const Ve = "expressions", je = "";
|
|
485
|
+
function rn(e) {
|
|
486
|
+
const r = U(Xe(e));
|
|
487
|
+
if (!(r.length < 2))
|
|
488
|
+
return R(Ve, ...r.slice(1));
|
|
489
|
+
}
|
|
490
|
+
function sn(e, r) {
|
|
491
|
+
const t = U(Xe(e));
|
|
492
|
+
if (!(t[0] !== Ve || t.length < 2))
|
|
493
|
+
return R(r, ...t.slice(1));
|
|
494
|
+
}
|
|
495
|
+
function ln(e) {
|
|
496
|
+
const r = e?.fields;
|
|
497
|
+
if (Array.isArray(r))
|
|
498
|
+
for (const t of r) {
|
|
499
|
+
const a = Object.keys(t)[0];
|
|
500
|
+
if (a === Ve) continue;
|
|
501
|
+
const s = t[a];
|
|
502
|
+
if (!(s?.type !== "record" || !Array.isArray(s.fields)) && s.fields.some((n) => n[Object.keys(n)[0]]?.expressible === !0))
|
|
503
|
+
return a;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function un(e) {
|
|
507
|
+
return !!e && e.type === "string" && "expressible_kong_type" in e;
|
|
484
508
|
}
|
|
485
|
-
|
|
486
|
-
|
|
509
|
+
let cn = 0;
|
|
510
|
+
function dn() {
|
|
511
|
+
return `kid:${++cn}`;
|
|
512
|
+
}
|
|
513
|
+
function pn(e) {
|
|
514
|
+
const r = st(/* @__PURE__ */ new Map());
|
|
487
515
|
function t(i = "") {
|
|
488
|
-
const c =
|
|
516
|
+
const c = dn();
|
|
489
517
|
return r.set(c, i), c;
|
|
490
518
|
}
|
|
491
|
-
function
|
|
519
|
+
function a(i) {
|
|
492
520
|
return r.get(i);
|
|
493
521
|
}
|
|
494
522
|
function s(i, c) {
|
|
495
523
|
r.has(i) && r.set(i, c);
|
|
496
524
|
}
|
|
497
|
-
function
|
|
525
|
+
function n(i) {
|
|
498
526
|
r.delete(i);
|
|
499
527
|
}
|
|
500
|
-
function
|
|
501
|
-
return
|
|
528
|
+
function u(i) {
|
|
529
|
+
return mn(i, e, t);
|
|
502
530
|
}
|
|
503
531
|
function l(i) {
|
|
504
|
-
return
|
|
532
|
+
return fn(i, e, a);
|
|
505
533
|
}
|
|
506
534
|
function f() {
|
|
507
535
|
r.clear();
|
|
508
536
|
}
|
|
509
537
|
return {
|
|
510
538
|
createKey: t,
|
|
511
|
-
getKey:
|
|
539
|
+
getKey: a,
|
|
512
540
|
updateKey: s,
|
|
513
|
-
deleteKey:
|
|
514
|
-
serialize:
|
|
541
|
+
deleteKey: n,
|
|
542
|
+
serialize: u,
|
|
515
543
|
deserialize: l,
|
|
516
544
|
clear: f
|
|
517
545
|
};
|
|
518
546
|
}
|
|
519
|
-
function
|
|
520
|
-
const
|
|
547
|
+
function mn(e, r, t) {
|
|
548
|
+
const a = (s, n) => {
|
|
521
549
|
if (s == null || typeof s != "object")
|
|
522
550
|
return s;
|
|
523
551
|
if (Array.isArray(s))
|
|
524
552
|
return s.map((f, i) => {
|
|
525
|
-
const c =
|
|
526
|
-
return
|
|
553
|
+
const c = n ? R(n, `${i}`) : `${i}`;
|
|
554
|
+
return a(f, c);
|
|
527
555
|
});
|
|
528
|
-
if ((
|
|
556
|
+
if ((n ? r(n) : r())?.type === "map") {
|
|
529
557
|
const f = s, i = {};
|
|
530
558
|
return Object.keys(f).forEach((c) => {
|
|
531
|
-
const h = t(c),
|
|
532
|
-
i[h] =
|
|
559
|
+
const h = t(c), p = f[c], m = n ? R(n, c) : c;
|
|
560
|
+
i[h] = a(p, m);
|
|
533
561
|
}), i;
|
|
534
562
|
}
|
|
535
563
|
const l = {};
|
|
536
564
|
return Object.keys(s).forEach((f) => {
|
|
537
|
-
const i =
|
|
538
|
-
l[f] =
|
|
565
|
+
const i = n ? R(n, f) : f;
|
|
566
|
+
l[f] = a(s[f], i);
|
|
539
567
|
}), l;
|
|
540
568
|
};
|
|
541
|
-
return
|
|
569
|
+
return a(e);
|
|
542
570
|
}
|
|
543
|
-
function
|
|
544
|
-
const
|
|
571
|
+
function fn(e, r, t) {
|
|
572
|
+
const a = (s, n) => {
|
|
545
573
|
if (s == null || typeof s != "object")
|
|
546
574
|
return s;
|
|
547
575
|
if (Array.isArray(s))
|
|
548
576
|
return s.map((f, i) => {
|
|
549
|
-
const c =
|
|
550
|
-
return
|
|
577
|
+
const c = n ? R(n, `${i}`) : `${i}`;
|
|
578
|
+
return a(f, c);
|
|
551
579
|
});
|
|
552
|
-
if ((
|
|
580
|
+
if ((n ? r(n) : r())?.type === "map") {
|
|
553
581
|
const f = s, i = {};
|
|
554
582
|
return Object.keys(f).forEach((c) => {
|
|
555
|
-
const h = c,
|
|
556
|
-
if (
|
|
583
|
+
const h = c, p = f[h], m = t(h);
|
|
584
|
+
if (m == null) {
|
|
557
585
|
console.error(`[FreeForm] Missing name for key ID: ${String(h)}`);
|
|
558
586
|
return;
|
|
559
587
|
}
|
|
560
|
-
const
|
|
561
|
-
i[
|
|
588
|
+
const d = m || Ye, y = n ? R(n, d) : d;
|
|
589
|
+
i[m] = a(p, y);
|
|
562
590
|
}), i;
|
|
563
591
|
}
|
|
564
592
|
const l = {};
|
|
565
593
|
return Object.keys(s).forEach((f) => {
|
|
566
|
-
const i =
|
|
567
|
-
l[f] =
|
|
594
|
+
const i = n ? R(n, f) : f;
|
|
595
|
+
l[f] = a(s[f], i);
|
|
568
596
|
}), l;
|
|
569
597
|
};
|
|
570
|
-
return
|
|
598
|
+
return a(e);
|
|
571
599
|
}
|
|
572
|
-
function
|
|
600
|
+
function hn(e) {
|
|
573
601
|
return /^kid:\d+$/.test(e);
|
|
574
602
|
}
|
|
575
|
-
const [
|
|
603
|
+
const [gn, yn] = Rt(
|
|
576
604
|
function(r) {
|
|
577
605
|
const {
|
|
578
606
|
schema: t,
|
|
579
|
-
propsData:
|
|
607
|
+
propsData: a,
|
|
580
608
|
onChange: s,
|
|
581
|
-
propsRenderRules:
|
|
582
|
-
propsConfig:
|
|
609
|
+
propsRenderRules: n,
|
|
610
|
+
propsConfig: u
|
|
583
611
|
} = r, {
|
|
584
612
|
getDefault: l,
|
|
585
613
|
getEmptyOrDefault: f,
|
|
586
614
|
...i
|
|
587
|
-
} =
|
|
588
|
-
|
|
615
|
+
} = nn(t, () => j(u)), c = pn(i.getSchema), h = /* @__PURE__ */ new Map(), p = st({}), m = O(() => j(u) ?? {}), d = Se();
|
|
616
|
+
Le(ze, Kt(d, "default", xe));
|
|
589
617
|
const {
|
|
590
|
-
useCurrentRules:
|
|
618
|
+
useCurrentRules: y,
|
|
591
619
|
createComputedRules: v,
|
|
592
620
|
hasDependencies: T,
|
|
593
|
-
isFieldHidden:
|
|
594
|
-
} =
|
|
621
|
+
isFieldHidden: x
|
|
622
|
+
} = on(i.getSchemaMap, () => p), g = y({
|
|
595
623
|
fieldPath: ce,
|
|
596
|
-
rules:
|
|
624
|
+
rules: n
|
|
597
625
|
});
|
|
598
|
-
function
|
|
599
|
-
Object.keys(
|
|
600
|
-
delete
|
|
601
|
-
}), c.clear(), Object.assign(
|
|
626
|
+
function w(E) {
|
|
627
|
+
Object.keys(p).forEach((ae) => {
|
|
628
|
+
delete p[ae];
|
|
629
|
+
}), c.clear(), Object.assign(p, c.serialize(E));
|
|
630
|
+
}
|
|
631
|
+
const _ = se(!1);
|
|
632
|
+
function k(E) {
|
|
633
|
+
let ae;
|
|
634
|
+
!E || !P(j(E)) ? (_.value = !0, ae = l()) : (_.value = !1, ae = et(j(E))), tt(m.value.prepareFormData) ? w(m.value.prepareFormData(ae)) : w(ae);
|
|
602
635
|
}
|
|
603
|
-
const
|
|
604
|
-
function
|
|
605
|
-
|
|
606
|
-
|
|
636
|
+
const S = ln(t);
|
|
637
|
+
function M(E) {
|
|
638
|
+
if (x(E)) return !0;
|
|
639
|
+
const ae = S && sn(E, S);
|
|
640
|
+
return !!ae && x(ae);
|
|
607
641
|
}
|
|
608
|
-
function
|
|
609
|
-
return
|
|
642
|
+
function P(E) {
|
|
643
|
+
return tt(m.value.hasValue) ? m.value.hasValue(E) : !!E;
|
|
610
644
|
}
|
|
611
|
-
function
|
|
612
|
-
const
|
|
613
|
-
return T.value &&
|
|
614
|
-
|
|
615
|
-
|
|
645
|
+
function K() {
|
|
646
|
+
const E = et(j(p));
|
|
647
|
+
return T.value && ht(
|
|
648
|
+
E,
|
|
649
|
+
M,
|
|
616
650
|
f
|
|
617
|
-
), c.deserialize(
|
|
651
|
+
), c.deserialize(E);
|
|
618
652
|
}
|
|
619
|
-
|
|
620
|
-
s?.(
|
|
653
|
+
te(p, () => {
|
|
654
|
+
s?.(K());
|
|
621
655
|
}, { deep: !0 });
|
|
622
|
-
let
|
|
623
|
-
|
|
624
|
-
|
|
656
|
+
let C = !1;
|
|
657
|
+
te(() => a?.value, (E) => {
|
|
658
|
+
C && ge(K(), j(E)) || (k(E), C = !0);
|
|
625
659
|
}, { deep: !0, immediate: !0 });
|
|
626
|
-
function
|
|
627
|
-
return
|
|
660
|
+
function I(E) {
|
|
661
|
+
return E != null && typeof E == "object" && !Array.isArray(E) ? c.serialize(E) : E;
|
|
628
662
|
}
|
|
629
|
-
function
|
|
630
|
-
return
|
|
663
|
+
function W(E) {
|
|
664
|
+
return I(l(E));
|
|
631
665
|
}
|
|
632
|
-
function
|
|
633
|
-
return
|
|
666
|
+
function J(E) {
|
|
667
|
+
return I(f(E));
|
|
634
668
|
}
|
|
635
669
|
return {
|
|
636
670
|
/**
|
|
637
671
|
* The reactive form data object
|
|
638
672
|
*/
|
|
639
|
-
formData:
|
|
640
|
-
isSchemaDefaulted:
|
|
673
|
+
formData: p,
|
|
674
|
+
isSchemaDefaulted: _,
|
|
641
675
|
schema: t,
|
|
642
|
-
config:
|
|
676
|
+
config: m,
|
|
643
677
|
fieldRendererRegistry: h,
|
|
644
|
-
setValue:
|
|
645
|
-
useCurrentRenderRules:
|
|
646
|
-
rootRenderRules:
|
|
678
|
+
setValue: w,
|
|
679
|
+
useCurrentRenderRules: y,
|
|
680
|
+
rootRenderRules: g,
|
|
647
681
|
createComputedRenderRules: v,
|
|
648
682
|
...i,
|
|
649
|
-
getValue:
|
|
650
|
-
isFieldHidden:
|
|
683
|
+
getValue: K,
|
|
684
|
+
isFieldHidden: x,
|
|
651
685
|
keyIdMap: c,
|
|
652
|
-
getDefault:
|
|
653
|
-
getEmptyOrDefault:
|
|
686
|
+
getDefault: W,
|
|
687
|
+
getEmptyOrDefault: J
|
|
654
688
|
};
|
|
655
689
|
}
|
|
656
690
|
);
|
|
657
|
-
function
|
|
658
|
-
const e =
|
|
691
|
+
function ee() {
|
|
692
|
+
const e = yn();
|
|
659
693
|
if (!e)
|
|
660
694
|
throw new Error("useFormShared() called without provider.");
|
|
661
695
|
return e;
|
|
662
696
|
}
|
|
663
|
-
|
|
664
|
-
const r =
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
697
|
+
function bt(e) {
|
|
698
|
+
const { getSchema: r, getEmptyValue: t, isFieldHidden: a, formData: s } = ee(), n = b(() => Xe(j(e))), u = b(() => rn(n.value)), l = b(() => u.value ? r(u.value) : void 0), f = b(() => {
|
|
699
|
+
if (r(n.value)?.expressible) return !0;
|
|
700
|
+
const x = U(n.value);
|
|
701
|
+
if (x.length < 2) return !1;
|
|
702
|
+
const g = r(R(...x.slice(0, -1)));
|
|
703
|
+
return g?.type === "array" && !!g.expressible;
|
|
704
|
+
}), i = b(() => f.value && un(l.value)), c = b({
|
|
705
|
+
get: () => u.value ? ke(s, U(u.value)) : void 0,
|
|
706
|
+
set: (x) => {
|
|
707
|
+
if (u.value) {
|
|
708
|
+
if (y.value) {
|
|
709
|
+
h(x);
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
Ne(s, U(u.value), x);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
function h(x) {
|
|
717
|
+
const g = U(u.value), w = Number(g[g.length - 1]), _ = g.slice(0, -1), k = ke(s, U(n.value).slice(0, -1)), S = Math.max(
|
|
718
|
+
Array.isArray(k) ? k.length : 0,
|
|
719
|
+
w + 1
|
|
720
|
+
), M = ke(s, _), P = Array.from({ length: S }, (K, C) => {
|
|
721
|
+
const I = Array.isArray(M) ? M[C] : void 0;
|
|
722
|
+
return typeof I == "string" ? I : je;
|
|
723
|
+
});
|
|
724
|
+
P[w] = x ?? je, Ne(s, _, P);
|
|
725
|
+
}
|
|
726
|
+
const p = b(() => typeof c.value == "string" && c.value !== ""), m = b(() => l.value?.expressible_kong_type), d = b(() => a(n.value)), y = b(() => {
|
|
727
|
+
if (!u.value) return !1;
|
|
728
|
+
const x = U(u.value);
|
|
729
|
+
return x.length < 2 ? !1 : r(R(...x.slice(0, -1)))?.type === "array";
|
|
730
|
+
}), v = b(() => y.value ? je : t());
|
|
731
|
+
function T() {
|
|
732
|
+
c.value = v.value;
|
|
733
|
+
}
|
|
734
|
+
return {
|
|
735
|
+
available: i,
|
|
736
|
+
expressionPath: u,
|
|
737
|
+
schema: l,
|
|
738
|
+
value: c,
|
|
739
|
+
hasExpression: p,
|
|
740
|
+
kongType: m,
|
|
741
|
+
hide: d,
|
|
742
|
+
isArrayElement: y,
|
|
743
|
+
emptyValue: v,
|
|
744
|
+
clear: T
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
const $e = (e) => {
|
|
748
|
+
const r = ve(it, b(() => "")), t = b(() => {
|
|
749
|
+
const a = j(e);
|
|
750
|
+
let s = a;
|
|
751
|
+
return !at(a) && r.value && (s = R(r.value, a)), at(a) && (s = s.slice(Ce("").length)), s;
|
|
668
752
|
});
|
|
669
|
-
return
|
|
670
|
-
},
|
|
671
|
-
const { getSchema: r, getSchemaMap: t, fieldRendererRegistry:
|
|
672
|
-
const i =
|
|
673
|
-
const
|
|
674
|
-
return { ...
|
|
753
|
+
return Le(it, t), t;
|
|
754
|
+
}, vn = (e) => {
|
|
755
|
+
const { getSchema: r, getSchemaMap: t, fieldRendererRegistry: a } = ee(), { default: s, ...n } = Se(), u = ve(ze), l = [xe, "item", "label", "tooltip"], f = b(() => {
|
|
756
|
+
const i = j(u), c = t(), h = Object.keys(n).filter((p) => !l.includes(p)).reduce((p, m) => {
|
|
757
|
+
const d = ye(R(j(e), m), c);
|
|
758
|
+
return { ...p, [d]: n[m] };
|
|
675
759
|
}, {});
|
|
676
760
|
return i ? { ...i, ...h } : h;
|
|
677
761
|
});
|
|
678
|
-
return
|
|
762
|
+
return Le(ze, f), b(() => {
|
|
679
763
|
if (s) return;
|
|
680
|
-
const i =
|
|
764
|
+
const i = j(e), c = f.value[ye(i, t())];
|
|
681
765
|
if (c) return c;
|
|
682
766
|
const h = t();
|
|
683
|
-
for (const [
|
|
684
|
-
const
|
|
685
|
-
if (
|
|
686
|
-
return
|
|
767
|
+
for (const [p, m] of a) {
|
|
768
|
+
const d = ye(i, h);
|
|
769
|
+
if (p({ path: i, genericPath: d, schema: r(i) }))
|
|
770
|
+
return m;
|
|
687
771
|
}
|
|
688
772
|
});
|
|
689
|
-
},
|
|
690
|
-
function
|
|
691
|
-
const { formData: r } =
|
|
773
|
+
}, bn = /* @__PURE__ */ Symbol.for("kong-ui-public:entities-plugins:use-secret-input"), we = "__FREEFORM_SCHEMA_MAP__";
|
|
774
|
+
function _n(e) {
|
|
775
|
+
const { formData: r } = ee(), t = $e(e);
|
|
692
776
|
return {
|
|
693
|
-
value:
|
|
694
|
-
get: () =>
|
|
695
|
-
set: (s) =>
|
|
777
|
+
value: b({
|
|
778
|
+
get: () => ke(r, U(t.value)),
|
|
779
|
+
set: (s) => Ne(r, U(t.value), s)
|
|
696
780
|
})
|
|
697
781
|
};
|
|
698
782
|
}
|
|
699
|
-
function
|
|
700
|
-
const { getSchema: r, isFieldHidden: t, getEmptyOrDefault:
|
|
783
|
+
function ne(e) {
|
|
784
|
+
const { getSchema: r, isFieldHidden: t, getEmptyOrDefault: a, getEmptyValue: s } = ee(), n = $e(e), u = vn(n), { value: l } = _n(e), f = b(() => r(n.value)), i = b(() => t(n.value)), c = b(() => a(n.value)), h = b(() => s());
|
|
701
785
|
return f.value ? {
|
|
702
786
|
schema: f,
|
|
703
|
-
path:
|
|
704
|
-
renderer:
|
|
787
|
+
path: n,
|
|
788
|
+
renderer: u,
|
|
705
789
|
value: l,
|
|
706
|
-
ancestors:
|
|
790
|
+
ancestors: vt(n),
|
|
707
791
|
/**
|
|
708
792
|
* Hide the field but keep its state.
|
|
709
793
|
*/
|
|
@@ -712,39 +796,39 @@ function Z(e) {
|
|
|
712
796
|
emptyValue: h,
|
|
713
797
|
error: null
|
|
714
798
|
} : {
|
|
715
|
-
error: new Error(`path '${
|
|
799
|
+
error: new Error(`path '${n.value}' is not found in schema.`)
|
|
716
800
|
};
|
|
717
801
|
}
|
|
718
|
-
function
|
|
719
|
-
const t = /* @__PURE__ */ new WeakMap(),
|
|
802
|
+
function An(e, r) {
|
|
803
|
+
const t = /* @__PURE__ */ new WeakMap(), a = /* @__PURE__ */ new Map();
|
|
720
804
|
function s() {
|
|
721
|
-
return
|
|
805
|
+
return dt(`${e}-`);
|
|
722
806
|
}
|
|
723
|
-
function
|
|
724
|
-
if (
|
|
807
|
+
function n(u, l) {
|
|
808
|
+
if (u == null || typeof u != "object")
|
|
725
809
|
return `${e}-${l}`;
|
|
726
|
-
if (t.has(
|
|
727
|
-
return t.get(
|
|
728
|
-
const f =
|
|
729
|
-
return
|
|
810
|
+
if (t.has(u))
|
|
811
|
+
return t.get(u);
|
|
812
|
+
const f = a.has(l) ? a.get(l) : s();
|
|
813
|
+
return a.set(l, f), t.set(u, f), f;
|
|
730
814
|
}
|
|
731
|
-
return
|
|
732
|
-
const l =
|
|
815
|
+
return te(r, (u) => {
|
|
816
|
+
const l = j(u), f = /* @__PURE__ */ new Set();
|
|
733
817
|
l.forEach((i, c) => {
|
|
734
818
|
f.add(c);
|
|
735
|
-
}), Array.from(
|
|
736
|
-
f.has(i) ||
|
|
819
|
+
}), Array.from(a.keys()).forEach((i) => {
|
|
820
|
+
f.has(i) || a.delete(i);
|
|
737
821
|
});
|
|
738
|
-
}, { immediate: !0, deep: !0 }), { getKey:
|
|
822
|
+
}, { immediate: !0, deep: !0 }), { getKey: n };
|
|
739
823
|
}
|
|
740
|
-
function
|
|
741
|
-
|
|
742
|
-
window[we] || (window[we] = {}), window[we][r] =
|
|
743
|
-
}, { immediate: !0, deep: !0 }),
|
|
824
|
+
function ci(e, r) {
|
|
825
|
+
te(e, (t) => {
|
|
826
|
+
window[we] || (window[we] = {}), window[we][r] = lt(t);
|
|
827
|
+
}, { immediate: !0, deep: !0 }), Tt(() => {
|
|
744
828
|
window[we] && delete window[we][r];
|
|
745
829
|
});
|
|
746
830
|
}
|
|
747
|
-
const
|
|
831
|
+
const wn = {
|
|
748
832
|
ip: "IP",
|
|
749
833
|
ssl: "SSL",
|
|
750
834
|
ttl: "TTL",
|
|
@@ -786,110 +870,110 @@ const ca = {
|
|
|
786
870
|
redis: "Redis",
|
|
787
871
|
uris: "URIs"
|
|
788
872
|
};
|
|
789
|
-
function
|
|
790
|
-
return
|
|
873
|
+
function _t(e) {
|
|
874
|
+
return wn[e.toLocaleLowerCase()] ?? e;
|
|
791
875
|
}
|
|
792
|
-
function
|
|
793
|
-
return e.split("_").map(
|
|
876
|
+
function At(e) {
|
|
877
|
+
return e.split("_").map(_t).join(" ");
|
|
794
878
|
}
|
|
795
|
-
function
|
|
796
|
-
const t =
|
|
879
|
+
function kn(e, r) {
|
|
880
|
+
const t = ve(ot, {
|
|
797
881
|
parentPath: null,
|
|
798
882
|
isolate: !1
|
|
799
|
-
}), { parentPath:
|
|
800
|
-
parentPath:
|
|
883
|
+
}), { parentPath: a, isolate: s } = j(t), n = se(a ? R(a, e) : e), u = se({
|
|
884
|
+
parentPath: n.value,
|
|
801
885
|
isolate: s
|
|
802
886
|
});
|
|
803
|
-
return
|
|
804
|
-
const { parentPath: i, isolate: c } = f, h = i ?
|
|
887
|
+
return te([O(r), O(t)], ([l, f]) => {
|
|
888
|
+
const { parentPath: i, isolate: c } = f, h = i ? R(i, e) : e;
|
|
805
889
|
l ? {
|
|
806
890
|
isolate: () => {
|
|
807
|
-
|
|
891
|
+
n.value = e, u.value.isolate = !0, u.value.parentPath = null;
|
|
808
892
|
},
|
|
809
893
|
"isolate-children": () => {
|
|
810
|
-
|
|
894
|
+
u.value.isolate = !0, u.value.parentPath = null;
|
|
811
895
|
},
|
|
812
896
|
reset: () => {
|
|
813
|
-
|
|
897
|
+
n.value = e, u.value.isolate = !1, u.value.parentPath = null;
|
|
814
898
|
},
|
|
815
899
|
"reset-children": () => {
|
|
816
|
-
|
|
900
|
+
u.value.isolate = !1, u.value.parentPath = null;
|
|
817
901
|
},
|
|
818
902
|
inherit: () => {
|
|
819
|
-
|
|
903
|
+
n.value = h, u.value.isolate = !1, u.value.parentPath = h;
|
|
820
904
|
}
|
|
821
|
-
}[l]?.() : c && (
|
|
822
|
-
}, { deep: !0, immediate: !0 }),
|
|
905
|
+
}[l]?.() : c && (n.value = e, u.value.isolate = !0, u.value.parentPath = null);
|
|
906
|
+
}, { deep: !0, immediate: !0 }), Le(ot, u), n;
|
|
823
907
|
}
|
|
824
|
-
function
|
|
825
|
-
return
|
|
908
|
+
function wt(e) {
|
|
909
|
+
return U(e).map((t) => t.split("_").map(_t).join(" ")).map(Mt).join(" › ");
|
|
826
910
|
}
|
|
827
|
-
function
|
|
828
|
-
const t =
|
|
829
|
-
return
|
|
830
|
-
const f =
|
|
911
|
+
function Cn(e, r) {
|
|
912
|
+
const t = j(e), a = fe(t), { config: s, getSchema: n } = ee(), u = kn(a, r), l = vt(e);
|
|
913
|
+
return b(() => {
|
|
914
|
+
const f = u.value ?? a, i = l.value.parent?.path ? n(l.value.parent.path) : null, c = i?.type === "array", h = i?.type === "map";
|
|
831
915
|
if (c || h)
|
|
832
916
|
return "";
|
|
833
|
-
const
|
|
834
|
-
return s.value.transformLabel ? s.value.transformLabel(
|
|
917
|
+
const p = wt(f);
|
|
918
|
+
return s.value.transformLabel ? s.value.transformLabel(p, t) : p;
|
|
835
919
|
});
|
|
836
920
|
}
|
|
837
|
-
function
|
|
838
|
-
const { getLabelAttributes: t, getPlaceholder:
|
|
839
|
-
return
|
|
840
|
-
...
|
|
841
|
-
placeholder:
|
|
842
|
-
labelAttributes:
|
|
843
|
-
label:
|
|
844
|
-
required:
|
|
921
|
+
function le(e, r) {
|
|
922
|
+
const { getLabelAttributes: t, getPlaceholder: a, getSchema: s } = ee(), n = j(e), u = j(r), l = Cn(e, O(() => j(r).resetLabelPath));
|
|
923
|
+
return b(() => ({
|
|
924
|
+
...u,
|
|
925
|
+
placeholder: u.placeholder ?? a(n) ?? void 0,
|
|
926
|
+
labelAttributes: u.labelAttributes ?? t(n),
|
|
927
|
+
label: u.label ?? l.value,
|
|
928
|
+
required: u.required ?? s(n)?.required
|
|
845
929
|
}));
|
|
846
930
|
}
|
|
847
|
-
function
|
|
848
|
-
const { value: t, ...
|
|
849
|
-
if (
|
|
850
|
-
return
|
|
851
|
-
}), l =
|
|
852
|
-
const
|
|
853
|
-
return [
|
|
931
|
+
function Sn(e, r) {
|
|
932
|
+
const { value: t, ...a } = ne(e), { getEmptyOrDefault: s, keyIdMap: n } = ee(), u = b(() => {
|
|
933
|
+
if (a.path)
|
|
934
|
+
return a.schema.value.values;
|
|
935
|
+
}), l = b(() => t ? Object.keys(t.value || {}).map((d) => {
|
|
936
|
+
const y = d, v = n.getKey(y) ?? "";
|
|
937
|
+
return [y, v];
|
|
854
938
|
}) : []);
|
|
855
|
-
function f(
|
|
856
|
-
t && (
|
|
939
|
+
function f(m, d) {
|
|
940
|
+
t && (n.updateKey(m, d), t.value = { ...t.value });
|
|
857
941
|
}
|
|
858
942
|
function i() {
|
|
859
943
|
if (!t) return;
|
|
860
|
-
const
|
|
944
|
+
const m = n.createKey(), d = s(R(a.path.value, m));
|
|
861
945
|
return t.value = {
|
|
862
946
|
...t.value,
|
|
863
|
-
[
|
|
864
|
-
},
|
|
865
|
-
}
|
|
866
|
-
function c(
|
|
867
|
-
if (
|
|
868
|
-
const { [
|
|
869
|
-
Object.keys(
|
|
870
|
-
}
|
|
871
|
-
function h(
|
|
872
|
-
return
|
|
873
|
-
}
|
|
874
|
-
const
|
|
875
|
-
if (!
|
|
876
|
-
const
|
|
877
|
-
let
|
|
878
|
-
return
|
|
947
|
+
[m]: d
|
|
948
|
+
}, m;
|
|
949
|
+
}
|
|
950
|
+
function c(m) {
|
|
951
|
+
if (n.deleteKey(m), !t) return;
|
|
952
|
+
const { [m]: d, ...y } = t.value || {};
|
|
953
|
+
Object.keys(y).length === 0 ? t.value = a.schema?.value?.required ? {} : a.emptyValue.value : t.value = y;
|
|
954
|
+
}
|
|
955
|
+
function h(m) {
|
|
956
|
+
return n.getKey(m);
|
|
957
|
+
}
|
|
958
|
+
const p = b(() => {
|
|
959
|
+
if (!a.path) return "";
|
|
960
|
+
const m = fe(a.path.value);
|
|
961
|
+
let d = m;
|
|
962
|
+
return hn(m) && (d = n.getKey(m) ?? ""), At(d);
|
|
879
963
|
});
|
|
880
|
-
if (r &&
|
|
881
|
-
let
|
|
964
|
+
if (r && u.value?.type === "string") {
|
|
965
|
+
let m = function() {
|
|
882
966
|
if (!t || !t.value) return null;
|
|
883
|
-
const
|
|
967
|
+
const y = {};
|
|
884
968
|
for (const [v, T] of Object.entries(t.value)) {
|
|
885
|
-
const
|
|
886
|
-
|
|
969
|
+
const x = n.getKey(v);
|
|
970
|
+
x && (y[x] = T);
|
|
887
971
|
}
|
|
888
|
-
return
|
|
889
|
-
},
|
|
890
|
-
|
|
891
|
-
const v =
|
|
892
|
-
|
|
972
|
+
return y;
|
|
973
|
+
}, d = null;
|
|
974
|
+
te(() => t?.value, (y) => {
|
|
975
|
+
const v = m();
|
|
976
|
+
ge(d, v) || (d = v, r?.(v));
|
|
893
977
|
}, { deep: !0 });
|
|
894
978
|
}
|
|
895
979
|
return {
|
|
@@ -897,23 +981,23 @@ function ma(e, r) {
|
|
|
897
981
|
updateKey: f,
|
|
898
982
|
addKey: i,
|
|
899
983
|
removeKey: c,
|
|
900
|
-
field:
|
|
901
|
-
fieldDisplayName:
|
|
984
|
+
field: a,
|
|
985
|
+
fieldDisplayName: p,
|
|
902
986
|
getKeyName: h
|
|
903
987
|
};
|
|
904
988
|
}
|
|
905
|
-
const
|
|
906
|
-
actions:
|
|
907
|
-
plugins:
|
|
989
|
+
const xn = { add_entity: "Add {entity}", remove_entity: "Remove {entity}" }, In = { form: { field_rules: { at_least_one_of: "At least one of the following values is required: {parameters}.", mutually_required: "These values must be used together: {parameters}.", mutually_exclusive: "Only one of these values can be used: {parameters}." } }, "free-form": { tag_helper: "Use comma to separate values. eg: value1, value2", foreign_placeholder: "Enter a UUID of {entity}", vault_picker: { component_error: "The vault secret picker is not available" }, expression: { add: "Add expression", remove: "Remove expression", label: "Kong plug-in dynamic expression", info: "Supply this value as an expression that is evaluated on every request. When set, it takes priority over the value entered above.", help: { text: "Define a Kong plug-in dynamic expression to evaluate each request. The expression must return {type}. {link}", learn: "Learn more" }, returns: { string: "a string", number: "a number", integer: "an integer", boolean: "a boolean value (true or false)", unknown: "a value of the type of the field above" } } } }, Tn = {
|
|
990
|
+
actions: xn,
|
|
991
|
+
plugins: In
|
|
908
992
|
};
|
|
909
|
-
function
|
|
910
|
-
const e =
|
|
993
|
+
function he() {
|
|
994
|
+
const e = pt("en-us", Tn);
|
|
911
995
|
return {
|
|
912
996
|
i18n: e,
|
|
913
|
-
i18nT:
|
|
997
|
+
i18nT: mt(e)
|
|
914
998
|
};
|
|
915
999
|
}
|
|
916
|
-
const
|
|
1000
|
+
const Ae = /* @__PURE__ */ z({
|
|
917
1001
|
__name: "EnhancedInput",
|
|
918
1002
|
props: {
|
|
919
1003
|
modelValue: {},
|
|
@@ -922,31 +1006,31 @@ const _e = /* @__PURE__ */ z({
|
|
|
922
1006
|
},
|
|
923
1007
|
emits: ["update:modelValue"],
|
|
924
1008
|
setup(e, { emit: r }) {
|
|
925
|
-
const t = e,
|
|
926
|
-
|
|
1009
|
+
const t = e, a = _e(), s = r, n = b(() => t.multiline ? jt : t.secret ? Jt : Ot), u = b(() => a.characterLimit ?? (t.multiline ? !1 : void 0)), l = se(t.modelValue);
|
|
1010
|
+
te(() => t.modelValue, (h) => {
|
|
927
1011
|
l.value = h;
|
|
928
1012
|
});
|
|
929
|
-
const { config: f } =
|
|
1013
|
+
const { config: f } = ee(), i = (h) => {
|
|
930
1014
|
h !== l.value && (l.value = h, f.value.updateOnChange || s("update:modelValue", h));
|
|
931
1015
|
}, c = () => {
|
|
932
1016
|
f.value.updateOnChange && s("update:modelValue", l.value);
|
|
933
1017
|
};
|
|
934
|
-
return (h,
|
|
935
|
-
"character-limit":
|
|
1018
|
+
return (h, p) => (A(), q(o(n), G(h.$attrs, {
|
|
1019
|
+
"character-limit": u.value,
|
|
936
1020
|
"model-value": e.modelValue,
|
|
937
1021
|
resizable: e.multiline ? !0 : void 0,
|
|
938
1022
|
onChange: c,
|
|
939
1023
|
"onUpdate:modelValue": i
|
|
940
|
-
}),
|
|
941
|
-
|
|
942
|
-
name:
|
|
943
|
-
fn:
|
|
944
|
-
D(h.$slots,
|
|
1024
|
+
}), Z({ _: 2 }, [
|
|
1025
|
+
de(Se(), (m, d) => ({
|
|
1026
|
+
name: d,
|
|
1027
|
+
fn: L((y) => [
|
|
1028
|
+
D(h.$slots, d, We(ut(y)))
|
|
945
1029
|
])
|
|
946
1030
|
}))
|
|
947
1031
|
]), 1040, ["character-limit", "model-value", "resizable"]));
|
|
948
1032
|
}
|
|
949
|
-
}),
|
|
1033
|
+
}), Pn = ["innerHTML"], qn = /* @__PURE__ */ z({
|
|
950
1034
|
inheritAttrs: !1,
|
|
951
1035
|
__name: "StringField",
|
|
952
1036
|
props: {
|
|
@@ -972,19 +1056,19 @@ const _e = /* @__PURE__ */ z({
|
|
|
972
1056
|
},
|
|
973
1057
|
emits: ["update:modelValue"],
|
|
974
1058
|
setup(e, { emit: r }) {
|
|
975
|
-
const t =
|
|
1059
|
+
const t = _e(), { i18n: a } = he(), s = ve(bn, b(() => !1)), n = pe(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), u = r, { value: l, hide: f, ...i } = ne(O(() => e.name)), c = le(i.path, O({ ...n, ...t }));
|
|
976
1060
|
function h(T) {
|
|
977
|
-
l.value = T === "" ? i.emptyValue.value : T,
|
|
1061
|
+
l.value = T === "" ? i.emptyValue.value : T, u("update:modelValue", l.value);
|
|
978
1062
|
}
|
|
979
|
-
const
|
|
980
|
-
return (T,
|
|
981
|
-
const
|
|
982
|
-
return i.error ? (
|
|
1063
|
+
const p = b(() => e.showPasswordMaskToggle !== void 0 ? e.showPasswordMaskToggle : n.type === "password" ? !0 : !!(i.schema?.value).encrypted), m = ve(ft, void 0), d = b(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!i.schema.value?.referenceable), y = b(() => ({ referenceable: d.value })), v = b(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : fe(e.name) === "name");
|
|
1064
|
+
return (T, x) => {
|
|
1065
|
+
const g = N("KAlert");
|
|
1066
|
+
return i.error ? (A(), q(g, {
|
|
983
1067
|
key: 0,
|
|
984
1068
|
appearance: "danger",
|
|
985
1069
|
message: i.error.message
|
|
986
|
-
}, null, 8, ["message"])) : X((
|
|
987
|
-
|
|
1070
|
+
}, null, 8, ["message"])) : X((A(), $("div", We(G({ key: 1 }, T.$attrs)), [
|
|
1071
|
+
V(Ae, G(o(c), {
|
|
988
1072
|
id: e.inputId,
|
|
989
1073
|
class: "ff-string-field",
|
|
990
1074
|
"data-1p-ignore": v.value,
|
|
@@ -996,60 +1080,60 @@ const _e = /* @__PURE__ */ z({
|
|
|
996
1080
|
"model-value": o(l) ?? "",
|
|
997
1081
|
multiline: e.multiline,
|
|
998
1082
|
placeholder: e.placeholder ?? o(c).placeholder,
|
|
999
|
-
secret:
|
|
1000
|
-
"show-password-mask-toggle":
|
|
1001
|
-
type:
|
|
1083
|
+
secret: p.value && o(s),
|
|
1084
|
+
"show-password-mask-toggle": p.value && !o(s),
|
|
1085
|
+
type: p.value && !o(s) ? "password" : p.value ? void 0 : "text",
|
|
1002
1086
|
"onUpdate:modelValue": h
|
|
1003
|
-
}),
|
|
1087
|
+
}), Z({ _: 2 }, [
|
|
1004
1088
|
o(c).labelAttributes?.info ? {
|
|
1005
1089
|
name: "label-tooltip",
|
|
1006
|
-
fn:
|
|
1090
|
+
fn: L(() => [
|
|
1007
1091
|
D(T.$slots, "tooltip", {}, () => [
|
|
1008
|
-
|
|
1092
|
+
B("div", {
|
|
1009
1093
|
innerHTML: o(c).labelAttributes.info
|
|
1010
|
-
}, null, 8,
|
|
1094
|
+
}, null, 8, Pn)
|
|
1011
1095
|
], !0)
|
|
1012
1096
|
]),
|
|
1013
1097
|
key: "0"
|
|
1014
1098
|
} : void 0,
|
|
1015
1099
|
!(e.multiline && e.error) && T.$slots.help ? {
|
|
1016
1100
|
name: "help",
|
|
1017
|
-
fn:
|
|
1101
|
+
fn: L(() => [
|
|
1018
1102
|
D(T.$slots, "help", {}, void 0, !0)
|
|
1019
1103
|
]),
|
|
1020
1104
|
key: "1"
|
|
1021
1105
|
} : void 0,
|
|
1022
1106
|
!e.multiline && e.inlineVaultPicker ? {
|
|
1023
1107
|
name: "after",
|
|
1024
|
-
fn:
|
|
1025
|
-
o(
|
|
1108
|
+
fn: L(() => [
|
|
1109
|
+
o(m) && d.value ? (A(), q(ie(o(m)), {
|
|
1026
1110
|
key: 0,
|
|
1027
|
-
schema:
|
|
1111
|
+
schema: y.value,
|
|
1028
1112
|
update: h,
|
|
1029
1113
|
value: o(l) ?? ""
|
|
1030
1114
|
}, null, 8, ["schema", "value"])) : H("", !0),
|
|
1031
|
-
|
|
1115
|
+
d.value && !o(m) ? (A(), q(g, {
|
|
1032
1116
|
key: 1,
|
|
1033
1117
|
appearance: "warning",
|
|
1034
1118
|
"data-testid": `ff-vault-secret-picker-warning-${i.path.value}`,
|
|
1035
|
-
message: o(
|
|
1119
|
+
message: o(a).t("plugins.free-form.vault_picker.component_error")
|
|
1036
1120
|
}, null, 8, ["data-testid", "message"])) : H("", !0)
|
|
1037
1121
|
]),
|
|
1038
1122
|
key: "2"
|
|
1039
1123
|
} : void 0
|
|
1040
1124
|
]), 1040, ["id", "data-1p-ignore", "data-autofocus", "data-testid", "error", "error-message", "help", "model-value", "multiline", "placeholder", "secret", "show-password-mask-toggle", "type"]),
|
|
1041
|
-
e.inlineVaultPicker ? H("", !0) : (
|
|
1042
|
-
o(
|
|
1125
|
+
e.inlineVaultPicker ? H("", !0) : (A(), $(oe, { key: 0 }, [
|
|
1126
|
+
o(m) && d.value ? (A(), q(ie(o(m)), {
|
|
1043
1127
|
key: 0,
|
|
1044
|
-
schema:
|
|
1128
|
+
schema: y.value,
|
|
1045
1129
|
update: h,
|
|
1046
1130
|
value: o(l) ?? ""
|
|
1047
1131
|
}, null, 8, ["schema", "value"])) : H("", !0),
|
|
1048
|
-
|
|
1132
|
+
d.value && !o(m) ? (A(), q(g, {
|
|
1049
1133
|
key: 1,
|
|
1050
1134
|
appearance: "warning",
|
|
1051
1135
|
"data-testid": `ff-vault-secret-picker-warning-${i.path.value}`,
|
|
1052
|
-
message: o(
|
|
1136
|
+
message: o(a).t("plugins.free-form.vault_picker.component_error")
|
|
1053
1137
|
}, null, 8, ["data-testid", "message"])) : H("", !0)
|
|
1054
1138
|
], 64))
|
|
1055
1139
|
], 16)), [
|
|
@@ -1057,12 +1141,123 @@ const _e = /* @__PURE__ */ z({
|
|
|
1057
1141
|
]);
|
|
1058
1142
|
};
|
|
1059
1143
|
}
|
|
1060
|
-
}),
|
|
1144
|
+
}), Y = (e, r) => {
|
|
1061
1145
|
const t = e.__vccOpts || e;
|
|
1062
|
-
for (const [
|
|
1063
|
-
t[
|
|
1146
|
+
for (const [a, s] of r)
|
|
1147
|
+
t[a] = s;
|
|
1064
1148
|
return t;
|
|
1065
|
-
},
|
|
1149
|
+
}, Qe = /* @__PURE__ */ Y(qn, [["__scopeId", "data-v-70f2bad0"]]), Ln = {
|
|
1150
|
+
jqlang: "https://jqlang.org/manual/",
|
|
1151
|
+
condition: "https://developer.konghq.com/gateway/plugins/expressions/",
|
|
1152
|
+
customPluginSandboxing: "https://developer.konghq.com/gateway/sandboxing/",
|
|
1153
|
+
pluginPriority: "https://developer.konghq.com/gateway/entities/plugin/#plugin-priority",
|
|
1154
|
+
customPluginInstalled: "https://developer.konghq.com/custom-plugins/konnect-hybrid-mode/",
|
|
1155
|
+
customPluginStreamed: "https://developer.konghq.com/custom-plugins/streaming-plugins/"
|
|
1156
|
+
}, En = ["data-expression-for", "data-testid"], Kn = {
|
|
1157
|
+
key: 1,
|
|
1158
|
+
class: "ff-expression-editor-expanded"
|
|
1159
|
+
}, Mn = /* @__PURE__ */ z({
|
|
1160
|
+
name: "ExpressionEditor",
|
|
1161
|
+
__name: "ExpressionEditor",
|
|
1162
|
+
props: {
|
|
1163
|
+
name: {},
|
|
1164
|
+
placeholder: {}
|
|
1165
|
+
},
|
|
1166
|
+
setup(e) {
|
|
1167
|
+
const { i18n: r, i18nT: t } = he(), a = $e(O(() => e.name)), s = bt(a), n = b(() => Ce(s.expressionPath.value)), u = se(s.hasExpression.value);
|
|
1168
|
+
te(s.hasExpression, (p) => {
|
|
1169
|
+
p && (u.value = !0);
|
|
1170
|
+
});
|
|
1171
|
+
const l = {
|
|
1172
|
+
string: "plugins.free-form.expression.returns.string",
|
|
1173
|
+
number: "plugins.free-form.expression.returns.number",
|
|
1174
|
+
integer: "plugins.free-form.expression.returns.integer",
|
|
1175
|
+
boolean: "plugins.free-form.expression.returns.boolean"
|
|
1176
|
+
}, f = b(() => {
|
|
1177
|
+
const p = s.kongType.value;
|
|
1178
|
+
return p && p in l ? l[p] : "plugins.free-form.expression.returns.unknown";
|
|
1179
|
+
}), i = b(() => ({
|
|
1180
|
+
info: r.t("plugins.free-form.expression.info"),
|
|
1181
|
+
tooltipAttributes: { maxWidth: "300px", placement: "top" },
|
|
1182
|
+
"data-testid": `ff-expression-label-${a.value}`
|
|
1183
|
+
}));
|
|
1184
|
+
function c(p) {
|
|
1185
|
+
s.value.value = p;
|
|
1186
|
+
}
|
|
1187
|
+
function h() {
|
|
1188
|
+
s.clear(), u.value = !1;
|
|
1189
|
+
}
|
|
1190
|
+
return (p, m) => o(s).available.value ? X((A(), $("div", {
|
|
1191
|
+
key: 0,
|
|
1192
|
+
class: "ff-expression-editor",
|
|
1193
|
+
"data-expression-for": o(s).expressionPath.value,
|
|
1194
|
+
"data-testid": `ff-expression-${o(a)}`
|
|
1195
|
+
}, [
|
|
1196
|
+
u.value ? (A(), $("div", Kn, [
|
|
1197
|
+
V(Qe, {
|
|
1198
|
+
class: "ff-expression-editor-input",
|
|
1199
|
+
label: o(r).t("plugins.free-form.expression.label"),
|
|
1200
|
+
"label-attributes": i.value,
|
|
1201
|
+
multiline: "",
|
|
1202
|
+
name: n.value,
|
|
1203
|
+
placeholder: e.placeholder ?? "",
|
|
1204
|
+
rows: 3,
|
|
1205
|
+
"onUpdate:modelValue": c
|
|
1206
|
+
}, {
|
|
1207
|
+
help: L(() => [
|
|
1208
|
+
D(p.$slots, "help", {}, () => [
|
|
1209
|
+
V(o(t), { keypath: "plugins.free-form.expression.help.text" }, {
|
|
1210
|
+
type: L(() => [
|
|
1211
|
+
ue(re(o(r).t(f.value)), 1)
|
|
1212
|
+
]),
|
|
1213
|
+
link: L(() => [
|
|
1214
|
+
V(o(Dt), {
|
|
1215
|
+
"hide-icon": "",
|
|
1216
|
+
href: o(Ln).condition
|
|
1217
|
+
}, {
|
|
1218
|
+
default: L(() => [
|
|
1219
|
+
ue(re(o(r).t("plugins.free-form.expression.help.learn")), 1)
|
|
1220
|
+
]),
|
|
1221
|
+
_: 1
|
|
1222
|
+
}, 8, ["href"])
|
|
1223
|
+
]),
|
|
1224
|
+
_: 1
|
|
1225
|
+
})
|
|
1226
|
+
], !0)
|
|
1227
|
+
]),
|
|
1228
|
+
_: 3
|
|
1229
|
+
}, 8, ["label", "label-attributes", "name", "placeholder"]),
|
|
1230
|
+
V(o(nt), {
|
|
1231
|
+
appearance: "tertiary",
|
|
1232
|
+
"aria-label": o(r).t("plugins.free-form.expression.remove"),
|
|
1233
|
+
class: "ff-expression-editor-remove",
|
|
1234
|
+
"data-testid": `ff-expression-remove-${o(a)}`,
|
|
1235
|
+
icon: "",
|
|
1236
|
+
onClick: h
|
|
1237
|
+
}, {
|
|
1238
|
+
default: L(() => [
|
|
1239
|
+
V(o(Je))
|
|
1240
|
+
]),
|
|
1241
|
+
_: 1
|
|
1242
|
+
}, 8, ["aria-label", "data-testid"])
|
|
1243
|
+
])) : (A(), q(o(nt), {
|
|
1244
|
+
key: 0,
|
|
1245
|
+
appearance: "tertiary",
|
|
1246
|
+
class: "ff-expression-editor-add",
|
|
1247
|
+
"data-testid": `ff-expression-add-${o(a)}`,
|
|
1248
|
+
onClick: m[0] || (m[0] = (d) => u.value = !0)
|
|
1249
|
+
}, {
|
|
1250
|
+
default: L(() => [
|
|
1251
|
+
V(o(qe)),
|
|
1252
|
+
ue(" " + re(o(r).t("plugins.free-form.expression.add")), 1)
|
|
1253
|
+
]),
|
|
1254
|
+
_: 1
|
|
1255
|
+
}, 8, ["data-testid"]))
|
|
1256
|
+
], 8, En)), [
|
|
1257
|
+
[Q, !o(s).hide.value]
|
|
1258
|
+
]) : H("", !0);
|
|
1259
|
+
}
|
|
1260
|
+
}), Rn = /* @__PURE__ */ Y(Mn, [["__scopeId", "data-v-d2995aa6"]]), Vn = ["innerHTML"], $n = /* @__PURE__ */ z({
|
|
1066
1261
|
inheritAttrs: !1,
|
|
1067
1262
|
__name: "BooleanField",
|
|
1068
1263
|
props: {
|
|
@@ -1073,29 +1268,29 @@ const _e = /* @__PURE__ */ z({
|
|
|
1073
1268
|
},
|
|
1074
1269
|
emits: ["update:modelValue"],
|
|
1075
1270
|
setup(e, { emit: r }) {
|
|
1076
|
-
const t =
|
|
1077
|
-
|
|
1078
|
-
}, i =
|
|
1271
|
+
const t = pe(e, ["autofocus", "name"]), { value: a, hide: s, emptyOrDefaultValue: n, ...u } = ne(O(() => e.name)), l = r, f = (c) => {
|
|
1272
|
+
a.value = c, l("update:modelValue", c);
|
|
1273
|
+
}, i = le(u.path, t);
|
|
1079
1274
|
return (c, h) => {
|
|
1080
|
-
const
|
|
1081
|
-
return
|
|
1275
|
+
const p = N("KAlert");
|
|
1276
|
+
return u.error ? (A(), q(p, {
|
|
1082
1277
|
key: 0,
|
|
1083
1278
|
appearance: "danger",
|
|
1084
|
-
message:
|
|
1085
|
-
}, null, 8, ["message"])) : X((
|
|
1279
|
+
message: u.error.message
|
|
1280
|
+
}, null, 8, ["message"])) : X((A(), q(o(Ft), G({ key: 1 }, { ...o(i), ...c.$attrs }, {
|
|
1086
1281
|
class: "ff-boolean-field",
|
|
1087
1282
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1088
|
-
"data-testid": `ff-${
|
|
1089
|
-
"model-value": !!(o(
|
|
1283
|
+
"data-testid": `ff-${u.path.value}`,
|
|
1284
|
+
"model-value": !!(o(a) == null ? o(n) : o(a)),
|
|
1090
1285
|
"onUpdate:modelValue": f
|
|
1091
|
-
}),
|
|
1286
|
+
}), Z({ _: 2 }, [
|
|
1092
1287
|
o(i).labelAttributes?.info ? {
|
|
1093
1288
|
name: "tooltip",
|
|
1094
|
-
fn:
|
|
1289
|
+
fn: L(() => [
|
|
1095
1290
|
D(c.$slots, "tooltip", {}, () => [
|
|
1096
|
-
|
|
1291
|
+
B("div", {
|
|
1097
1292
|
innerHTML: o(i).labelAttributes.info
|
|
1098
|
-
}, null, 8,
|
|
1293
|
+
}, null, 8, Vn)
|
|
1099
1294
|
], !0)
|
|
1100
1295
|
]),
|
|
1101
1296
|
key: "0"
|
|
@@ -1105,7 +1300,7 @@ const _e = /* @__PURE__ */ z({
|
|
|
1105
1300
|
]);
|
|
1106
1301
|
};
|
|
1107
1302
|
}
|
|
1108
|
-
}),
|
|
1303
|
+
}), jn = /* @__PURE__ */ Y($n, [["__scopeId", "data-v-a1c08c7f"]]), On = ["data-testid"], Dn = ["innerHTML"], Fn = /* @__PURE__ */ z({
|
|
1109
1304
|
inheritAttrs: !1,
|
|
1110
1305
|
__name: "StringArrayField",
|
|
1111
1306
|
props: {
|
|
@@ -1116,58 +1311,58 @@ const _e = /* @__PURE__ */ z({
|
|
|
1116
1311
|
},
|
|
1117
1312
|
emits: ["update:modelValue"],
|
|
1118
1313
|
setup(e, { emit: r }) {
|
|
1119
|
-
const t =
|
|
1120
|
-
function h(
|
|
1121
|
-
return
|
|
1314
|
+
const t = _e(), a = pe(e, ["autofocus", "name"]), s = r, { value: n, hide: u, ...l } = ne(O(() => e.name)), f = le(l.path, O({ ...a, ...t })), i = b(() => l.schema?.value?.len_min && l.schema.value.len_min > 0), c = se("");
|
|
1315
|
+
function h(y) {
|
|
1316
|
+
return y.map((v) => v.trim()).filter(Boolean).join(", ");
|
|
1122
1317
|
}
|
|
1123
|
-
function
|
|
1124
|
-
return
|
|
1318
|
+
function p(y) {
|
|
1319
|
+
return y.trim().split(",").map((v) => v.trim()).filter(Boolean);
|
|
1125
1320
|
}
|
|
1126
|
-
function
|
|
1127
|
-
c.value =
|
|
1128
|
-
const v =
|
|
1129
|
-
|
|
1321
|
+
function m(y) {
|
|
1322
|
+
c.value = y;
|
|
1323
|
+
const v = p(y), T = !v.length && i.value ? l.emptyValue.value : v;
|
|
1324
|
+
n.value = T, s("update:modelValue", T);
|
|
1130
1325
|
}
|
|
1131
|
-
const
|
|
1132
|
-
return
|
|
1133
|
-
const v =
|
|
1134
|
-
h(
|
|
1135
|
-
}, { immediate: !0 }), (
|
|
1136
|
-
const T =
|
|
1137
|
-
return l.error ? (
|
|
1326
|
+
const d = b(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : fe(e.name) === "name");
|
|
1327
|
+
return te(n, (y) => {
|
|
1328
|
+
const v = y ? h(y) : "";
|
|
1329
|
+
h(p(c.value)) !== v && (c.value = v);
|
|
1330
|
+
}, { immediate: !0 }), (y, v) => {
|
|
1331
|
+
const T = N("KAlert");
|
|
1332
|
+
return l.error ? (A(), q(T, {
|
|
1138
1333
|
key: 0,
|
|
1139
1334
|
appearance: "danger",
|
|
1140
1335
|
message: l.error.message
|
|
1141
|
-
}, null, 8, ["message"])) : X((
|
|
1336
|
+
}, null, 8, ["message"])) : X((A(), $("div", {
|
|
1142
1337
|
key: 1,
|
|
1143
1338
|
"data-testid": `ff-tag-${l.path.value}`
|
|
1144
1339
|
}, [
|
|
1145
|
-
|
|
1340
|
+
V(Ae, G(o(f), {
|
|
1146
1341
|
class: "ff-tag-field",
|
|
1147
|
-
"data-1p-ignore":
|
|
1342
|
+
"data-1p-ignore": d.value,
|
|
1148
1343
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1149
1344
|
"data-testid": `ff-${l.path.value}`,
|
|
1150
1345
|
"model-value": c.value ?? "",
|
|
1151
|
-
"onUpdate:modelValue":
|
|
1152
|
-
}),
|
|
1346
|
+
"onUpdate:modelValue": m
|
|
1347
|
+
}), Z({ _: 2 }, [
|
|
1153
1348
|
o(f).labelAttributes?.info ? {
|
|
1154
1349
|
name: "label-tooltip",
|
|
1155
|
-
fn:
|
|
1156
|
-
D(
|
|
1157
|
-
|
|
1350
|
+
fn: L(() => [
|
|
1351
|
+
D(y.$slots, "tooltip", {}, () => [
|
|
1352
|
+
B("div", {
|
|
1158
1353
|
innerHTML: o(f).labelAttributes.info
|
|
1159
|
-
}, null, 8,
|
|
1354
|
+
}, null, 8, Dn)
|
|
1160
1355
|
], !0)
|
|
1161
1356
|
]),
|
|
1162
1357
|
key: "0"
|
|
1163
1358
|
} : void 0
|
|
1164
1359
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1165
|
-
], 8,
|
|
1166
|
-
[Q, !o(
|
|
1360
|
+
], 8, On)), [
|
|
1361
|
+
[Q, !o(u)]
|
|
1167
1362
|
]);
|
|
1168
1363
|
};
|
|
1169
1364
|
}
|
|
1170
|
-
}),
|
|
1365
|
+
}), kt = /* @__PURE__ */ Y(Fn, [["__scopeId", "data-v-a7d70a44"]]), Un = ["data-appearance", "data-testid"], Nn = ["data-testid"], Bn = ["innerHTML"], zn = ["data-testid"], Hn = { class: "ff-array-field-item-content" }, Wn = ["data-index", "data-testid"], Oe = 'input:not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled), [contenteditable="true"], [tabindex]:not([tabindex="-1"]):not(:disabled)', Jn = /* @__PURE__ */ z({
|
|
1171
1366
|
__name: "ArrayField",
|
|
1172
1367
|
props: {
|
|
1173
1368
|
name: {},
|
|
@@ -1183,151 +1378,151 @@ const _e = /* @__PURE__ */ z({
|
|
|
1183
1378
|
},
|
|
1184
1379
|
emits: ["add", "remove"],
|
|
1185
1380
|
setup(e, { emit: r }) {
|
|
1186
|
-
|
|
1381
|
+
Pt((C) => ({
|
|
1187
1382
|
v2a023911: K.value
|
|
1188
1383
|
}));
|
|
1189
|
-
const t = e,
|
|
1384
|
+
const t = e, a = r, { i18n: { t: s } } = he(), { getDefault: n, getSchema: u } = ee(), { value: l, hide: f, ...i } = ne(O(t, "name")), c = le(i.path, O({ ...t, ..._e() })), h = b(() => {
|
|
1190
1385
|
if (!i.path) throw new Error("Field path is required for sub-schema retrieval");
|
|
1191
|
-
const C =
|
|
1386
|
+
const C = u(i.path.value);
|
|
1192
1387
|
if (!C) throw new Error(`Schema not found for path: ${i.path.value}`);
|
|
1193
1388
|
return C.elements;
|
|
1194
|
-
}),
|
|
1389
|
+
}), p = b(() => {
|
|
1195
1390
|
if (!i.path) return "";
|
|
1196
|
-
const C =
|
|
1197
|
-
return
|
|
1198
|
-
}),
|
|
1199
|
-
function
|
|
1391
|
+
const C = fe(i.path.value);
|
|
1392
|
+
return At(C);
|
|
1393
|
+
}), m = b(() => t.addItemLabel ?? s("actions.add_entity", { entity: p.value })), d = b(() => t.items ?? j(l) ?? []), { getKey: y } = An("ff-array-field", d), v = b(() => t.appearance ? t.appearance : h.value.type === "record" || h.value.type === "map" ? "card" : "default"), T = b(() => v.value === "card" ? Be : "div");
|
|
1394
|
+
function x(C, I) {
|
|
1200
1395
|
return typeof t.itemLabel == "function" ? t.itemLabel(C, I) : t.itemLabel || c.value.label || `Item #${I}`;
|
|
1201
1396
|
}
|
|
1202
|
-
const
|
|
1203
|
-
hash: `#${
|
|
1397
|
+
const g = b(() => d.value.map((C, I) => ({
|
|
1398
|
+
hash: `#${y(C, I)}`,
|
|
1204
1399
|
title: ""
|
|
1205
|
-
}))),
|
|
1206
|
-
const C =
|
|
1207
|
-
Array.isArray(l.value) || (l.value = []), l.value.push(C),
|
|
1400
|
+
}))), w = se(g.value[0]?.hash), _ = async () => {
|
|
1401
|
+
const C = n(R(i.path.value, Ge));
|
|
1402
|
+
Array.isArray(l.value) || (l.value = []), l.value.push(C), a("add"), t.appearance === "tabs" && (await De(), w.value = g.value[g.value.length - 1]?.hash), await De(), M(d.value.length + 1);
|
|
1208
1403
|
}, k = async (C) => {
|
|
1209
|
-
Array.isArray(l.value) && (l.value.splice(C, 1), l.value.length === 0 && !c.value.required && (l.value = i.emptyValue.value)),
|
|
1210
|
-
}, S =
|
|
1404
|
+
Array.isArray(l.value) && (l.value.splice(C, 1), l.value.length === 0 && !c.value.required && (l.value = i.emptyValue.value)), a("remove", C), t.appearance === "tabs" && (w.value = g.value[Math.max(0, C - 1)]?.hash);
|
|
1405
|
+
}, S = ct("root");
|
|
1211
1406
|
function M(C) {
|
|
1212
1407
|
if (!S.value)
|
|
1213
1408
|
return;
|
|
1214
|
-
const I = Math.max(0, Math.min(C,
|
|
1215
|
-
if (!
|
|
1409
|
+
const I = Math.max(0, Math.min(C, d.value.length - 1)), W = S.value.querySelector(`[data-index="${I}"]`);
|
|
1410
|
+
if (!W)
|
|
1216
1411
|
return;
|
|
1217
|
-
P(
|
|
1412
|
+
P(W)?.focus();
|
|
1218
1413
|
}
|
|
1219
1414
|
function P(C) {
|
|
1220
1415
|
const I = C.querySelector('[data-autofocus="true"]');
|
|
1221
|
-
return I ? I.matches(
|
|
1416
|
+
return I ? I.matches(Oe) ? I : I.querySelector(Oe) : C.querySelector(Oe);
|
|
1222
1417
|
}
|
|
1223
|
-
const K =
|
|
1418
|
+
const K = b(() => {
|
|
1224
1419
|
const { appearance: C, stickyTabs: I } = t;
|
|
1225
1420
|
return C !== "tabs" || I == null || I === !1 ? null : typeof I == "number" ? `${t.stickyTabs}px` : typeof I == "string" ? I : "0";
|
|
1226
1421
|
});
|
|
1227
1422
|
return (C, I) => {
|
|
1228
|
-
const
|
|
1229
|
-
return i.error ? (
|
|
1423
|
+
const W = N("KAlert"), J = N("KLabel"), E = N("KButton"), ae = N("KTooltip"), St = N("KTabs");
|
|
1424
|
+
return i.error ? (A(), q(W, {
|
|
1230
1425
|
key: 0,
|
|
1231
1426
|
appearance: "danger",
|
|
1232
1427
|
message: i.error.message
|
|
1233
|
-
}, null, 8, ["message"])) : X((
|
|
1428
|
+
}, null, 8, ["message"])) : X((A(), $("div", {
|
|
1234
1429
|
key: 1,
|
|
1235
1430
|
ref_key: "root",
|
|
1236
1431
|
ref: S,
|
|
1237
|
-
class:
|
|
1432
|
+
class: Te(["ff-array-field", {
|
|
1238
1433
|
[`ff-array-field-${v.value ?? "default"}`]: !0,
|
|
1239
1434
|
"ff-array-field-sticky-tabs": e.stickyTabs
|
|
1240
1435
|
}]),
|
|
1241
1436
|
"data-appearance": v.value,
|
|
1242
1437
|
"data-testid": `ff-array-${i.path.value}`
|
|
1243
1438
|
}, [
|
|
1244
|
-
o(c).label && !e.hideLabel ? (
|
|
1439
|
+
o(c).label && !e.hideLabel ? (A(), $("header", {
|
|
1245
1440
|
key: 0,
|
|
1246
1441
|
class: "ff-array-field-header",
|
|
1247
1442
|
"data-testid": `ff-array-header-${i.path.value}`
|
|
1248
1443
|
}, [
|
|
1249
|
-
|
|
1444
|
+
V(J, G({ class: "ff-array-field-label" }, o(c), {
|
|
1250
1445
|
"data-testid": `ff-label-${i.path.value}`,
|
|
1251
1446
|
"tooltip-attributes": o(c).labelAttributes.tooltipAttributes
|
|
1252
|
-
}),
|
|
1253
|
-
default:
|
|
1447
|
+
}), Z({
|
|
1448
|
+
default: L(() => [
|
|
1254
1449
|
D(C.$slots, "label", {
|
|
1255
1450
|
label: o(c).label
|
|
1256
1451
|
}, () => [
|
|
1257
|
-
|
|
1452
|
+
ue(re(o(c).label), 1)
|
|
1258
1453
|
], !0)
|
|
1259
1454
|
]),
|
|
1260
1455
|
_: 2
|
|
1261
1456
|
}, [
|
|
1262
1457
|
o(c).labelAttributes?.info ? {
|
|
1263
1458
|
name: "tooltip",
|
|
1264
|
-
fn:
|
|
1459
|
+
fn: L(() => [
|
|
1265
1460
|
D(C.$slots, "tooltip", {}, () => [
|
|
1266
|
-
|
|
1461
|
+
B("div", {
|
|
1267
1462
|
innerHTML: o(c).labelAttributes.info
|
|
1268
|
-
}, null, 8,
|
|
1463
|
+
}, null, 8, Bn)
|
|
1269
1464
|
], !0)
|
|
1270
1465
|
]),
|
|
1271
1466
|
key: "0"
|
|
1272
1467
|
} : void 0
|
|
1273
1468
|
]), 1040, ["data-testid", "tooltip-attributes"]),
|
|
1274
|
-
e.appearance === "tabs" ? (
|
|
1469
|
+
e.appearance === "tabs" ? (A(), q(E, {
|
|
1275
1470
|
key: 0,
|
|
1276
1471
|
appearance: "tertiary",
|
|
1277
|
-
"aria-label":
|
|
1472
|
+
"aria-label": m.value,
|
|
1278
1473
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1279
1474
|
icon: "",
|
|
1280
|
-
onClick:
|
|
1475
|
+
onClick: _
|
|
1281
1476
|
}, {
|
|
1282
|
-
default:
|
|
1283
|
-
|
|
1477
|
+
default: L(() => [
|
|
1478
|
+
V(o(qe))
|
|
1284
1479
|
]),
|
|
1285
1480
|
_: 1
|
|
1286
1481
|
}, 8, ["aria-label", "data-testid"])) : H("", !0)
|
|
1287
|
-
], 8,
|
|
1288
|
-
v.value !== "tabs" ? (
|
|
1289
|
-
|
|
1482
|
+
], 8, Nn)) : H("", !0),
|
|
1483
|
+
v.value !== "tabs" ? (A(), $(oe, { key: 1 }, [
|
|
1484
|
+
B("div", {
|
|
1290
1485
|
class: "ff-array-field-container",
|
|
1291
1486
|
"data-testid": `ff-array-basic-container-${i.path.value}`
|
|
1292
1487
|
}, [
|
|
1293
|
-
(
|
|
1294
|
-
key: o(
|
|
1295
|
-
class:
|
|
1296
|
-
"data-index":
|
|
1297
|
-
"data-testid": `ff-array-item-${i.path.value}.${
|
|
1488
|
+
(A(!0), $(oe, null, de(d.value, (me, F) => (A(), q(o(T), {
|
|
1489
|
+
key: o(y)(me, F),
|
|
1490
|
+
class: Te(["ff-array-field-item", { "ff-array-field-item-card": v.value === "card" }]),
|
|
1491
|
+
"data-index": F,
|
|
1492
|
+
"data-testid": `ff-array-item-${i.path.value}.${F}`
|
|
1298
1493
|
}, {
|
|
1299
|
-
default:
|
|
1300
|
-
|
|
1494
|
+
default: L(() => [
|
|
1495
|
+
B("div", Hn, [
|
|
1301
1496
|
C.$slots.item ? D(C.$slots, "item", {
|
|
1302
1497
|
autofocus: !0,
|
|
1303
|
-
fieldName: String(
|
|
1304
|
-
index:
|
|
1305
|
-
}, void 0, !0, 0) : h.value.type === "array" && h.value.elements.type === "string" ? (
|
|
1498
|
+
fieldName: String(F),
|
|
1499
|
+
index: F
|
|
1500
|
+
}, void 0, !0, 0) : h.value.type === "array" && h.value.elements.type === "string" ? (A(), q(kt, {
|
|
1306
1501
|
key: 1,
|
|
1307
1502
|
autofocus: "",
|
|
1308
1503
|
help: o(s)("plugins.free-form.tag_helper"),
|
|
1309
|
-
name: String(
|
|
1310
|
-
}, null, 8, ["help", "name"])) : (
|
|
1504
|
+
name: String(F)
|
|
1505
|
+
}, null, 8, ["help", "name"])) : (A(), q(be, {
|
|
1311
1506
|
key: 2,
|
|
1312
1507
|
autofocus: "",
|
|
1313
|
-
name: String(
|
|
1508
|
+
name: String(F)
|
|
1314
1509
|
}, null, 8, ["name"]))
|
|
1315
1510
|
]),
|
|
1316
|
-
|
|
1511
|
+
V(ae, {
|
|
1317
1512
|
class: "ff-array-field-item-remove-tooltip",
|
|
1318
|
-
text: o(s)("actions.remove_entity", { entity:
|
|
1513
|
+
text: o(s)("actions.remove_entity", { entity: p.value })
|
|
1319
1514
|
}, {
|
|
1320
|
-
default:
|
|
1321
|
-
|
|
1515
|
+
default: L(() => [
|
|
1516
|
+
V(E, {
|
|
1322
1517
|
appearance: "tertiary",
|
|
1323
|
-
"aria-label": o(s)("actions.remove_entity", { entity:
|
|
1518
|
+
"aria-label": o(s)("actions.remove_entity", { entity: p.value }),
|
|
1324
1519
|
class: "ff-array-field-item-remove",
|
|
1325
|
-
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${
|
|
1520
|
+
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${F}`,
|
|
1326
1521
|
icon: "",
|
|
1327
|
-
onClick:
|
|
1522
|
+
onClick: Pe((xt) => k(F), ["stop"])
|
|
1328
1523
|
}, {
|
|
1329
|
-
default:
|
|
1330
|
-
|
|
1524
|
+
default: L(() => [
|
|
1525
|
+
V(o(Je))
|
|
1331
1526
|
]),
|
|
1332
1527
|
_: 1
|
|
1333
1528
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1337,65 +1532,65 @@ const _e = /* @__PURE__ */ z({
|
|
|
1337
1532
|
]),
|
|
1338
1533
|
_: 2
|
|
1339
1534
|
}, 1032, ["class", "data-index", "data-testid"]))), 128))
|
|
1340
|
-
], 8,
|
|
1341
|
-
|
|
1535
|
+
], 8, zn),
|
|
1536
|
+
V(E, {
|
|
1342
1537
|
appearance: "tertiary",
|
|
1343
|
-
"aria-label":
|
|
1538
|
+
"aria-label": m.value,
|
|
1344
1539
|
class: "ff-array-field-add-item-btn",
|
|
1345
1540
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1346
|
-
onClick:
|
|
1541
|
+
onClick: _
|
|
1347
1542
|
}, {
|
|
1348
|
-
default:
|
|
1349
|
-
|
|
1350
|
-
|
|
1543
|
+
default: L(() => [
|
|
1544
|
+
V(o(qe)),
|
|
1545
|
+
ue(" " + re(m.value), 1)
|
|
1351
1546
|
]),
|
|
1352
1547
|
_: 1
|
|
1353
1548
|
}, 8, ["aria-label", "data-testid"])
|
|
1354
|
-
], 64)) :
|
|
1549
|
+
], 64)) : d.value.length ? (A(), q(o(Be), {
|
|
1355
1550
|
key: 2,
|
|
1356
1551
|
"data-testid": `ff-array-tab-container-${i.path.value}`
|
|
1357
1552
|
}, {
|
|
1358
|
-
default:
|
|
1359
|
-
|
|
1360
|
-
modelValue:
|
|
1361
|
-
"onUpdate:modelValue": I[0] || (I[0] = (
|
|
1553
|
+
default: L(() => [
|
|
1554
|
+
V(St, {
|
|
1555
|
+
modelValue: w.value,
|
|
1556
|
+
"onUpdate:modelValue": I[0] || (I[0] = (me) => w.value = me),
|
|
1362
1557
|
"data-testid": `ff-array-tabs-${i.path.value}`,
|
|
1363
|
-
tabs:
|
|
1364
|
-
},
|
|
1365
|
-
|
|
1366
|
-
name: o(
|
|
1367
|
-
fn:
|
|
1368
|
-
|
|
1558
|
+
tabs: g.value
|
|
1559
|
+
}, Z({ _: 2 }, [
|
|
1560
|
+
de(d.value, (me, F) => ({
|
|
1561
|
+
name: o(y)(me, F),
|
|
1562
|
+
fn: L(() => [
|
|
1563
|
+
B("div", {
|
|
1369
1564
|
class: "ff-array-field-item",
|
|
1370
|
-
"data-index":
|
|
1371
|
-
"data-testid": `ff-array-item-${i.path.value}.${
|
|
1565
|
+
"data-index": F,
|
|
1566
|
+
"data-testid": `ff-array-item-${i.path.value}.${F}`
|
|
1372
1567
|
}, [
|
|
1373
1568
|
C.$slots.item ? D(C.$slots, "item", {
|
|
1374
1569
|
autofocus: !0,
|
|
1375
|
-
fieldName: String(
|
|
1376
|
-
index:
|
|
1377
|
-
}, void 0, !0, 0) : (
|
|
1570
|
+
fieldName: String(F),
|
|
1571
|
+
index: F
|
|
1572
|
+
}, void 0, !0, 0) : (A(), q(be, {
|
|
1378
1573
|
key: 1,
|
|
1379
1574
|
autofocus: "",
|
|
1380
|
-
name: String(
|
|
1575
|
+
name: String(F)
|
|
1381
1576
|
}, null, 8, ["name"]))
|
|
1382
|
-
], 8,
|
|
1577
|
+
], 8, Wn)
|
|
1383
1578
|
])
|
|
1384
1579
|
})),
|
|
1385
|
-
|
|
1386
|
-
name: `${o(
|
|
1387
|
-
fn:
|
|
1388
|
-
|
|
1389
|
-
|
|
1580
|
+
de(d.value, (me, F) => ({
|
|
1581
|
+
name: `${o(y)(me, F)}-anchor`,
|
|
1582
|
+
fn: L(() => [
|
|
1583
|
+
ue(re(x(me, F)) + " ", 1),
|
|
1584
|
+
V(E, {
|
|
1390
1585
|
appearance: "tertiary",
|
|
1391
|
-
"aria-label": o(s)("actions.remove_entity", { entity:
|
|
1586
|
+
"aria-label": o(s)("actions.remove_entity", { entity: p.value }),
|
|
1392
1587
|
class: "ff-array-field-item-remove",
|
|
1393
|
-
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${
|
|
1588
|
+
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${F}`,
|
|
1394
1589
|
icon: "",
|
|
1395
|
-
onClick:
|
|
1590
|
+
onClick: Pe((xt) => k(F), ["stop"])
|
|
1396
1591
|
}, {
|
|
1397
|
-
default:
|
|
1398
|
-
|
|
1592
|
+
default: L(() => [
|
|
1593
|
+
V(o(Ht))
|
|
1399
1594
|
]),
|
|
1400
1595
|
_: 1
|
|
1401
1596
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1405,12 +1600,12 @@ const _e = /* @__PURE__ */ z({
|
|
|
1405
1600
|
]),
|
|
1406
1601
|
_: 3
|
|
1407
1602
|
}, 8, ["data-testid"])) : H("", !0)
|
|
1408
|
-
], 10,
|
|
1603
|
+
], 10, Un)), [
|
|
1409
1604
|
[Q, !o(f)]
|
|
1410
1605
|
]);
|
|
1411
1606
|
};
|
|
1412
1607
|
}
|
|
1413
|
-
}),
|
|
1608
|
+
}), Gn = /* @__PURE__ */ Y(Jn, [["__scopeId", "data-v-6f244a39"]]), Yn = /* @__PURE__ */ z({
|
|
1414
1609
|
__name: "SlideTransition",
|
|
1415
1610
|
setup(e) {
|
|
1416
1611
|
const r = [
|
|
@@ -1421,127 +1616,127 @@ const _e = /* @__PURE__ */ z({
|
|
|
1421
1616
|
"margin-bottom",
|
|
1422
1617
|
"border-top-width",
|
|
1423
1618
|
"border-bottom-width"
|
|
1424
|
-
], t = Object.fromEntries(r.map((
|
|
1425
|
-
function s(
|
|
1426
|
-
const
|
|
1619
|
+
], t = Object.fromEntries(r.map((p) => [p, ""])), a = Object.fromEntries(r.map((p) => [p, "0"]));
|
|
1620
|
+
function s(p) {
|
|
1621
|
+
const m = getComputedStyle(p);
|
|
1427
1622
|
return Object.fromEntries(
|
|
1428
|
-
r.map((
|
|
1623
|
+
r.map((d) => [d, m.getPropertyValue(d)])
|
|
1429
1624
|
);
|
|
1430
1625
|
}
|
|
1431
|
-
function
|
|
1626
|
+
function n(p) {
|
|
1432
1627
|
["overflow", "transition", ...r].forEach(
|
|
1433
|
-
(
|
|
1628
|
+
(m) => p.style.removeProperty(m)
|
|
1434
1629
|
);
|
|
1435
1630
|
}
|
|
1436
|
-
function
|
|
1437
|
-
Object.assign(
|
|
1631
|
+
function u(p) {
|
|
1632
|
+
Object.assign(p.style, {
|
|
1438
1633
|
overflow: "hidden",
|
|
1439
1634
|
transition: "none"
|
|
1440
1635
|
});
|
|
1441
1636
|
}
|
|
1442
|
-
function l(
|
|
1443
|
-
const
|
|
1444
|
-
Object.assign(
|
|
1445
|
-
const
|
|
1446
|
-
Object.assign(
|
|
1447
|
-
Object.assign(
|
|
1448
|
-
...
|
|
1637
|
+
function l(p) {
|
|
1638
|
+
const m = p;
|
|
1639
|
+
Object.assign(m.style, t);
|
|
1640
|
+
const d = s(m);
|
|
1641
|
+
Object.assign(m.style, a), requestAnimationFrame(() => {
|
|
1642
|
+
Object.assign(m.style, {
|
|
1643
|
+
...d,
|
|
1449
1644
|
transition: ""
|
|
1450
1645
|
});
|
|
1451
1646
|
});
|
|
1452
1647
|
}
|
|
1453
|
-
function f(
|
|
1454
|
-
|
|
1648
|
+
function f(p) {
|
|
1649
|
+
n(p);
|
|
1455
1650
|
}
|
|
1456
|
-
function i(
|
|
1457
|
-
const
|
|
1458
|
-
Object.assign(
|
|
1459
|
-
...s(
|
|
1651
|
+
function i(p) {
|
|
1652
|
+
const m = p;
|
|
1653
|
+
Object.assign(m.style, {
|
|
1654
|
+
...s(m),
|
|
1460
1655
|
overflow: "hidden"
|
|
1461
1656
|
});
|
|
1462
1657
|
}
|
|
1463
|
-
function c(
|
|
1464
|
-
Object.assign(
|
|
1658
|
+
function c(p) {
|
|
1659
|
+
Object.assign(p.style, a);
|
|
1465
1660
|
}
|
|
1466
|
-
function h(
|
|
1467
|
-
|
|
1661
|
+
function h(p) {
|
|
1662
|
+
n(p);
|
|
1468
1663
|
}
|
|
1469
|
-
return (
|
|
1664
|
+
return (p, m) => (A(), q(qt, {
|
|
1470
1665
|
"enter-active-class": "ff-slide-active",
|
|
1471
1666
|
"leave-active-class": "ff-slide-active",
|
|
1472
1667
|
onAfterEnter: f,
|
|
1473
1668
|
onAfterLeave: h,
|
|
1474
|
-
onBeforeEnter:
|
|
1669
|
+
onBeforeEnter: u,
|
|
1475
1670
|
onBeforeLeave: i,
|
|
1476
1671
|
onEnter: l,
|
|
1477
1672
|
onLeave: c
|
|
1478
1673
|
}, {
|
|
1479
|
-
default:
|
|
1480
|
-
D(
|
|
1674
|
+
default: L(() => [
|
|
1675
|
+
D(p.$slots, "default", {}, void 0, !0)
|
|
1481
1676
|
]),
|
|
1482
1677
|
_: 3
|
|
1483
1678
|
}));
|
|
1484
1679
|
}
|
|
1485
|
-
}),
|
|
1680
|
+
}), Xn = /* @__PURE__ */ Y(Yn, [["__scopeId", "data-v-4969409d"]]), Qn = { class: "ff-entity-checks-list" }, Zn = /* @__PURE__ */ z({
|
|
1486
1681
|
__name: "EntityChecksAlert",
|
|
1487
1682
|
props: {
|
|
1488
1683
|
entityChecks: {},
|
|
1489
1684
|
visibleFields: {}
|
|
1490
1685
|
},
|
|
1491
1686
|
setup(e) {
|
|
1492
|
-
const { i18n: { t: r } } =
|
|
1687
|
+
const { i18n: { t: r } } = he(), t = b(() => {
|
|
1493
1688
|
if (!Array.isArray(e.entityChecks) || e.entityChecks.length === 0)
|
|
1494
1689
|
return null;
|
|
1495
|
-
const
|
|
1690
|
+
const n = [], u = [
|
|
1496
1691
|
{ key: "at_least_one_of", i18nKey: "plugins.form.field_rules.at_least_one_of" },
|
|
1497
1692
|
{ key: "mutually_required", i18nKey: "plugins.form.field_rules.mutually_required" },
|
|
1498
1693
|
{ key: "mutually_exclusive", i18nKey: "plugins.form.field_rules.mutually_exclusive" }
|
|
1499
1694
|
];
|
|
1500
1695
|
for (const l of e.entityChecks)
|
|
1501
|
-
for (const { key: f, i18nKey: i } of
|
|
1696
|
+
for (const { key: f, i18nKey: i } of u)
|
|
1502
1697
|
if (f in l) {
|
|
1503
1698
|
const c = l[f];
|
|
1504
1699
|
if (Array.isArray(c) && c.length > 0) {
|
|
1505
1700
|
const h = s(c);
|
|
1506
|
-
h.length > 0 &&
|
|
1507
|
-
parameters:
|
|
1701
|
+
h.length > 0 && n.push(r(i, {
|
|
1702
|
+
parameters: a(h)
|
|
1508
1703
|
}));
|
|
1509
1704
|
}
|
|
1510
1705
|
break;
|
|
1511
1706
|
}
|
|
1512
|
-
return
|
|
1707
|
+
return n.length ? n : null;
|
|
1513
1708
|
});
|
|
1514
|
-
function n
|
|
1515
|
-
return
|
|
1709
|
+
function a(n) {
|
|
1710
|
+
return n.map(wt).join(", ");
|
|
1516
1711
|
}
|
|
1517
|
-
function s(
|
|
1518
|
-
return Array.isArray(e.visibleFields) ?
|
|
1712
|
+
function s(n) {
|
|
1713
|
+
return Array.isArray(e.visibleFields) ? n.filter((u) => e.visibleFields.includes(u.split(".")[0])) : n;
|
|
1519
1714
|
}
|
|
1520
|
-
return (
|
|
1521
|
-
const l =
|
|
1522
|
-
return t.value ? (
|
|
1715
|
+
return (n, u) => {
|
|
1716
|
+
const l = N("KAlert");
|
|
1717
|
+
return t.value ? (A(), q(l, {
|
|
1523
1718
|
key: 0,
|
|
1524
1719
|
"data-testid": "ff-entity-checks-alert"
|
|
1525
1720
|
}, {
|
|
1526
|
-
default:
|
|
1527
|
-
|
|
1528
|
-
(
|
|
1721
|
+
default: L(() => [
|
|
1722
|
+
B("ul", Qn, [
|
|
1723
|
+
(A(!0), $(oe, null, de(t.value, (f) => (A(), $("li", {
|
|
1529
1724
|
key: f,
|
|
1530
1725
|
"data-testid": "ff-entity-check-item"
|
|
1531
|
-
},
|
|
1726
|
+
}, re(f), 1))), 128))
|
|
1532
1727
|
])
|
|
1533
1728
|
]),
|
|
1534
1729
|
_: 1
|
|
1535
1730
|
})) : H("", !0);
|
|
1536
1731
|
};
|
|
1537
1732
|
}
|
|
1538
|
-
}),
|
|
1733
|
+
}), rt = /* @__PURE__ */ Y(Zn, [["__scopeId", "data-v-374c59bc"]]), ea = ["data-testid"], ta = ["data-testid"], na = ["data-testid"], aa = { class: "ff-object-field-header-toggle" }, ia = ["aria-controls", "aria-expanded", "aria-label", "data-testid", "disabled"], oa = ["innerHTML"], ra = ["data-testid"], sa = {
|
|
1539
1734
|
key: 0,
|
|
1540
1735
|
class: "indent-guide"
|
|
1541
|
-
},
|
|
1736
|
+
}, la = /* @__PURE__ */ z({
|
|
1542
1737
|
inheritAttrs: !1,
|
|
1543
1738
|
__name: "ObjectField",
|
|
1544
|
-
props: /* @__PURE__ */
|
|
1739
|
+
props: /* @__PURE__ */ Ue({
|
|
1545
1740
|
name: {},
|
|
1546
1741
|
label: {},
|
|
1547
1742
|
labelAttributes: {},
|
|
@@ -1564,166 +1759,166 @@ const _e = /* @__PURE__ */ z({
|
|
|
1564
1759
|
}),
|
|
1565
1760
|
emits: ["update:added", "update:expanded"],
|
|
1566
1761
|
setup(e) {
|
|
1567
|
-
const r =
|
|
1568
|
-
getSchema:
|
|
1762
|
+
const r = Lt(), t = pe(e, ["defaultAdded", "collapsible", "omit", "required", "asChild", "resetLabelPath", "fieldsOrder"]), { value: a, hide: s, ...n } = ne(O(t, "name")), {
|
|
1763
|
+
getSchema: u,
|
|
1569
1764
|
getDefault: l,
|
|
1570
1765
|
useCurrentRenderRules: f
|
|
1571
|
-
} =
|
|
1572
|
-
fieldPath:
|
|
1766
|
+
} = ee(), i = f({
|
|
1767
|
+
fieldPath: n.path,
|
|
1573
1768
|
rules: O(t, "renderRules"),
|
|
1574
1769
|
omittedFields: O(() => e.omit)
|
|
1575
|
-
}), c =
|
|
1576
|
-
if (
|
|
1577
|
-
const
|
|
1578
|
-
if (
|
|
1579
|
-
return
|
|
1770
|
+
}), c = Fe(e, "added"), h = Fe(e, "expanded"), p = b(() => {
|
|
1771
|
+
if (n.ancestors?.value) {
|
|
1772
|
+
const _ = n.ancestors.value.parent;
|
|
1773
|
+
if (_?.path)
|
|
1774
|
+
return u(_.path)?.type === "array";
|
|
1580
1775
|
}
|
|
1581
1776
|
return !1;
|
|
1582
|
-
}),
|
|
1583
|
-
if (
|
|
1584
|
-
const
|
|
1585
|
-
if (
|
|
1586
|
-
return
|
|
1777
|
+
}), m = b(() => {
|
|
1778
|
+
if (n.ancestors?.value) {
|
|
1779
|
+
const _ = n.ancestors.value.parent;
|
|
1780
|
+
if (_?.path)
|
|
1781
|
+
return u(_.path)?.type === "map";
|
|
1587
1782
|
}
|
|
1588
1783
|
return !1;
|
|
1589
|
-
}),
|
|
1590
|
-
let
|
|
1591
|
-
return e.omit && (
|
|
1592
|
-
}),
|
|
1593
|
-
function
|
|
1784
|
+
}), d = le(n.path, { required: e.required, ...t, resetLabelPath: e.resetLabelPath }), y = b(() => d.value.required ? !0 : c.value ?? e.defaultAdded), v = b(() => e.asChild !== void 0 ? e.asChild : p.value), T = b(() => {
|
|
1785
|
+
let _ = n.schema.value.fields;
|
|
1786
|
+
return e.omit && (_ = _.filter((k) => !e.omit.includes(Object.keys(k)[0]))), e.fieldsOrder ? gt(_, e.fieldsOrder) : (i.value?.bundles && (_ = yt([..._], i.value.bundles)), _);
|
|
1787
|
+
}), x = b(() => T.value.map((_) => Object.keys(_)[0]));
|
|
1788
|
+
function g() {
|
|
1594
1789
|
h.value = !h.value;
|
|
1595
1790
|
}
|
|
1596
|
-
function
|
|
1597
|
-
c.value ?
|
|
1791
|
+
function w() {
|
|
1792
|
+
c.value ? a.value = l(n.path.value) : a.value = n.emptyValue.value;
|
|
1598
1793
|
}
|
|
1599
|
-
return
|
|
1600
|
-
e.collapsible && (h.value =
|
|
1601
|
-
}),
|
|
1602
|
-
if (
|
|
1603
|
-
const
|
|
1604
|
-
c.value =
|
|
1605
|
-
}), (
|
|
1606
|
-
const S =
|
|
1607
|
-
return
|
|
1608
|
-
(
|
|
1609
|
-
|
|
1794
|
+
return te(y, (_) => {
|
|
1795
|
+
e.collapsible && (h.value = _);
|
|
1796
|
+
}), Et(() => {
|
|
1797
|
+
if (n.error || !a) return;
|
|
1798
|
+
const _ = a.value != null;
|
|
1799
|
+
c.value = _, (d.value.required || _) && (h.value = !0);
|
|
1800
|
+
}), (_, k) => {
|
|
1801
|
+
const S = N("KAlert"), M = N("KInputSwitch");
|
|
1802
|
+
return A(), $(oe, null, [
|
|
1803
|
+
(A(), q(ie(_.$slots[o(xe)]))),
|
|
1804
|
+
n.error ? (A(), q(S, {
|
|
1610
1805
|
key: 0,
|
|
1611
1806
|
appearance: "danger",
|
|
1612
|
-
message:
|
|
1613
|
-
}, null, 8, ["message"])) : v.value ? X((
|
|
1807
|
+
message: n.error.message
|
|
1808
|
+
}, null, 8, ["message"])) : v.value ? X((A(), $("div", G({
|
|
1614
1809
|
key: 1,
|
|
1615
1810
|
class: "ff-object-field ff-object-field-as-child"
|
|
1616
|
-
},
|
|
1617
|
-
"data-testid": `ff-object-${
|
|
1811
|
+
}, _.$attrs, {
|
|
1812
|
+
"data-testid": `ff-object-${n.path.value}`
|
|
1618
1813
|
}), [
|
|
1619
|
-
D(
|
|
1620
|
-
|
|
1621
|
-
"entity-checks":
|
|
1622
|
-
"visible-fields":
|
|
1814
|
+
D(_.$slots, "default", {}, () => [
|
|
1815
|
+
V(rt, {
|
|
1816
|
+
"entity-checks": n.schema.value?.entity_checks,
|
|
1817
|
+
"visible-fields": x.value
|
|
1623
1818
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1624
|
-
(
|
|
1819
|
+
(A(!0), $(oe, null, de(T.value, (P) => (A(), q(be, {
|
|
1625
1820
|
key: Object.keys(P)[0],
|
|
1626
1821
|
name: Object.keys(P)[0]
|
|
1627
1822
|
}, null, 8, ["name"]))), 128))
|
|
1628
1823
|
], !0)
|
|
1629
|
-
], 16,
|
|
1824
|
+
], 16, ea)), [
|
|
1630
1825
|
[Q, !o(s)]
|
|
1631
|
-
]) : X((
|
|
1826
|
+
]) : X((A(), $("div", G({
|
|
1632
1827
|
key: 2,
|
|
1633
1828
|
class: ["ff-object-field", { "ff-object-field-collapsed": !h.value }],
|
|
1634
|
-
"data-testid": `ff-object-${
|
|
1635
|
-
},
|
|
1636
|
-
|
|
1829
|
+
"data-testid": `ff-object-${n.path.value}`
|
|
1830
|
+
}, _.$attrs), [
|
|
1831
|
+
B("header", {
|
|
1637
1832
|
class: "ff-object-field-header",
|
|
1638
|
-
"data-testid": `ff-object-header-${
|
|
1833
|
+
"data-testid": `ff-object-header-${n.path.value}`
|
|
1639
1834
|
}, [
|
|
1640
|
-
|
|
1641
|
-
|
|
1835
|
+
B("div", aa, [
|
|
1836
|
+
B("button", {
|
|
1642
1837
|
"aria-controls": o(r),
|
|
1643
1838
|
"aria-expanded": h.value,
|
|
1644
|
-
"aria-label": o(
|
|
1839
|
+
"aria-label": o(d).label,
|
|
1645
1840
|
class: "ff-object-field-toggle-btn",
|
|
1646
|
-
"data-testid": `ff-object-toggle-btn-${
|
|
1841
|
+
"data-testid": `ff-object-toggle-btn-${n.path.value}`,
|
|
1647
1842
|
disabled: !c.value,
|
|
1648
1843
|
type: "button",
|
|
1649
|
-
onClick:
|
|
1844
|
+
onClick: Pe(g, ["prevent", "stop"])
|
|
1650
1845
|
}, [
|
|
1651
|
-
|
|
1652
|
-
class:
|
|
1653
|
-
"data-testid": `ff-object-toggle-trigger-icon-${
|
|
1846
|
+
V(o(Wt), {
|
|
1847
|
+
class: Te(["ff-object-field-toggle-btn-trigger-icon", { "collapse-expanded": h.value }]),
|
|
1848
|
+
"data-testid": `ff-object-toggle-trigger-icon-${n.path.value}`,
|
|
1654
1849
|
decorative: "",
|
|
1655
|
-
size: `var(--kui-icon-size-30, ${o(
|
|
1850
|
+
size: `var(--kui-icon-size-30, ${o(Gt)})`
|
|
1656
1851
|
}, null, 8, ["class", "data-testid", "size"])
|
|
1657
|
-
], 8,
|
|
1658
|
-
|
|
1852
|
+
], 8, ia),
|
|
1853
|
+
m.value ? H("", !0) : (A(), q(o(Ut), G({
|
|
1659
1854
|
key: 0,
|
|
1660
1855
|
class: "ff-object-field-label",
|
|
1661
|
-
"data-testid": `ff-label-${
|
|
1856
|
+
"data-testid": `ff-label-${n.path.value}`
|
|
1662
1857
|
}, {
|
|
1663
|
-
...o(
|
|
1858
|
+
...o(d),
|
|
1664
1859
|
required: !1
|
|
1665
1860
|
}, {
|
|
1666
|
-
"tooltip-attributes": o(
|
|
1667
|
-
}),
|
|
1668
|
-
default:
|
|
1669
|
-
|
|
1861
|
+
"tooltip-attributes": o(d).labelAttributes.tooltipAttributes
|
|
1862
|
+
}), Z({
|
|
1863
|
+
default: L(() => [
|
|
1864
|
+
ue(re(o(d).label) + " ", 1)
|
|
1670
1865
|
]),
|
|
1671
1866
|
_: 2
|
|
1672
1867
|
}, [
|
|
1673
|
-
o(
|
|
1868
|
+
o(d).labelAttributes?.info ? {
|
|
1674
1869
|
name: "tooltip",
|
|
1675
|
-
fn:
|
|
1676
|
-
D(
|
|
1677
|
-
|
|
1678
|
-
innerHTML: o(
|
|
1679
|
-
}, null, 8,
|
|
1870
|
+
fn: L(() => [
|
|
1871
|
+
D(_.$slots, "tooltip", {}, () => [
|
|
1872
|
+
B("div", {
|
|
1873
|
+
innerHTML: o(d).labelAttributes.info
|
|
1874
|
+
}, null, 8, oa)
|
|
1680
1875
|
], !0)
|
|
1681
1876
|
]),
|
|
1682
1877
|
key: "0"
|
|
1683
1878
|
} : void 0
|
|
1684
1879
|
]), 1040, ["data-testid", "tooltip-attributes"]))
|
|
1685
1880
|
]),
|
|
1686
|
-
o(
|
|
1881
|
+
o(d).required ? H("", !0) : (A(), q(M, {
|
|
1687
1882
|
key: 0,
|
|
1688
|
-
"data-testid": `ff-object-switch-${
|
|
1883
|
+
"data-testid": `ff-object-switch-${n.path.value}`,
|
|
1689
1884
|
"model-value": c.value,
|
|
1690
1885
|
"onUpdate:modelValue": k[0] || (k[0] = (P) => {
|
|
1691
|
-
c.value = P,
|
|
1886
|
+
c.value = P, w();
|
|
1692
1887
|
})
|
|
1693
1888
|
}, null, 8, ["data-testid", "model-value"]))
|
|
1694
|
-
], 8,
|
|
1695
|
-
|
|
1696
|
-
default:
|
|
1697
|
-
h.value ? (
|
|
1889
|
+
], 8, na),
|
|
1890
|
+
V(Xn, null, {
|
|
1891
|
+
default: L(() => [
|
|
1892
|
+
h.value ? (A(), $("div", {
|
|
1698
1893
|
key: 0,
|
|
1699
1894
|
class: "ff-object-field-content",
|
|
1700
|
-
"data-testid": `ff-object-content-${
|
|
1895
|
+
"data-testid": `ff-object-content-${n.path.value}`
|
|
1701
1896
|
}, [
|
|
1702
|
-
D(
|
|
1703
|
-
|
|
1704
|
-
"entity-checks":
|
|
1705
|
-
"visible-fields":
|
|
1897
|
+
D(_.$slots, "default", {}, () => [
|
|
1898
|
+
V(rt, {
|
|
1899
|
+
"entity-checks": n.schema.value?.entity_checks,
|
|
1900
|
+
"visible-fields": x.value
|
|
1706
1901
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1707
|
-
(
|
|
1902
|
+
(A(!0), $(oe, null, de(T.value, (P) => (A(), q(be, {
|
|
1708
1903
|
key: Object.keys(P)[0],
|
|
1709
1904
|
name: Object.keys(P)[0]
|
|
1710
1905
|
}, null, 8, ["name"]))), 128))
|
|
1711
1906
|
], !0)
|
|
1712
|
-
], 8,
|
|
1907
|
+
], 8, ra)) : H("", !0)
|
|
1713
1908
|
]),
|
|
1714
1909
|
_: 3
|
|
1715
1910
|
}),
|
|
1716
|
-
h.value ? (
|
|
1717
|
-
], 16,
|
|
1911
|
+
h.value ? (A(), $("div", sa)) : H("", !0)
|
|
1912
|
+
], 16, ta)), [
|
|
1718
1913
|
[Q, !o(s)]
|
|
1719
1914
|
])
|
|
1720
1915
|
], 64);
|
|
1721
1916
|
};
|
|
1722
1917
|
}
|
|
1723
|
-
}),
|
|
1918
|
+
}), ua = /* @__PURE__ */ Y(la, [["__scopeId", "data-v-775d406c"]]), ca = {
|
|
1724
1919
|
key: 1,
|
|
1725
1920
|
class: "ff-number-field-wrapper"
|
|
1726
|
-
},
|
|
1921
|
+
}, da = ["innerHTML"], pa = /* @__PURE__ */ z({
|
|
1727
1922
|
__name: "NumberField",
|
|
1728
1923
|
props: {
|
|
1729
1924
|
showVaultSecretPicker: { type: Boolean, default: () => {
|
|
@@ -1745,74 +1940,74 @@ const _e = /* @__PURE__ */ z({
|
|
|
1745
1940
|
},
|
|
1746
1941
|
emits: ["update:modelValue"],
|
|
1747
1942
|
setup(e, { emit: r }) {
|
|
1748
|
-
const t =
|
|
1749
|
-
const
|
|
1750
|
-
if (typeof
|
|
1751
|
-
return { min:
|
|
1752
|
-
const [
|
|
1943
|
+
const t = pe(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: a, hide: s, ...n } = ne(O(() => e.name)), u = le(n.path, t), { i18n: l } = he(), f = b(() => {
|
|
1944
|
+
const x = n.schema?.value;
|
|
1945
|
+
if (typeof x.gt == "number")
|
|
1946
|
+
return { min: x.type === "integer" ? x.gt + 1 : x.gt };
|
|
1947
|
+
const [g, w] = x.between ?? [];
|
|
1753
1948
|
return {
|
|
1754
|
-
min: t.min ??
|
|
1755
|
-
max: t.max ??
|
|
1949
|
+
min: t.min ?? g,
|
|
1950
|
+
max: t.max ?? w
|
|
1756
1951
|
};
|
|
1757
|
-
}), i = r, c =
|
|
1758
|
-
const
|
|
1759
|
-
if (
|
|
1760
|
-
if (v.value) return `${
|
|
1761
|
-
const
|
|
1762
|
-
return Number.isFinite(
|
|
1952
|
+
}), i = r, c = a.value, h = b(() => {
|
|
1953
|
+
const x = a?.value;
|
|
1954
|
+
if (x == null || x === "") return "";
|
|
1955
|
+
if (v.value) return `${x}`;
|
|
1956
|
+
const g = typeof x == "number" ? x : Number(x);
|
|
1957
|
+
return Number.isFinite(g) ? `${g}` : "";
|
|
1763
1958
|
});
|
|
1764
|
-
function
|
|
1765
|
-
const
|
|
1766
|
-
c !== void 0 &&
|
|
1959
|
+
function p(x) {
|
|
1960
|
+
const g = m(x);
|
|
1961
|
+
c !== void 0 && x === "" && g !== c ? (a.value = n.emptyValue.value, i("update:modelValue", n.emptyValue.value)) : (a.value = g, i("update:modelValue", g));
|
|
1767
1962
|
}
|
|
1768
|
-
function
|
|
1769
|
-
if (
|
|
1770
|
-
const
|
|
1771
|
-
if (
|
|
1772
|
-
const
|
|
1773
|
-
return Number.isFinite(
|
|
1963
|
+
function m(x) {
|
|
1964
|
+
if (x === "") return n.emptyValue.value;
|
|
1965
|
+
const g = x.trim();
|
|
1966
|
+
if (g === "") return n.emptyValue.value;
|
|
1967
|
+
const w = Number(g);
|
|
1968
|
+
return Number.isFinite(w) ? w : v.value ? x : n.emptyValue.value;
|
|
1774
1969
|
}
|
|
1775
|
-
const
|
|
1776
|
-
return (
|
|
1777
|
-
const
|
|
1778
|
-
return
|
|
1970
|
+
const d = ve(ft, void 0), y = b(() => ({ referenceable: v.value })), v = b(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!n.schema.value?.referenceable), T = b(() => v.value ? "text" : "number");
|
|
1971
|
+
return (x, g) => {
|
|
1972
|
+
const w = N("KAlert");
|
|
1973
|
+
return n.error ? (A(), q(w, {
|
|
1779
1974
|
key: 0,
|
|
1780
1975
|
appearance: "danger",
|
|
1781
|
-
message:
|
|
1782
|
-
}, null, 8, ["message"])) : X((
|
|
1783
|
-
|
|
1784
|
-
...o(
|
|
1976
|
+
message: n.error.message
|
|
1977
|
+
}, null, 8, ["message"])) : X((A(), $("div", ca, [
|
|
1978
|
+
V(Ae, G({ class: "ff-number-field" }, {
|
|
1979
|
+
...o(u),
|
|
1785
1980
|
min: f.value.min,
|
|
1786
1981
|
max: f.value.max
|
|
1787
1982
|
}, {
|
|
1788
1983
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1789
|
-
"data-testid": `ff-${
|
|
1984
|
+
"data-testid": `ff-${n.path.value}`,
|
|
1790
1985
|
"model-value": h.value,
|
|
1791
1986
|
type: T.value,
|
|
1792
|
-
"onUpdate:modelValue":
|
|
1793
|
-
}),
|
|
1794
|
-
o(
|
|
1987
|
+
"onUpdate:modelValue": p
|
|
1988
|
+
}), Z({ _: 2 }, [
|
|
1989
|
+
o(u).labelAttributes?.info ? {
|
|
1795
1990
|
name: "label-tooltip",
|
|
1796
|
-
fn:
|
|
1797
|
-
D(
|
|
1798
|
-
|
|
1799
|
-
innerHTML: o(
|
|
1800
|
-
}, null, 8,
|
|
1991
|
+
fn: L(() => [
|
|
1992
|
+
D(x.$slots, "tooltip", {}, () => [
|
|
1993
|
+
B("div", {
|
|
1994
|
+
innerHTML: o(u).labelAttributes.info
|
|
1995
|
+
}, null, 8, da)
|
|
1801
1996
|
], !0)
|
|
1802
1997
|
]),
|
|
1803
1998
|
key: "0"
|
|
1804
1999
|
} : void 0
|
|
1805
2000
|
]), 1040, ["data-autofocus", "data-testid", "model-value", "type"]),
|
|
1806
|
-
o(
|
|
2001
|
+
o(d) && v.value ? (A(), q(ie(o(d)), {
|
|
1807
2002
|
key: 0,
|
|
1808
|
-
schema:
|
|
1809
|
-
update:
|
|
1810
|
-
value: o(
|
|
2003
|
+
schema: y.value,
|
|
2004
|
+
update: p,
|
|
2005
|
+
value: o(a) ?? ""
|
|
1811
2006
|
}, null, 8, ["schema", "value"])) : H("", !0),
|
|
1812
|
-
v.value && !o(
|
|
2007
|
+
v.value && !o(d) ? (A(), q(w, {
|
|
1813
2008
|
key: 1,
|
|
1814
2009
|
appearance: "warning",
|
|
1815
|
-
"data-testid": `ff-vault-secret-picker-warning-${
|
|
2010
|
+
"data-testid": `ff-vault-secret-picker-warning-${n.path.value}`,
|
|
1816
2011
|
message: o(l).t("plugins.free-form.vault_picker.component_error")
|
|
1817
2012
|
}, null, 8, ["data-testid", "message"])) : H("", !0)
|
|
1818
2013
|
], 512)), [
|
|
@@ -1820,9 +2015,9 @@ const _e = /* @__PURE__ */ z({
|
|
|
1820
2015
|
]);
|
|
1821
2016
|
};
|
|
1822
2017
|
}
|
|
1823
|
-
}),
|
|
2018
|
+
}), ma = /* @__PURE__ */ Y(pa, [["__scopeId", "data-v-ba8e04d8"]]), fa = ["innerHTML"], ha = /* @__PURE__ */ z({
|
|
1824
2019
|
__name: "EnumField",
|
|
1825
|
-
props: /* @__PURE__ */
|
|
2020
|
+
props: /* @__PURE__ */ Ue({
|
|
1826
2021
|
labelAttributes: {},
|
|
1827
2022
|
items: {},
|
|
1828
2023
|
placeholder: {},
|
|
@@ -1857,34 +2052,34 @@ const _e = /* @__PURE__ */ z({
|
|
|
1857
2052
|
},
|
|
1858
2053
|
modelModifiers: {}
|
|
1859
2054
|
}),
|
|
1860
|
-
emits: /* @__PURE__ */
|
|
2055
|
+
emits: /* @__PURE__ */ Ue(["update"], ["update:modelValue"]),
|
|
1861
2056
|
setup(e, { emit: r }) {
|
|
1862
|
-
const t = r,
|
|
2057
|
+
const t = r, a = pe(e, ["name", "items", "multiple", "autofocus"]), { getSelectItems: s } = ee(), { value: n, hide: u, ...l } = ne(
|
|
1863
2058
|
O(() => e.name)
|
|
1864
|
-
), f =
|
|
1865
|
-
function i(
|
|
1866
|
-
if (f.value.required) return
|
|
1867
|
-
const
|
|
1868
|
-
return
|
|
2059
|
+
), f = le(l.path, a);
|
|
2060
|
+
function i(d) {
|
|
2061
|
+
if (f.value.required) return d;
|
|
2062
|
+
const y = p.value && Array.isArray(d) && d.length === 0;
|
|
2063
|
+
return d == null || d === "" || y ? l.emptyValue.value : d;
|
|
1869
2064
|
}
|
|
1870
|
-
const c =
|
|
2065
|
+
const c = Fe(e, "modelValue", {
|
|
1871
2066
|
// If multiple and value is null/undefined, return empty array for v-model
|
|
1872
|
-
get: () =>
|
|
1873
|
-
set: (
|
|
1874
|
-
|
|
2067
|
+
get: () => p.value && n?.value == null ? [] : n.value,
|
|
2068
|
+
set: (d) => {
|
|
2069
|
+
n.value = i(d);
|
|
1875
2070
|
}
|
|
1876
|
-
}), h =
|
|
1877
|
-
return (
|
|
1878
|
-
const v =
|
|
1879
|
-
return l.error ? (
|
|
2071
|
+
}), h = b(() => e.items ? e.items : l.path ? s(l.path.value) : []), p = b(() => e.multiple !== void 0 ? e.multiple : l.schema.value?.type === "set"), m = b(() => p.value ? Nt : Bt);
|
|
2072
|
+
return (d, y) => {
|
|
2073
|
+
const v = N("KAlert");
|
|
2074
|
+
return l.error ? (A(), q(v, {
|
|
1880
2075
|
key: 0,
|
|
1881
2076
|
appearance: "danger",
|
|
1882
2077
|
message: l.error.message
|
|
1883
|
-
}, null, 8, ["message"])) : X((
|
|
2078
|
+
}, null, 8, ["message"])) : X((A(), q(o(m), G({ key: 1 }, { ...a, ...o(f) }, {
|
|
1884
2079
|
modelValue: c.value,
|
|
1885
2080
|
"onUpdate:modelValue": [
|
|
1886
|
-
|
|
1887
|
-
|
|
2081
|
+
y[0] || (y[0] = (T) => c.value = T),
|
|
2082
|
+
y[1] || (y[1] = (T) => t("update", i(T)))
|
|
1888
2083
|
],
|
|
1889
2084
|
class: "ff-enum-field",
|
|
1890
2085
|
clearable: !o(f).required,
|
|
@@ -1892,38 +2087,38 @@ const _e = /* @__PURE__ */ z({
|
|
|
1892
2087
|
"data-testid": `ff-${l.path.value}`,
|
|
1893
2088
|
items: h.value,
|
|
1894
2089
|
"kpop-attributes": { "data-testid": `ff-enum-${l.path.value}-items` }
|
|
1895
|
-
}),
|
|
1896
|
-
"tooltip" in
|
|
2090
|
+
}), Z({ _: 2 }, [
|
|
2091
|
+
"tooltip" in d.$slots || o(f).labelAttributes?.info ? {
|
|
1897
2092
|
name: "label-tooltip",
|
|
1898
|
-
fn:
|
|
1899
|
-
D(
|
|
1900
|
-
|
|
2093
|
+
fn: L(() => [
|
|
2094
|
+
D(d.$slots, "tooltip", {}, () => [
|
|
2095
|
+
B("div", {
|
|
1901
2096
|
innerHTML: o(f).labelAttributes.info
|
|
1902
|
-
}, null, 8,
|
|
2097
|
+
}, null, 8, fa)
|
|
1903
2098
|
], !0)
|
|
1904
2099
|
]),
|
|
1905
2100
|
key: "0"
|
|
1906
2101
|
} : void 0,
|
|
1907
|
-
|
|
2102
|
+
d.$slots["item-label"] ? {
|
|
1908
2103
|
name: "item-template",
|
|
1909
|
-
fn:
|
|
1910
|
-
D(
|
|
2104
|
+
fn: L(({ item: T }) => [
|
|
2105
|
+
D(d.$slots, "item-label", We(ut(T)), void 0, !0)
|
|
1911
2106
|
]),
|
|
1912
2107
|
key: "1"
|
|
1913
2108
|
} : void 0,
|
|
1914
|
-
|
|
2109
|
+
d.$slots["dropdown-footer-text"] ? {
|
|
1915
2110
|
name: "dropdown-footer-text",
|
|
1916
|
-
fn:
|
|
1917
|
-
D(
|
|
2111
|
+
fn: L(() => [
|
|
2112
|
+
D(d.$slots, "dropdown-footer-text", {}, void 0, !0)
|
|
1918
2113
|
]),
|
|
1919
2114
|
key: "2"
|
|
1920
2115
|
} : void 0
|
|
1921
2116
|
]), 1040, ["modelValue", "clearable", "data-autofocus", "data-testid", "items", "kpop-attributes"])), [
|
|
1922
|
-
[Q, !o(
|
|
2117
|
+
[Q, !o(u)]
|
|
1923
2118
|
]);
|
|
1924
2119
|
};
|
|
1925
2120
|
}
|
|
1926
|
-
}),
|
|
2121
|
+
}), Ie = /* @__PURE__ */ Y(ha, [["__scopeId", "data-v-c8901fca"]]), ga = ["data-testid"], ya = ["innerHTML"], va = /* @__PURE__ */ z({
|
|
1927
2122
|
inheritAttrs: !1,
|
|
1928
2123
|
__name: "JsonField",
|
|
1929
2124
|
props: {
|
|
@@ -1933,40 +2128,40 @@ const _e = /* @__PURE__ */ z({
|
|
|
1933
2128
|
},
|
|
1934
2129
|
emits: ["update:modelValue"],
|
|
1935
2130
|
setup(e, { emit: r }) {
|
|
1936
|
-
const t =
|
|
1937
|
-
function c(
|
|
1938
|
-
i.value =
|
|
1939
|
-
let
|
|
2131
|
+
const t = _e(), a = pe(e, ["autofocus", "name"]), s = r, { value: n, hide: u, ...l } = ne(O(() => e.name)), f = le(l.path, O({ ...a, ...t })), i = se("");
|
|
2132
|
+
function c(p) {
|
|
2133
|
+
i.value = p;
|
|
2134
|
+
let m = p === "" ? l.emptyValue.value : p;
|
|
1940
2135
|
try {
|
|
1941
|
-
const
|
|
1942
|
-
|
|
2136
|
+
const d = JSON.parse(p);
|
|
2137
|
+
d && typeof d == "object" && (m = d);
|
|
1943
2138
|
} catch {
|
|
1944
2139
|
}
|
|
1945
|
-
|
|
2140
|
+
n.value = m, s("update:modelValue", m);
|
|
1946
2141
|
}
|
|
1947
|
-
const h =
|
|
1948
|
-
return
|
|
1949
|
-
if (
|
|
2142
|
+
const h = b(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : fe(e.name) === "name");
|
|
2143
|
+
return te(n, (p) => {
|
|
2144
|
+
if (p && typeof p == "object") {
|
|
1950
2145
|
try {
|
|
1951
|
-
const
|
|
1952
|
-
|
|
2146
|
+
const m = JSON.parse(i.value);
|
|
2147
|
+
ge(m, p) || (i.value = JSON.stringify(p, null, 2));
|
|
1953
2148
|
} catch {
|
|
1954
|
-
i.value = JSON.stringify(
|
|
2149
|
+
i.value = JSON.stringify(p, null, 2);
|
|
1955
2150
|
}
|
|
1956
2151
|
return;
|
|
1957
2152
|
}
|
|
1958
|
-
i.value =
|
|
1959
|
-
}, { immediate: !0 }), (
|
|
1960
|
-
const
|
|
1961
|
-
return l.error ? (
|
|
2153
|
+
i.value = p || "";
|
|
2154
|
+
}, { immediate: !0 }), (p, m) => {
|
|
2155
|
+
const d = N("KAlert");
|
|
2156
|
+
return l.error ? (A(), q(d, {
|
|
1962
2157
|
key: 0,
|
|
1963
2158
|
appearance: "danger",
|
|
1964
2159
|
message: l.error.message
|
|
1965
|
-
}, null, 8, ["message"])) : X((
|
|
2160
|
+
}, null, 8, ["message"])) : X((A(), $("div", {
|
|
1966
2161
|
key: 1,
|
|
1967
2162
|
"data-testid": `ff-json-${l.path.value}`
|
|
1968
2163
|
}, [
|
|
1969
|
-
|
|
2164
|
+
V(Ae, G(o(f), {
|
|
1970
2165
|
class: "ff-json-field",
|
|
1971
2166
|
"data-1p-ignore": h.value,
|
|
1972
2167
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
@@ -1974,25 +2169,25 @@ const _e = /* @__PURE__ */ z({
|
|
|
1974
2169
|
"model-value": i.value ?? "",
|
|
1975
2170
|
multiline: "",
|
|
1976
2171
|
"onUpdate:modelValue": c
|
|
1977
|
-
}),
|
|
2172
|
+
}), Z({ _: 2 }, [
|
|
1978
2173
|
o(f).labelAttributes?.info ? {
|
|
1979
2174
|
name: "label-tooltip",
|
|
1980
|
-
fn:
|
|
1981
|
-
D(
|
|
1982
|
-
|
|
2175
|
+
fn: L(() => [
|
|
2176
|
+
D(p.$slots, "tooltip", {}, () => [
|
|
2177
|
+
B("div", {
|
|
1983
2178
|
innerHTML: o(f).labelAttributes.info
|
|
1984
|
-
}, null, 8,
|
|
2179
|
+
}, null, 8, ya)
|
|
1985
2180
|
], !0)
|
|
1986
2181
|
]),
|
|
1987
2182
|
key: "0"
|
|
1988
2183
|
} : void 0
|
|
1989
2184
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1990
|
-
], 8,
|
|
1991
|
-
[Q, !o(
|
|
2185
|
+
], 8, ga)), [
|
|
2186
|
+
[Q, !o(u)]
|
|
1992
2187
|
]);
|
|
1993
2188
|
};
|
|
1994
2189
|
}
|
|
1995
|
-
}),
|
|
2190
|
+
}), ba = /* @__PURE__ */ Y(va, [["__scopeId", "data-v-5614e8a5"]]), _a = ["innerHTML"], Aa = /* @__PURE__ */ z({
|
|
1996
2191
|
inheritAttrs: !1,
|
|
1997
2192
|
__name: "ForeignField",
|
|
1998
2193
|
props: {
|
|
@@ -2011,33 +2206,33 @@ const _e = /* @__PURE__ */ z({
|
|
|
2011
2206
|
},
|
|
2012
2207
|
emits: ["update:modelValue"],
|
|
2013
2208
|
setup(e, { emit: r }) {
|
|
2014
|
-
const t =
|
|
2209
|
+
const t = _e(), { i18n: { t: a } } = he(), s = pe(e, ["autofocus", "name"]), n = r, { value: u, hide: l, ...f } = ne(O(() => e.name));
|
|
2015
2210
|
if (f.error)
|
|
2016
2211
|
throw new Error(f.error.message);
|
|
2017
|
-
const i =
|
|
2018
|
-
function
|
|
2019
|
-
c !== void 0 &&
|
|
2212
|
+
const i = le(f.path, O({ ...s, ...t })), c = u.value ? u.value.id : null, h = b(() => i.value.placeholder ? i.value.placeholder : a("plugins.free-form.foreign_placeholder", { entity: f.schema.value?.reference ?? "entity" })), p = se(c ?? "");
|
|
2213
|
+
function m(y) {
|
|
2214
|
+
c !== void 0 && y === "" && y !== c ? (u.value = f.emptyValue.value, n("update:modelValue", f.emptyValue.value)) : (u.value = { id: y.trim() }, n("update:modelValue", u.value));
|
|
2020
2215
|
}
|
|
2021
|
-
const
|
|
2022
|
-
return (
|
|
2216
|
+
const d = b(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : fe(e.name) === "name");
|
|
2217
|
+
return (y, v) => X((A(), q(Ae, G(o(i), {
|
|
2023
2218
|
class: "ff-foreign-field",
|
|
2024
|
-
"data-1p-ignore":
|
|
2219
|
+
"data-1p-ignore": d.value,
|
|
2025
2220
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
2026
2221
|
"data-testid": `ff-${f.path.value}`,
|
|
2027
2222
|
error: e.error,
|
|
2028
2223
|
"error-message": e.errorMessage,
|
|
2029
2224
|
help: e.help,
|
|
2030
|
-
"model-value":
|
|
2225
|
+
"model-value": p.value,
|
|
2031
2226
|
placeholder: h.value,
|
|
2032
|
-
"onUpdate:modelValue":
|
|
2033
|
-
}),
|
|
2227
|
+
"onUpdate:modelValue": m
|
|
2228
|
+
}), Z({ _: 2 }, [
|
|
2034
2229
|
o(i).labelAttributes?.info ? {
|
|
2035
2230
|
name: "label-tooltip",
|
|
2036
|
-
fn:
|
|
2037
|
-
D(
|
|
2038
|
-
|
|
2231
|
+
fn: L(() => [
|
|
2232
|
+
D(y.$slots, "tooltip", {}, () => [
|
|
2233
|
+
B("div", {
|
|
2039
2234
|
innerHTML: o(i).labelAttributes.info
|
|
2040
|
-
}, null, 8,
|
|
2235
|
+
}, null, 8, _a)
|
|
2041
2236
|
], !0)
|
|
2042
2237
|
]),
|
|
2043
2238
|
key: "0"
|
|
@@ -2046,7 +2241,7 @@ const _e = /* @__PURE__ */ z({
|
|
|
2046
2241
|
[Q, !o(l)]
|
|
2047
2242
|
]);
|
|
2048
2243
|
}
|
|
2049
|
-
}),
|
|
2244
|
+
}), wa = /* @__PURE__ */ Y(Aa, [["__scopeId", "data-v-bb4fc991"]]), ka = ["data-testid"], Ca = ["data-testid"], Sa = ["innerHTML"], xa = { class: "ff-map-field-item-content" }, Ia = { class: "ff-map-field-fields" }, Ta = /* @__PURE__ */ z({
|
|
2050
2245
|
__name: "MapField",
|
|
2051
2246
|
props: {
|
|
2052
2247
|
keyPlaceholder: {},
|
|
@@ -2058,115 +2253,115 @@ const _e = /* @__PURE__ */ z({
|
|
|
2058
2253
|
},
|
|
2059
2254
|
emits: ["legacyValueChange"],
|
|
2060
2255
|
setup(e, { emit: r }) {
|
|
2061
|
-
const { i18n: t } =
|
|
2062
|
-
keys:
|
|
2063
|
-
updateKey:
|
|
2256
|
+
const { i18n: t } = he(), a = e, s = r, {
|
|
2257
|
+
keys: n,
|
|
2258
|
+
updateKey: u,
|
|
2064
2259
|
addKey: l,
|
|
2065
2260
|
removeKey: f,
|
|
2066
2261
|
field: i,
|
|
2067
2262
|
fieldDisplayName: c
|
|
2068
|
-
} =
|
|
2069
|
-
function
|
|
2070
|
-
|
|
2263
|
+
} = Sn(O(a, "name"), _), h = le(i.path, a), p = ["string", "number", "boolean", "integer", "foreign"], m = b(() => a.oneLine ? !0 : i.schema?.value?.type === "map" && p.includes(i.schema.value.values.type) && !a.appearance?.string?.multiline), d = b(() => i.schema?.value?.type === "map" ? i.schema.value.values : void 0), y = b(() => d.value?.type === "string" && !d.value?.one_of), v = b(() => m.value ? "div" : Be), T = ct("root");
|
|
2264
|
+
function x(k, S) {
|
|
2265
|
+
a.appearance?.string?.multiline || (k.preventDefault(), S === n.value.length - 1 && l(), g(S + 1));
|
|
2071
2266
|
}
|
|
2072
|
-
async function
|
|
2073
|
-
T.value && (await
|
|
2267
|
+
async function g(k) {
|
|
2268
|
+
T.value && (await De(), T.value.querySelector(`[data-key-input="${k}"]`)?.focus());
|
|
2074
2269
|
}
|
|
2075
|
-
function
|
|
2270
|
+
function w() {
|
|
2076
2271
|
l();
|
|
2077
|
-
const k =
|
|
2078
|
-
|
|
2272
|
+
const k = n.value.findIndex(([S, M]) => !M);
|
|
2273
|
+
g(k === -1 ? n.value.length - 1 : k);
|
|
2079
2274
|
}
|
|
2080
|
-
function
|
|
2275
|
+
function _(k) {
|
|
2081
2276
|
s("legacyValueChange", k);
|
|
2082
2277
|
}
|
|
2083
2278
|
return (k, S) => {
|
|
2084
|
-
const M =
|
|
2085
|
-
return o(i).error ? (
|
|
2279
|
+
const M = N("KAlert"), P = N("KLabel"), K = N("KButton"), C = N("KTooltip");
|
|
2280
|
+
return o(i).error ? (A(), q(M, {
|
|
2086
2281
|
key: 0,
|
|
2087
2282
|
appearance: "danger",
|
|
2088
2283
|
message: o(i).error.message
|
|
2089
|
-
}, null, 8, ["message"])) : X((
|
|
2284
|
+
}, null, 8, ["message"])) : X((A(), $("div", {
|
|
2090
2285
|
key: 1,
|
|
2091
2286
|
ref_key: "root",
|
|
2092
2287
|
ref: T,
|
|
2093
2288
|
class: "ff-map-field",
|
|
2094
2289
|
"data-testid": `ff-map-${o(i).path.value}`
|
|
2095
2290
|
}, [
|
|
2096
|
-
o(h).label ? (
|
|
2291
|
+
o(h).label ? (A(), $("header", {
|
|
2097
2292
|
key: 0,
|
|
2098
2293
|
class: "ff-map-field-header",
|
|
2099
2294
|
"data-testid": `ff-map-header-${o(i).path.value}`
|
|
2100
2295
|
}, [
|
|
2101
|
-
|
|
2296
|
+
V(P, G({ class: "ff-map-field-label" }, o(h).labelAttributes, {
|
|
2102
2297
|
"data-testid": `ff-label-${o(i).path.value}`,
|
|
2103
2298
|
required: o(h).required,
|
|
2104
2299
|
"tooltip-attributes": o(h).labelAttributes.tooltipAttributes
|
|
2105
|
-
}),
|
|
2106
|
-
default:
|
|
2107
|
-
|
|
2300
|
+
}), Z({
|
|
2301
|
+
default: L(() => [
|
|
2302
|
+
ue(re(o(h).label) + " ", 1)
|
|
2108
2303
|
]),
|
|
2109
2304
|
_: 2
|
|
2110
2305
|
}, [
|
|
2111
2306
|
o(h).labelAttributes?.info ? {
|
|
2112
2307
|
name: "tooltip",
|
|
2113
|
-
fn:
|
|
2308
|
+
fn: L(() => [
|
|
2114
2309
|
D(k.$slots, "tooltip", {}, () => [
|
|
2115
|
-
|
|
2310
|
+
B("div", {
|
|
2116
2311
|
innerHTML: o(h).labelAttributes.info
|
|
2117
|
-
}, null, 8,
|
|
2312
|
+
}, null, 8, Sa)
|
|
2118
2313
|
], !0)
|
|
2119
2314
|
]),
|
|
2120
2315
|
key: "0"
|
|
2121
2316
|
} : void 0
|
|
2122
2317
|
]), 1040, ["data-testid", "required", "tooltip-attributes"])
|
|
2123
|
-
], 8,
|
|
2124
|
-
(
|
|
2318
|
+
], 8, Ca)) : H("", !0),
|
|
2319
|
+
(A(!0), $(oe, null, de(o(n), ([I, W], J) => (A(), q(ie(v.value), {
|
|
2125
2320
|
key: I,
|
|
2126
|
-
class:
|
|
2127
|
-
"ff-map-field-item-simple":
|
|
2128
|
-
"ff-map-field-item-complex": !
|
|
2321
|
+
class: Te(["ff-map-field-item", {
|
|
2322
|
+
"ff-map-field-item-simple": m.value,
|
|
2323
|
+
"ff-map-field-item-complex": !m.value
|
|
2129
2324
|
}]),
|
|
2130
|
-
"data-testid": `ff-map-container-${o(i).path.value}.${
|
|
2325
|
+
"data-testid": `ff-map-container-${o(i).path.value}.${J}`
|
|
2131
2326
|
}, {
|
|
2132
|
-
default:
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2327
|
+
default: L(() => [
|
|
2328
|
+
B("div", xa, [
|
|
2329
|
+
B("div", Ia, [
|
|
2330
|
+
V(Ae, {
|
|
2136
2331
|
class: "ff-map-field-fields-key",
|
|
2137
|
-
"data-key-input":
|
|
2138
|
-
"data-testid": `ff-map-key-${o(i).path.value}.${
|
|
2139
|
-
"model-value":
|
|
2332
|
+
"data-key-input": J,
|
|
2333
|
+
"data-testid": `ff-map-key-${o(i).path.value}.${J}`,
|
|
2334
|
+
"model-value": W,
|
|
2140
2335
|
placeholder: e.keyPlaceholder || "Key",
|
|
2141
|
-
onKeydown:
|
|
2142
|
-
"onUpdate:modelValue": (
|
|
2336
|
+
onKeydown: Ze(Pe((E) => g(J), ["prevent"]), ["enter"]),
|
|
2337
|
+
"onUpdate:modelValue": (E) => o(u)(I, E)
|
|
2143
2338
|
}, null, 8, ["data-key-input", "data-testid", "model-value", "placeholder", "onKeydown", "onUpdate:modelValue"]),
|
|
2144
2339
|
D(k.$slots, "default", { keyId: I }, () => [
|
|
2145
|
-
|
|
2340
|
+
y.value ? (A(), q(Qe, {
|
|
2146
2341
|
key: 0,
|
|
2147
2342
|
"inline-vault-picker": "",
|
|
2148
2343
|
multiline: e.appearance?.string?.multiline,
|
|
2149
2344
|
name: I,
|
|
2150
|
-
onKeydown:
|
|
2151
|
-
}, null, 8, ["multiline", "name", "onKeydown"])) : (
|
|
2345
|
+
onKeydown: Ze((E) => x(E, J), ["enter"])
|
|
2346
|
+
}, null, 8, ["multiline", "name", "onKeydown"])) : (A(), q(be, {
|
|
2152
2347
|
key: 1,
|
|
2153
2348
|
name: I
|
|
2154
2349
|
}, null, 8, ["name"]))
|
|
2155
2350
|
], !0)
|
|
2156
2351
|
]),
|
|
2157
|
-
|
|
2352
|
+
V(C, {
|
|
2158
2353
|
text: o(t).t("actions.remove_entity", { entity: o(c) })
|
|
2159
2354
|
}, {
|
|
2160
|
-
default:
|
|
2161
|
-
|
|
2355
|
+
default: L(() => [
|
|
2356
|
+
V(K, {
|
|
2162
2357
|
appearance: "tertiary",
|
|
2163
2358
|
"aria-label": o(t).t("actions.remove_entity", { entity: o(c) }),
|
|
2164
|
-
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${
|
|
2359
|
+
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${J}`,
|
|
2165
2360
|
icon: "",
|
|
2166
|
-
onClick: (
|
|
2361
|
+
onClick: (E) => o(f)(I)
|
|
2167
2362
|
}, {
|
|
2168
|
-
default:
|
|
2169
|
-
|
|
2363
|
+
default: L(() => [
|
|
2364
|
+
V(o(Je))
|
|
2170
2365
|
]),
|
|
2171
2366
|
_: 1
|
|
2172
2367
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -2177,25 +2372,87 @@ const _e = /* @__PURE__ */ z({
|
|
|
2177
2372
|
]),
|
|
2178
2373
|
_: 2
|
|
2179
2374
|
}, 1032, ["class", "data-testid"]))), 128)),
|
|
2180
|
-
|
|
2375
|
+
V(K, {
|
|
2181
2376
|
appearance: "tertiary",
|
|
2182
2377
|
"aria-label": o(t).t("actions.add_entity", { entity: o(c) }),
|
|
2183
2378
|
class: "ff-map-field-add-entry-btn",
|
|
2184
2379
|
"data-testid": `ff-map-add-btn-${o(i).path.value}`,
|
|
2185
|
-
onClick:
|
|
2380
|
+
onClick: w
|
|
2186
2381
|
}, {
|
|
2187
|
-
default:
|
|
2188
|
-
|
|
2189
|
-
|
|
2382
|
+
default: L(() => [
|
|
2383
|
+
V(o(qe)),
|
|
2384
|
+
ue(" " + re(o(t).t("actions.add_entity", { entity: o(c) })), 1)
|
|
2190
2385
|
]),
|
|
2191
2386
|
_: 1
|
|
2192
2387
|
}, 8, ["aria-label", "data-testid"])
|
|
2193
|
-
], 8,
|
|
2388
|
+
], 8, ka)), [
|
|
2194
2389
|
[Q, !o(i).hide.value]
|
|
2195
2390
|
]);
|
|
2196
2391
|
};
|
|
2197
2392
|
}
|
|
2198
|
-
}),
|
|
2393
|
+
}), Pa = /* @__PURE__ */ Y(Ta, [["__scopeId", "data-v-1431df84"]]);
|
|
2394
|
+
function qa(e) {
|
|
2395
|
+
switch (e?.type) {
|
|
2396
|
+
case "string":
|
|
2397
|
+
return "one_of" in e ? Ie : Qe;
|
|
2398
|
+
case "boolean":
|
|
2399
|
+
return "one_of" in e ? Ie : jn;
|
|
2400
|
+
case "number":
|
|
2401
|
+
case "integer":
|
|
2402
|
+
return "one_of" in e ? Ie : ma;
|
|
2403
|
+
case "array":
|
|
2404
|
+
return Gn;
|
|
2405
|
+
case "set":
|
|
2406
|
+
return Xt(e) ? kt : Ie;
|
|
2407
|
+
case "record":
|
|
2408
|
+
return ua;
|
|
2409
|
+
case "map":
|
|
2410
|
+
return Pa;
|
|
2411
|
+
case "json":
|
|
2412
|
+
return ba;
|
|
2413
|
+
case "foreign":
|
|
2414
|
+
return wa;
|
|
2415
|
+
default:
|
|
2416
|
+
return;
|
|
2417
|
+
}
|
|
2418
|
+
}
|
|
2419
|
+
function Ct(e) {
|
|
2420
|
+
return qa(e);
|
|
2421
|
+
}
|
|
2422
|
+
const La = { class: "ff-expression-field" }, Ea = /* @__PURE__ */ z({
|
|
2423
|
+
name: "ExpressionField",
|
|
2424
|
+
__name: "ExpressionField",
|
|
2425
|
+
props: {
|
|
2426
|
+
autofocus: { type: Boolean },
|
|
2427
|
+
name: {},
|
|
2428
|
+
labelAttributes: {},
|
|
2429
|
+
placeholder: {}
|
|
2430
|
+
},
|
|
2431
|
+
setup(e) {
|
|
2432
|
+
const { getSchema: r, isFieldHidden: t } = ee(), a = $e(O(() => e.name)), s = b(() => Ce(a.value)), n = b(() => Ct(r(a.value))), u = b(() => t(a.value));
|
|
2433
|
+
return (l, f) => X((A(), $("div", La, [
|
|
2434
|
+
n.value ? (A(), q(ie(n.value), {
|
|
2435
|
+
key: 0,
|
|
2436
|
+
autofocus: e.autofocus,
|
|
2437
|
+
name: s.value
|
|
2438
|
+
}, null, 8, ["autofocus", "name"])) : H("", !0),
|
|
2439
|
+
V(Rn, {
|
|
2440
|
+
name: s.value,
|
|
2441
|
+
placeholder: e.placeholder
|
|
2442
|
+
}, Z({ _: 2 }, [
|
|
2443
|
+
l.$slots.help ? {
|
|
2444
|
+
name: "help",
|
|
2445
|
+
fn: L(() => [
|
|
2446
|
+
D(l.$slots, "help", {}, void 0, !0)
|
|
2447
|
+
]),
|
|
2448
|
+
key: "0"
|
|
2449
|
+
} : void 0
|
|
2450
|
+
]), 1032, ["name", "placeholder"])
|
|
2451
|
+
], 512)), [
|
|
2452
|
+
[Q, !u.value]
|
|
2453
|
+
]);
|
|
2454
|
+
}
|
|
2455
|
+
}), Ka = /* @__PURE__ */ Y(Ea, [["__scopeId", "data-v-dbafd008"]]), be = /* @__PURE__ */ z({
|
|
2199
2456
|
name: "AutoField",
|
|
2200
2457
|
__name: "Field",
|
|
2201
2458
|
props: {
|
|
@@ -2205,60 +2462,36 @@ const _e = /* @__PURE__ */ z({
|
|
|
2205
2462
|
},
|
|
2206
2463
|
emits: ["globalAction"],
|
|
2207
2464
|
setup(e) {
|
|
2208
|
-
const r = e, t =
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
case "number":
|
|
2215
|
-
case "integer":
|
|
2216
|
-
return "one_of" in t.schema.value ? Ce : Ya;
|
|
2217
|
-
case "array":
|
|
2218
|
-
return Ka;
|
|
2219
|
-
case "set":
|
|
2220
|
-
return Nt(t.schema) ? gt : Ce;
|
|
2221
|
-
case "record":
|
|
2222
|
-
return Ha;
|
|
2223
|
-
case "map":
|
|
2224
|
-
return mn;
|
|
2225
|
-
case "json":
|
|
2226
|
-
return an;
|
|
2227
|
-
case "foreign":
|
|
2228
|
-
return rn;
|
|
2229
|
-
default:
|
|
2230
|
-
return;
|
|
2231
|
-
}
|
|
2232
|
-
});
|
|
2233
|
-
return (s, a) => {
|
|
2234
|
-
const d = B("KAlert");
|
|
2235
|
-
return _(), j(te, null, [
|
|
2236
|
-
(_(), q(oe(s.$slots[o(ke)]))),
|
|
2237
|
-
o(t).error ? (_(), q(d, {
|
|
2465
|
+
const r = e, t = ne(O(r, "name")), a = bt(O(() => t.path?.value ?? "")), s = b(() => a.available.value ? Ka : Ct(t.schema?.value));
|
|
2466
|
+
return (n, u) => {
|
|
2467
|
+
const l = N("KAlert");
|
|
2468
|
+
return A(), $(oe, null, [
|
|
2469
|
+
(A(), q(ie(n.$slots[o(xe)]))),
|
|
2470
|
+
o(t).error ? (A(), q(l, {
|
|
2238
2471
|
key: 0,
|
|
2239
2472
|
appearance: "danger",
|
|
2240
2473
|
message: o(t).error.message
|
|
2241
|
-
}, null, 8, ["message"])) : o(t).renderer.value ? (
|
|
2474
|
+
}, null, 8, ["message"])) : o(t).renderer.value ? (A(), q(ie(o(t).renderer.value), {
|
|
2242
2475
|
key: 1,
|
|
2243
2476
|
autofocus: r.autofocus,
|
|
2244
|
-
name:
|
|
2245
|
-
onGlobalAction:
|
|
2246
|
-
}, null, 40, ["autofocus", "name"])) : (
|
|
2247
|
-
|
|
2477
|
+
name: Ce(o(t).path.value),
|
|
2478
|
+
onGlobalAction: u[0] || (u[0] = (f, i) => n.$emit("globalAction", f, i))
|
|
2479
|
+
}, null, 40, ["autofocus", "name"])) : (A(), $(oe, { key: 2 }, [
|
|
2480
|
+
s.value ? (A(), q(ie(s.value), {
|
|
2248
2481
|
key: 0,
|
|
2249
2482
|
autofocus: r.autofocus,
|
|
2250
|
-
name:
|
|
2251
|
-
}, null, 8, ["autofocus", "name"])) : (
|
|
2483
|
+
name: Ce(o(t).path.value)
|
|
2484
|
+
}, null, 8, ["autofocus", "name"])) : (A(), q(l, {
|
|
2252
2485
|
key: 1,
|
|
2253
2486
|
appearance: "warning",
|
|
2254
2487
|
message: `${o(t).path.value} ${o(t).schema.value.type} (no renderer yet)`
|
|
2255
2488
|
}, null, 8, ["message"])),
|
|
2256
|
-
D(
|
|
2489
|
+
D(n.$slots, "default")
|
|
2257
2490
|
], 64))
|
|
2258
2491
|
], 64);
|
|
2259
2492
|
};
|
|
2260
2493
|
}
|
|
2261
|
-
}),
|
|
2494
|
+
}), di = /* @__PURE__ */ z({
|
|
2262
2495
|
name: "SchemaForm",
|
|
2263
2496
|
__name: "Form",
|
|
2264
2497
|
props: {
|
|
@@ -2271,73 +2504,73 @@ const _e = /* @__PURE__ */ z({
|
|
|
2271
2504
|
},
|
|
2272
2505
|
emits: ["change", "globalAction"],
|
|
2273
2506
|
setup(e, { expose: r, emit: t }) {
|
|
2274
|
-
const
|
|
2507
|
+
const a = t, s = Se(), { getSchema: n, formData: u, setValue: l, getValue: f, rootRenderRules: i, getEmptyValue: c } = gn({
|
|
2275
2508
|
schema: e.schema,
|
|
2276
|
-
propsData:
|
|
2509
|
+
propsData: b(() => e.data),
|
|
2277
2510
|
propsConfig: () => e.config,
|
|
2278
2511
|
propsRenderRules: O(() => e.renderRules),
|
|
2279
|
-
onChange: (
|
|
2280
|
-
}), h =
|
|
2281
|
-
const { fields:
|
|
2282
|
-
let
|
|
2283
|
-
return e.fieldsOrder ?
|
|
2512
|
+
onChange: (p) => a("change", p)
|
|
2513
|
+
}), h = b(() => {
|
|
2514
|
+
const { fields: p } = n();
|
|
2515
|
+
let m = p.filter((d) => Object.keys(d)[0] !== Ve);
|
|
2516
|
+
return e.fieldsOrder ? gt(m, e.fieldsOrder) : (i.value?.bundles && (m = yt([...m], i.value.bundles)), m);
|
|
2284
2517
|
});
|
|
2285
2518
|
return r({
|
|
2286
2519
|
getValue: f,
|
|
2287
|
-
getRawValue: () =>
|
|
2520
|
+
getRawValue: () => lt(u),
|
|
2288
2521
|
setValue: l,
|
|
2289
2522
|
getEmptyValue: c
|
|
2290
|
-
}), (
|
|
2291
|
-
default:
|
|
2292
|
-
(
|
|
2293
|
-
D(
|
|
2294
|
-
(
|
|
2295
|
-
key: Object.keys(
|
|
2296
|
-
name: Object.keys(
|
|
2297
|
-
onGlobalAction:
|
|
2523
|
+
}), (p, m) => (A(), q(ie(e.tag), null, {
|
|
2524
|
+
default: L(() => [
|
|
2525
|
+
(A(), q(ie(o(s)[o(xe)]))),
|
|
2526
|
+
D(p.$slots, "default", {}, () => [
|
|
2527
|
+
(A(!0), $(oe, null, de(h.value, (d) => (A(), q(be, {
|
|
2528
|
+
key: Object.keys(d)[0],
|
|
2529
|
+
name: Object.keys(d)[0],
|
|
2530
|
+
onGlobalAction: m[0] || (m[0] = (y, v) => a("globalAction", y, v))
|
|
2298
2531
|
}, null, 8, ["name"]))), 128))
|
|
2299
2532
|
])
|
|
2300
2533
|
]),
|
|
2301
2534
|
_: 3
|
|
2302
2535
|
}));
|
|
2303
2536
|
}
|
|
2304
|
-
}),
|
|
2537
|
+
}), pi = /* @__PURE__ */ z({
|
|
2305
2538
|
__name: "FieldRenderer",
|
|
2306
2539
|
props: {
|
|
2307
2540
|
match: { type: Function },
|
|
2308
2541
|
priority: {}
|
|
2309
2542
|
},
|
|
2310
2543
|
setup(e) {
|
|
2311
|
-
const r = e, { default: t } =
|
|
2312
|
-
return t &&
|
|
2544
|
+
const r = e, { default: t } = Se(), { fieldRendererRegistry: a } = ee();
|
|
2545
|
+
return t && a.set(r.match, t), (s, n) => null;
|
|
2313
2546
|
}
|
|
2314
|
-
}), fn = { 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..." }, hn = { 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" }, gn = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, yn = { 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" }, vn = { 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 scopes" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, bn = { new: "New" }, _n = { steps: { consumer: { step: "Consumer", title: "Create a consumer", description: "Consumers represent the users or applications calling your API. Add a name or tags to help you identify and manage this consumer later.", note: "A consumer can have both unique username and unique custom ID or one of them." }, credential: { step: "Credential", title: "Add a credential" } }, consumer_fields: { username_label: "Username", username_placeholder: "Enter a unique username", custom_id_label: "Custom ID", custom_id_placeholder: "Enter a unique custom ID" }, choose_consumer: { title: "Choose a consumer", description: "Choose a consumer to add a credential", select_label: "Select an existing consumer", select_placeholder: "Search consumers" }, create_consumer: { title: "Create a consumer" }, add_credential: { title: "Add a credential" }, create_principal: { title: "Create a principal", description: "Create a principal with authentication to test your plugin configuration." }, add_principal_credential: { title: "Add authentication to a principal", description: "Add authentication credentials to an existing principal." }, actions: { save_and_next: "Save and next", skip: "Skip", exit_setup: "Exit setup" }, errors: { create_consumer: "The consumer could not be created at this time.", create_credential: "The credential could not be created at this time.", load_consumers: "Consumers could not be retrieved" }, "basic-auth": { title: "Next steps for basic authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign username and password for authentication.", create_consumer: { description: "Create a new consumer with a basic auth credential to test your plugin configuration." }, add_credential: { title: "Add a basic authentication credential", description: "Add a basic auth credential to an existing consumer." }, credential_action: "Create credential" }, "key-auth": { title: "Next steps for key authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign API keys for authentication.", create_consumer: { description: "Create a new consumer with a key auth credential to test your plugin configuration." }, add_credential: { title: "Add a key authentication credential", description: "Add key authentication credentials to an existing consumer." }, credential_action: "Create key" }, "key-auth-enc": { title: "Next steps for key authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign API keys for authentication.", create_consumer: { description: "Create a new consumer with a key auth credential to test your plugin configuration." }, add_credential: { title: "Add a key authentication credential", description: "Add key authentication credentials to an existing consumer." }, credential_action: "Create key" }, oauth2: { title: "Next steps for OAuth 2.0 authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to register an OAuth 2.0 application for authentication.", create_consumer: { description: "Create a new consumer with an OAuth 2.0 credential to test your plugin configuration." }, add_credential: { title: "Add an OAuth 2.0 credential", description: "Add an OAuth 2.0 credential to an existing consumer." }, credential_action: "Create credential" }, "hmac-auth": { title: "Next steps for HMAC authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to add usernames and secrets for authentication.", create_consumer: { description: "Create a new consumer with a HMAC auth credential to test your plugin configuration." }, add_credential: { title: "Add a HMAC authentication credential", description: "Add a HMAC auth credential to an existing consumer." }, credential_action: "Create credential" }, jwt: { title: "Next steps for JWT plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign JWT credentials (public and secret keys) for authentication.", create_consumer: { description: "Create a new consumer with a JWT credential to test your plugin configuration." }, add_credential: { title: "Add a JWT credential", description: "Add a JWT credential to an existing consumer." }, credential_action: "Create credential" }, acl: { title: "Next steps for ACL plugins", subtitle: "Consumers represent the users or applications calling your API. You do this by configuring either an allow list or a deny list with certain consumers or consumer groups.", create_consumer: { description: "Create a new consumer with an ACL credential to test your plugin configuration." }, add_credential: { title: "Add an ACL credential", description: "Add an ACL credential to an existing consumer to test your new plugin configuration." }, credential_action: "Add group to consumer" } }, wn = /* @__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."},"entitlement-enforcement":{"name":"Entitlement Enforcement","description":"Allow or deny API requests based on customer entitlements. Checks feature access, usage limits, and credit balance against Metering & Billing before routing traffic."}},"fields":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","service_id":"Service ID","route_id":"Route ID","consumer_id":"Consumer ID","consumer_group_id":"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"},"secret":{"generateLabel":"Generate secret"}},"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":{"title":{"label":"Access policy","description":"Select how requests are authorized. Choose one access policy: allow or deny by ACL group, or define a CEL expression. Only one policy type can be configured at a time."},"allow":{"label":"Allow list","description":"Allow requests from the specified ACL groups."},"deny":{"label":"Deny list","description":"Deny requests from the specified ACL groups."},"allow_when":{"label":"Allow expression","description":"Allow requests when the CEL expression evaluates to true."},"deny_when":{"label":"Deny expression","description":"Deny requests when the CEL expression evaluates to true."}},"field":{"allow":{"label":"Allowed list","placeholder":"Enter group names","add":"Add allow"},"deny":{"label":"Denied list","placeholder":"Enter group names","add":"Add deny"},"allow_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}},"deny_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}}}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"openid-connect":{"tabs":{"common":{"title":"Common Configuration Settings","description":"Parameters for enabling the OpenID Connect plugin. Set these parameters before adding authorization, authentication, or other advanced configuration details."},"authorization":{"title":"Authorization Configuration Settings","description":"Parameters for setting up claims-based authorization."},"advanced":{"title":"Advanced Configuration Settings","description":"Advanced parameters for manually configuring the OpenID Connect plugin."}},"auth_methods":{"label":"Authentication methods","placeholder":"Select authentication methods","hint":"Configure which OAuth and OpenID Connect features are supported.","km_label":"Auth methods","methods":{"authorization_code":"Authorization code flow","bearer":"Bearer access token","client_credentials":"Client credentials grant","password":"Passwords grant","introspection":"Introspection","userinfo":"UserInfo","kong_oauth2":"Kong OAuth","refresh_token":"Refresh token"},"session":{"label":"Session management","switch_label":"Enable Session Management","use_label":"Use sessions","use_description":"Issue a session cookie after successful authentication. Subsequent requests use the session instead of re-authenticating with the identity provider.","no_use_label":"Do not use sessions","no_use_description":"Authenticate each request using the configured authentication flow."}},"principals":{"header":"Who should manage authentication and credentials?","description":"Use External auth server to continue using your existing OAuth provider and authentication workflows. Use Kong Identity to adopt a newer principal-based model that centralizes and simplifies identity and authentication management.","learn_more":"Learn more.","kong_identity_label":"Kong Identity","kong_identity_description":"Use Kong Identity to authenticate OpenID Connect tokens. If all data plane nodes are running version 3.15 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","kong_identity_description_ai_manager":"Use Kong Identity to authenticate OpenID Connect tokens. If all AI Gateway nodes are running version 2.0 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","external_label":"External auth server","external_description":"Connect to your existing identity provider to manage authentication outside of Kong.","guide":{"title":"Add principals","description":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products.","description_external":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products. Requires data plane nodes to be running version 3.15 or later.","create":"Create principal","learn_more":"Learn more"},"auth_server":{"label":"Authorization Server","info":"The Kong Identity auth server that will act as the OpenID Connect provider for this plugin.","placeholder":"Select an Authorization Server","create":"Create authorization server","create_hint":"You'll need to return here after creating an authorization server. Your progress won't be saved.","no_access_help":"You don't have access to browse authorization servers. Enter the issuer URL of your Kong Identity authorization server directly.","issuer_placeholder":"e.g., https://your-auth-server.identity.konghq.com"},"client":{"label":"Client","id_label":"Client id","secret_label":"Client secret","placeholder":"Select a client","id_placeholder":"e.g., kong-gateway-client","secret_placeholder":"e.g., your-client-secret","create":"Create client","create_hint":"You'll need to return here after creating a client. Your progress won't be saved.","add":"Add client","remove":"Remove client"},"leave_prompt":{"title":"Leave this page?","message":"Your unsaved changes will be lost if you continue.","action":"Leave page"},"dp_version_alert":"We detected that one or more data plane nodes are running a version earlier than 3.15. If principal lookup is enabled, requests handled by those data plane nodes will fail."},"lookup":{"collapse_label":"Show additional settings","toggle_label":"Use principal lookup","toggle_info":"Look up the authenticated principal in Kong Identity after token validation. Enable this when the validated token doesn't contain all of the identity data required for authorization or activity logging.","method":{"label":"Principal lookup method","placeholder":"Select a lookup method","help":"Principal lookup queries Kong Identity for the principal that matches the identity in a verified access token. This enables principal-aware policies and integrations. Requires all data plane nodes to be running version 3.15 or later.","kong_identity_label":"Kong Identity client","kong_identity_description":"Match principals using a token claim, defaulting to the subject (sub) claim.","custom_identity_label":"Custom claim","custom_identity_description":"Match principals using a custom JWT claim."},"custom_identity_name":{"label":"Custom identity name","help":"Enter the custom identity name used to look up the principal. Kong matches the value from the token claim to a principal with the same custom identity name and value.","placeholder":"e.g., Customer_ID"},"token_claim":{"label":"Token claim","placeholder":"e.g., user.employee_id","help":"Defaults to the subject (sub) claim, but you can specify a different token claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id).","help_custom":"The token claim whose value is matched against the Custom identity name. Defaults to the subject (sub) claim, but you can specify a different claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id)."},"error_on_miss":{"label":"If principal lookup fails","reject_label":"Reject the request","reject_description":"Treat the request as unauthenticated if Kong Identity cannot resolve the principal.","continue_label":"Continue without a principal","continue_description":"Allow the request to continue without resolving a principal."},"match_consumer":{"label":"Use linked consumers","description":"Use the consumer linked to the authenticated principal so existing consumer-based plugins and policies continue to work.","link":"Learn how to link a consumer."},"match_consumer_groups":{"label":"Use linked consumer groups","description":"Use consumer groups linked to the authenticated principal so existing consumer group policies and plugins continue to work. Consumer groups can be linked through principal metadata.","link":"Learn how to link a consumer group."}},"advanced_fields":{"client_jwk_link_label":"Client JWK","verify_signature_description":"JSON Web Keys are automatically fetched from the issuer's well-known endpoint. Enter a JWKS URI below to override this."}},"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":{"unavailable_kong_manager":"The Entitlement Enforcement plugin can't be configured in Kong Manager yet.","sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Entitlement Enforcement plugin subject, feature, and connection settings."},"governance":{"title":"Entitlement Enforcement settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to enforce (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the entitlement access endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to enforce (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 enforce access","help":"Feature that will control access to the scope where the plugin is applied.","create_feature":"+ Create new feature","unavailable":"You don't have access to metering features. Enable Metering & Billing in your Konnect organization to configure the feature to enforce.","load_error":"Could not load features from the entitlement enforcement service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing entitlement access. For self-hosted OpenMeter, use the entitlement 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":"Customers must have a positive credit balance to access 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":"If the plugin fails, customers can still access this feature.","block_label":"Block access","block_description":"If the plugin fails, customers cannot access this 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"},"advanced_configuration":{"title":"Advanced configuration","show_label":"Show advanced configuration","hide_label":"Hide advanced configuration"},"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}"}}`), An = { 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" } } }, kn = { plugin: "plugin" }, Cn = { 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" } }, Sn = { 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.
|
|
2547
|
+
}), Ma = { 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..." }, Ra = { 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" }, Va = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, $a = { 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" }, ja = { 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 scopes" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, Oa = { new: "New" }, Da = { steps: { consumer: { step: "Consumer", title: "Create a consumer", description: "Consumers represent the users or applications calling your API. Add a name or tags to help you identify and manage this consumer later.", note: "A consumer can have both unique username and unique custom ID or one of them." }, credential: { step: "Credential", title: "Add a credential" } }, consumer_fields: { username_label: "Username", username_placeholder: "Enter a unique username", custom_id_label: "Custom ID", custom_id_placeholder: "Enter a unique custom ID" }, choose_consumer: { title: "Choose a consumer", description: "Choose a consumer to add a credential", select_label: "Select an existing consumer", select_placeholder: "Search consumers" }, create_consumer: { title: "Create a consumer" }, add_credential: { title: "Add a credential" }, create_principal: { title: "Create a principal", description: "Create a principal with authentication to test your plugin configuration." }, add_principal_credential: { title: "Add authentication to a principal", description: "Add authentication credentials to an existing principal." }, actions: { save_and_next: "Save and next", skip: "Skip", exit_setup: "Exit setup" }, errors: { create_consumer: "The consumer could not be created at this time.", create_credential: "The credential could not be created at this time.", load_consumers: "Consumers could not be retrieved" }, "basic-auth": { title: "Next steps for basic authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign username and password for authentication.", create_consumer: { description: "Create a new consumer with a basic auth credential to test your plugin configuration." }, add_credential: { title: "Add a basic authentication credential", description: "Add a basic auth credential to an existing consumer." }, credential_action: "Create credential" }, "key-auth": { title: "Next steps for key authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign API keys for authentication.", create_consumer: { description: "Create a new consumer with a key auth credential to test your plugin configuration." }, add_credential: { title: "Add a key authentication credential", description: "Add key authentication credentials to an existing consumer." }, credential_action: "Create key" }, "key-auth-enc": { title: "Next steps for key authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign API keys for authentication.", create_consumer: { description: "Create a new consumer with a key auth credential to test your plugin configuration." }, add_credential: { title: "Add a key authentication credential", description: "Add key authentication credentials to an existing consumer." }, credential_action: "Create key" }, oauth2: { title: "Next steps for OAuth 2.0 authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to register an OAuth 2.0 application for authentication.", create_consumer: { description: "Create a new consumer with an OAuth 2.0 credential to test your plugin configuration." }, add_credential: { title: "Add an OAuth 2.0 credential", description: "Add an OAuth 2.0 credential to an existing consumer." }, credential_action: "Create credential" }, "hmac-auth": { title: "Next steps for HMAC authentication plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to add usernames and secrets for authentication.", create_consumer: { description: "Create a new consumer with a HMAC auth credential to test your plugin configuration." }, add_credential: { title: "Add a HMAC authentication credential", description: "Add a HMAC auth credential to an existing consumer." }, credential_action: "Create credential" }, jwt: { title: "Next steps for JWT plugins", subtitle: "Consumers represent the users or applications calling your API. Create a consumer to assign JWT credentials (public and secret keys) for authentication.", create_consumer: { description: "Create a new consumer with a JWT credential to test your plugin configuration." }, add_credential: { title: "Add a JWT credential", description: "Add a JWT credential to an existing consumer." }, credential_action: "Create credential" }, acl: { title: "Next steps for ACL plugins", subtitle: "Consumers represent the users or applications calling your API. You do this by configuring either an allow list or a deny list with certain consumers or consumer groups.", create_consumer: { description: "Create a new consumer with an ACL credential to test your plugin configuration." }, add_credential: { title: "Add an ACL credential", description: "Add an ACL credential to an existing consumer to test your new plugin configuration." }, credential_action: "Add group to consumer" } }, Fa = /* @__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."},"entitlement-enforcement":{"name":"Entitlement Enforcement","description":"Allow or deny API requests based on customer entitlements. Checks feature access, usage limits, and credit balance against Metering & Billing before routing traffic."}},"fields":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","service_id":"Service ID","route_id":"Route ID","consumer_id":"Consumer ID","consumer_group_id":"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"},"secret":{"generateLabel":"Generate secret"}},"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":{"title":{"label":"Access policy","description":"Select how requests are authorized. Choose one access policy: allow or deny by ACL group, or define a CEL expression. Only one policy type can be configured at a time."},"allow":{"label":"Allow list","description":"Allow requests from the specified ACL groups."},"deny":{"label":"Deny list","description":"Deny requests from the specified ACL groups."},"allow_when":{"label":"Allow expression","description":"Allow requests when the CEL expression evaluates to true."},"deny_when":{"label":"Deny expression","description":"Deny requests when the CEL expression evaluates to true."}},"field":{"allow":{"label":"Allowed list","placeholder":"Enter group names","add":"Add allow"},"deny":{"label":"Denied list","placeholder":"Enter group names","add":"Add deny"},"allow_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}},"deny_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}}}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"openid-connect":{"tabs":{"common":{"title":"Common Configuration Settings","description":"Parameters for enabling the OpenID Connect plugin. Set these parameters before adding authorization, authentication, or other advanced configuration details."},"authorization":{"title":"Authorization Configuration Settings","description":"Parameters for setting up claims-based authorization."},"advanced":{"title":"Advanced Configuration Settings","description":"Advanced parameters for manually configuring the OpenID Connect plugin."}},"auth_methods":{"label":"Authentication methods","placeholder":"Select authentication methods","hint":"Configure which OAuth and OpenID Connect features are supported.","km_label":"Auth methods","methods":{"authorization_code":"Authorization code flow","bearer":"Bearer access token","client_credentials":"Client credentials grant","password":"Passwords grant","introspection":"Introspection","userinfo":"UserInfo","kong_oauth2":"Kong OAuth","refresh_token":"Refresh token"},"session":{"label":"Session management","switch_label":"Enable Session Management","use_label":"Use sessions","use_description":"Issue a session cookie after successful authentication. Subsequent requests use the session instead of re-authenticating with the identity provider.","no_use_label":"Do not use sessions","no_use_description":"Authenticate each request using the configured authentication flow."}},"principals":{"header":"Who should manage authentication and credentials?","description":"Use External auth server to continue using your existing OAuth provider and authentication workflows. Use Kong Identity to adopt a newer principal-based model that centralizes and simplifies identity and authentication management.","learn_more":"Learn more.","kong_identity_label":"Kong Identity","kong_identity_description":"Use Kong Identity to authenticate OpenID Connect tokens. If all data plane nodes are running version 3.15 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","kong_identity_description_ai_manager":"Use Kong Identity to authenticate OpenID Connect tokens. If all AI Gateway nodes are running version 2.0 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","external_label":"External auth server","external_description":"Connect to your existing identity provider to manage authentication outside of Kong.","guide":{"title":"Add principals","description":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products.","description_external":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products. Requires data plane nodes to be running version 3.15 or later.","create":"Create principal","learn_more":"Learn more"},"auth_server":{"label":"Authorization Server","info":"The Kong Identity auth server that will act as the OpenID Connect provider for this plugin.","placeholder":"Select an Authorization Server","create":"Create authorization server","create_hint":"You'll need to return here after creating an authorization server. Your progress won't be saved.","no_access_help":"You don't have access to browse authorization servers. Enter the issuer URL of your Kong Identity authorization server directly.","issuer_placeholder":"e.g., https://your-auth-server.identity.konghq.com"},"client":{"label":"Client","id_label":"Client id","secret_label":"Client secret","placeholder":"Select a client","id_placeholder":"e.g., kong-gateway-client","secret_placeholder":"e.g., your-client-secret","create":"Create client","create_hint":"You'll need to return here after creating a client. Your progress won't be saved.","add":"Add client","remove":"Remove client"},"leave_prompt":{"title":"Leave this page?","message":"Your unsaved changes will be lost if you continue.","action":"Leave page"},"dp_version_alert":"We detected that one or more data plane nodes are running a version earlier than 3.15. If principal lookup is enabled, requests handled by those data plane nodes will fail."},"lookup":{"collapse_label":"Show additional settings","toggle_label":"Use principal lookup","toggle_info":"Look up the authenticated principal in Kong Identity after token validation. Enable this when the validated token doesn't contain all of the identity data required for authorization or activity logging.","method":{"label":"Principal lookup method","placeholder":"Select a lookup method","help":"Principal lookup queries Kong Identity for the principal that matches the identity in a verified access token. This enables principal-aware policies and integrations. Requires all data plane nodes to be running version 3.15 or later.","kong_identity_label":"Kong Identity client","kong_identity_description":"Match principals using a token claim, defaulting to the subject (sub) claim.","custom_identity_label":"Custom claim","custom_identity_description":"Match principals using a custom JWT claim."},"custom_identity_name":{"label":"Custom identity name","help":"Enter the custom identity name used to look up the principal. Kong matches the value from the token claim to a principal with the same custom identity name and value.","placeholder":"e.g., Customer_ID"},"token_claim":{"label":"Token claim","placeholder":"e.g., user.employee_id","help":"Defaults to the subject (sub) claim, but you can specify a different token claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id).","help_custom":"The token claim whose value is matched against the Custom identity name. Defaults to the subject (sub) claim, but you can specify a different claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id)."},"error_on_miss":{"label":"If principal lookup fails","reject_label":"Reject the request","reject_description":"Treat the request as unauthenticated if Kong Identity cannot resolve the principal.","continue_label":"Continue without a principal","continue_description":"Allow the request to continue without resolving a principal."},"match_consumer":{"label":"Use linked consumers","description":"Use the consumer linked to the authenticated principal so existing consumer-based plugins and policies continue to work.","link":"Learn how to link a consumer."},"match_consumer_groups":{"label":"Use linked consumer groups","description":"Use consumer groups linked to the authenticated principal so existing consumer group policies and plugins continue to work. Consumer groups can be linked through principal metadata.","link":"Learn how to link a consumer group."}},"advanced_fields":{"client_jwk_link_label":"Client JWK","verify_signature_description":"JSON Web Keys are automatically fetched from the issuer's well-known endpoint. Enter a JWKS URI below to override this."}},"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":{"unavailable_kong_manager":"The Entitlement Enforcement plugin can't be configured in Kong Manager yet.","sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Entitlement Enforcement plugin subject, feature, and connection settings."},"governance":{"title":"Entitlement Enforcement settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to enforce (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the entitlement access endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to enforce (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 enforce access","help":"Feature that will control access to the scope where the plugin is applied.","create_feature":"+ Create new feature","unavailable":"You don't have access to metering features. Enable Metering & Billing in your Konnect organization to configure the feature to enforce.","load_error":"Could not load features from the entitlement enforcement service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing entitlement access. For self-hosted OpenMeter, use the entitlement 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":"Customers must have a positive credit balance to access 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":"If the plugin fails, customers can still access this feature.","block_label":"Block access","block_description":"If the plugin fails, customers cannot access this 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"},"advanced_configuration":{"title":"Advanced configuration","show_label":"Show advanced configuration","hide_label":"Hide advanced configuration"},"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}"}}`), Ua = { 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" } } }, Na = { plugin: "plugin" }, Ba = { 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" } }, za = { 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" }, descriptions: { fixed: "Each request counts against one static time bucket, and only that bucket's counter.", sliding: "Each request counts against a rolling window, weighted by the rate of the window before it." } }, 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", custom: "Custom", add_limit: "Add limit", remove_limit: "Remove limit {index}", expression_placeholder: "Define an expression for the limit. eg: ‘principal.metadata.limit * 2’" }, 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.
|
|
2315
2548
|
If the limit is exceeded and the user receives a 429 error, each additional request within the sliding window (hour)
|
|
2316
|
-
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } } },
|
|
2317
|
-
actions:
|
|
2318
|
-
view_configuration:
|
|
2549
|
+
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } }, custom_key: { expression_placeholder: "e.g. principal.metadata.ff_id ? principal.metadata.ff_id : principal.id", expression_help: { text: "Define a Kong plug-in dynamic expression to determine the counter key for each request. The expression must return a string. {link}", learn: "Learn more" } } }, Ha = { 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: { text: "Only Lua based schemas are supported by Konnect. Other plugin modules can be in any language as desired. {link}", link: "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}." } }, Wa = {
|
|
2550
|
+
actions: Ma,
|
|
2551
|
+
view_configuration: Ra,
|
|
2319
2552
|
delete: { title: "Delete a plugin", custom_title: "Delete {name}", custom_plugin: "Custom plugin", description: "This action cannot be reversed.", description_custom: "Please ensure this plugin is not in use. This action cannot be reversed.", plugin_schema_in_use_title: "Unable to delete custom plugin", plugin_schema_in_use_message: "This custom plugin is currently in use in this control plane. Please delete any existing instances before removing this schema.", confirmModalText1: "Are you sure you want to delete", confirmModalText2: "Please ensure this plugin is not in use. This delete action cannot be reversed.", confirm_text: "Type {name} to confirm your action", success_message: "Successfully deleted custom plugin {name}" },
|
|
2320
|
-
copy:
|
|
2321
|
-
errors:
|
|
2322
|
-
search:
|
|
2323
|
-
labels:
|
|
2324
|
-
onboarding:
|
|
2325
|
-
plugins:
|
|
2326
|
-
redis:
|
|
2327
|
-
glossary:
|
|
2328
|
-
custom_field:
|
|
2329
|
-
sp:
|
|
2330
|
-
custom_plugin_form:
|
|
2553
|
+
copy: Va,
|
|
2554
|
+
errors: $a,
|
|
2555
|
+
search: ja,
|
|
2556
|
+
labels: Oa,
|
|
2557
|
+
onboarding: Da,
|
|
2558
|
+
plugins: Fa,
|
|
2559
|
+
redis: Ua,
|
|
2560
|
+
glossary: Na,
|
|
2561
|
+
custom_field: Ba,
|
|
2562
|
+
sp: za,
|
|
2563
|
+
custom_plugin_form: Ha
|
|
2331
2564
|
};
|
|
2332
|
-
function
|
|
2333
|
-
const e =
|
|
2565
|
+
function Ja() {
|
|
2566
|
+
const e = pt("en-us", Wa);
|
|
2334
2567
|
return {
|
|
2335
2568
|
i18n: e,
|
|
2336
|
-
i18nT:
|
|
2569
|
+
i18nT: mt(e)
|
|
2337
2570
|
// Translation component <i18n-t>
|
|
2338
2571
|
};
|
|
2339
2572
|
}
|
|
2340
|
-
const
|
|
2573
|
+
const Ga = ["data-testid"], Ya = /* @__PURE__ */ z({
|
|
2341
2574
|
__name: "SwitchField",
|
|
2342
2575
|
props: {
|
|
2343
2576
|
labelAttributes: {},
|
|
@@ -2348,78 +2581,87 @@ const Ln = ["data-testid"], qn = /* @__PURE__ */ z({
|
|
|
2348
2581
|
},
|
|
2349
2582
|
emits: ["update:modelValue"],
|
|
2350
2583
|
setup(e, { emit: r }) {
|
|
2351
|
-
const { i18n: { t } } =
|
|
2584
|
+
const { i18n: { t } } = Ja(), a = pe(e, ["name", "enabledText", "disabledText"]), { value: s, hide: n, emptyOrDefaultValue: u, ...l } = ne(O(() => e.name)), f = r, i = (h) => {
|
|
2352
2585
|
s.value = h, f("update:modelValue", h);
|
|
2353
|
-
}, c =
|
|
2354
|
-
return (h,
|
|
2355
|
-
const
|
|
2356
|
-
return l.error ? (
|
|
2586
|
+
}, c = le(l.path, a);
|
|
2587
|
+
return (h, p) => {
|
|
2588
|
+
const m = N("KAlert");
|
|
2589
|
+
return l.error ? (A(), q(m, {
|
|
2357
2590
|
key: 0,
|
|
2358
2591
|
appearance: "danger",
|
|
2359
2592
|
message: l.error.message
|
|
2360
|
-
}, null, 8, ["message"])) : X((
|
|
2593
|
+
}, null, 8, ["message"])) : X((A(), $("div", {
|
|
2361
2594
|
key: 1,
|
|
2362
2595
|
class: "ff-switch-field",
|
|
2363
2596
|
"data-testid": `ff-${l.path.value}`
|
|
2364
2597
|
}, [
|
|
2365
|
-
|
|
2366
|
-
"model-value": !!(o(s) == null ? o(
|
|
2598
|
+
V(o(zt), G(o(c), {
|
|
2599
|
+
"model-value": !!(o(s) == null ? o(u) : o(s)),
|
|
2367
2600
|
"onUpdate:modelValue": i
|
|
2368
2601
|
}), {
|
|
2369
|
-
label:
|
|
2370
|
-
|
|
2602
|
+
label: L(() => [
|
|
2603
|
+
ue(re(o(s) ? e.enabledText || o(t)("actions.enabled") : e.disabledText || o(t)("actions.disabled")), 1)
|
|
2371
2604
|
]),
|
|
2372
2605
|
_: 1
|
|
2373
2606
|
}, 16, ["model-value"])
|
|
2374
|
-
], 8,
|
|
2375
|
-
[Q, !o(
|
|
2607
|
+
], 8, Ga)), [
|
|
2608
|
+
[Q, !o(n)]
|
|
2376
2609
|
]);
|
|
2377
2610
|
};
|
|
2378
2611
|
}
|
|
2379
|
-
}),
|
|
2612
|
+
}), mi = /* @__PURE__ */ Y(Ya, [["__scopeId", "data-v-0b4c3942"]]);
|
|
2380
2613
|
export {
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2614
|
+
Gn as ArrayField,
|
|
2615
|
+
jn as BooleanField,
|
|
2616
|
+
Ve as EXPRESSIONS_FIELD,
|
|
2617
|
+
je as EXPRESSION_ARRAY_EMPTY,
|
|
2618
|
+
Ie as EnumField,
|
|
2619
|
+
Rn as ExpressionEditor,
|
|
2620
|
+
Ka as ExpressionField,
|
|
2621
|
+
it as FIELD_PATH_KEY,
|
|
2622
|
+
xe as FIELD_RENDERERS,
|
|
2623
|
+
ze as FIELD_RENDERER_SLOTS,
|
|
2624
|
+
ot as FIELD_RESET_LABEL_PATH_SETTING,
|
|
2625
|
+
be as Field,
|
|
2626
|
+
pi as FieldRenderer,
|
|
2627
|
+
wa as ForeignField,
|
|
2628
|
+
di as Form,
|
|
2629
|
+
ba as JsonField,
|
|
2630
|
+
Pa as MapField,
|
|
2631
|
+
ma as NumberField,
|
|
2632
|
+
ua as ObjectField,
|
|
2633
|
+
kt as StringArrayField,
|
|
2634
|
+
Qe as StringField,
|
|
2635
|
+
mi as SwitchField,
|
|
2636
|
+
bn as USE_SECRET_INPUT_KEY,
|
|
2637
|
+
Qt as buildAncestor,
|
|
2638
|
+
Me as buildArraySchemaMap,
|
|
2639
|
+
Re as buildMapSchemaMap,
|
|
2640
|
+
Ke as buildRecordSchemaMap,
|
|
2641
|
+
tn as buildSchemaMap,
|
|
2642
|
+
wt as defaultLabelFormatter,
|
|
2643
|
+
ln as findExpressionSourceRecord,
|
|
2644
|
+
ye as generalizePath,
|
|
2645
|
+
un as isExpressionFieldSchema,
|
|
2646
|
+
gn as provideFormShared,
|
|
2647
|
+
ui as renderRuleExactMatch,
|
|
2648
|
+
_t as replaceByDictionary,
|
|
2649
|
+
At as replaceByDictionaryInFieldName,
|
|
2650
|
+
rn as toExpressionPath,
|
|
2651
|
+
sn as toSourcePath,
|
|
2652
|
+
bt as useExpressionField,
|
|
2653
|
+
ne as useField,
|
|
2654
|
+
vt as useFieldAncestors,
|
|
2655
|
+
le as useFieldAttrs,
|
|
2656
|
+
Cn as useFieldLabel,
|
|
2657
|
+
$e as useFieldPath,
|
|
2658
|
+
vn as useFieldRenderer,
|
|
2659
|
+
_n as useFormData,
|
|
2660
|
+
ee as useFormShared,
|
|
2661
|
+
An as useItemKeys,
|
|
2662
|
+
kn as useLabelPath,
|
|
2663
|
+
Sn as useMapField,
|
|
2664
|
+
yn as useOptionalFormShared,
|
|
2665
|
+
ci as useSchemaExposer,
|
|
2666
|
+
nn as useSchemaHelpers
|
|
2425
2667
|
};
|