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