@useinsider/guido 3.1.1-beta.be402b7 → 3.1.1-beta.f1817f3
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/@types/config/schemas.js +10 -8
- package/dist/composables/useHtmlValidator.js +40 -38
- package/dist/config/compiler/unsubscribeCompilerRules.js +32 -42
- package/dist/config/i18n/en/tooltips.json.js +2 -1
- package/dist/extensions/Blocks/Recommendation/block.js +1 -1
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +1 -1
- package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +81 -79
- package/dist/extensions/Blocks/Recommendation/utils/tagName.js +6 -6
- package/dist/extensions/Blocks/Unsubscribe/settingsPanel.js +16 -17
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +324 -218
- package/dist/package.json.js +1 -1
- package/dist/src/@types/config/schemas.d.ts +4 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +3 -3
- package/dist/src/stores/config.d.ts +18 -0
- package/dist/static/styles/components/button.css.js +13 -7
- package/dist/static/styles/components/narrow-panel.css.js +52 -0
- package/dist/utils/templatePreparation.js +17 -28
- package/package.json +3 -3
|
@@ -61,7 +61,7 @@ const m = {
|
|
|
61
61
|
value: t()
|
|
62
62
|
})
|
|
63
63
|
)
|
|
64
|
-
}),
|
|
64
|
+
}), A = o({
|
|
65
65
|
/** Initial HTML content */
|
|
66
66
|
html: e(t(), ""),
|
|
67
67
|
/** Initial CSS content */
|
|
@@ -71,11 +71,13 @@ const m = {
|
|
|
71
71
|
c(f),
|
|
72
72
|
[]
|
|
73
73
|
),
|
|
74
|
+
/** Valid custom field attribute names from the partner's categorized fields */
|
|
75
|
+
customFieldAttributes: e(c(t()), []),
|
|
74
76
|
/** Selected unsubscribe page IDs */
|
|
75
77
|
selectedUnsubscribePages: e(c(p()), []),
|
|
76
78
|
/** Force recreate template in Stripo storage (use true when updating externally modified templates) */
|
|
77
79
|
forceRecreate: e(a(), !1)
|
|
78
|
-
}),
|
|
80
|
+
}), R = o({
|
|
79
81
|
/** Sender display name */
|
|
80
82
|
senderName: e(t(), ""),
|
|
81
83
|
/** Email subject line */
|
|
@@ -88,7 +90,7 @@ const m = {
|
|
|
88
90
|
/** Migration date for template compatibility */
|
|
89
91
|
migrationDate: e(p(), 1759696858),
|
|
90
92
|
/** Email header settings */
|
|
91
|
-
emailHeader: e(
|
|
93
|
+
emailHeader: e(R, { senderName: "", subject: "" }),
|
|
92
94
|
/** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
|
|
93
95
|
savedModulesFolderName: e(t(), b.SAVED_MODULES),
|
|
94
96
|
/** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
|
|
@@ -205,7 +207,7 @@ const m = {
|
|
|
205
207
|
"externalValidation must be a function"
|
|
206
208
|
)
|
|
207
209
|
)
|
|
208
|
-
}),
|
|
210
|
+
}), F = o({
|
|
209
211
|
// Required sections
|
|
210
212
|
/** Identity configuration (required) */
|
|
211
213
|
identity: h,
|
|
@@ -213,7 +215,7 @@ const m = {
|
|
|
213
215
|
partner: y,
|
|
214
216
|
// Optional sections (with defaults)
|
|
215
217
|
/** Template content and presets */
|
|
216
|
-
template: e(
|
|
218
|
+
template: e(A, {}),
|
|
217
219
|
/** Editor settings */
|
|
218
220
|
editor: e(C, {}),
|
|
219
221
|
/** UI configuration */
|
|
@@ -237,9 +239,9 @@ export {
|
|
|
237
239
|
E as DefaultBlockTypeSchema,
|
|
238
240
|
f as DynamicContentSchema,
|
|
239
241
|
C as EditorSchema,
|
|
240
|
-
|
|
242
|
+
R as EmailHeaderSchema,
|
|
241
243
|
I as FeaturesSchema,
|
|
242
|
-
|
|
244
|
+
F as GuidoConfigSchema,
|
|
243
245
|
h as IdentitySchema,
|
|
244
246
|
m as MessageType,
|
|
245
247
|
y as PartnerSchema,
|
|
@@ -247,6 +249,6 @@ export {
|
|
|
247
249
|
M as RegexRuleSchema,
|
|
248
250
|
N as RemoveRuleSchema,
|
|
249
251
|
L as ReplaceRuleSchema,
|
|
250
|
-
|
|
252
|
+
A as TemplateSchema,
|
|
251
253
|
T as UISchema
|
|
252
254
|
};
|
|
@@ -9,76 +9,76 @@ import { useHttp as j } from "./useHttp.js";
|
|
|
9
9
|
import { useToaster as q } from "./useToaster.js";
|
|
10
10
|
import { useTranslations as z } from "./useTranslations.js";
|
|
11
11
|
const K = /recommendation-id="(\d+)"/g;
|
|
12
|
-
function U(
|
|
13
|
-
return [...
|
|
12
|
+
function U(a) {
|
|
13
|
+
return [...a.matchAll(K)].map((u) => u[1]);
|
|
14
14
|
}
|
|
15
|
-
function Y(
|
|
16
|
-
return u.some((d) =>
|
|
15
|
+
function Y(a, u) {
|
|
16
|
+
return u.some((d) => a.startsWith(`${d}_`));
|
|
17
17
|
}
|
|
18
18
|
const ce = () => {
|
|
19
19
|
var y, h;
|
|
20
|
-
const { showToaster:
|
|
20
|
+
const { showToaster: a } = q(), { post: u } = j(), { config: d } = L(), r = z(), g = $(), p = ((h = (y = d.value) == null ? void 0 : y.partner) == null ? void 0 : h.messageType) === V.transactional, b = async (e) => {
|
|
21
21
|
const t = await u(
|
|
22
22
|
"/newsletter/template-library/check-template-html-body",
|
|
23
23
|
{ html: X(e) }
|
|
24
24
|
), { status: n, message: l } = t.data;
|
|
25
|
-
return n ||
|
|
25
|
+
return n || a({
|
|
26
26
|
type: c.Alert,
|
|
27
27
|
message: n === void 0 ? l : r("newsletter.invalid-url-link-for-toaster")
|
|
28
|
-
}), r(P), l === r(G) &&
|
|
28
|
+
}), r(P), l === r(G) && a({
|
|
29
29
|
type: c.Alert,
|
|
30
30
|
message: r("newsletter.already-in-progress")
|
|
31
31
|
}), n;
|
|
32
|
-
},
|
|
32
|
+
}, w = (e) => !["if", "endif", "else", "elif", "now"].includes(e.toLowerCase()), S = (e) => ["if", "endif"].includes(e.toLowerCase()), E = (e, s) => {
|
|
33
33
|
const t = e.match(/({%(.*?)%})/g);
|
|
34
34
|
let n = !0;
|
|
35
35
|
return t !== null && !p && t.forEach((l) => {
|
|
36
36
|
const o = l.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
|
|
37
37
|
if (o && o.length > 0) {
|
|
38
|
-
const [
|
|
39
|
-
|
|
38
|
+
const [i] = o;
|
|
39
|
+
w(i) && !s.includes(i) && (a({
|
|
40
40
|
type: c.Warning,
|
|
41
41
|
message: r("custom-fields.invalid-custom-fields")
|
|
42
42
|
}), n = !1);
|
|
43
43
|
}
|
|
44
44
|
}), n;
|
|
45
45
|
}, A = async (e, s, t) => {
|
|
46
|
-
const n = t ? await
|
|
46
|
+
const n = t ? await b(e) : !0;
|
|
47
47
|
return E(e, s) && n;
|
|
48
|
-
}, I = (e) => e.length > 0 ? !0 : (
|
|
48
|
+
}, I = (e) => e.length > 0 ? !0 : (a({
|
|
49
49
|
type: c.Warning,
|
|
50
50
|
message: r("newsletter.html-content-is-empty")
|
|
51
51
|
}), !1), k = (e) => {
|
|
52
52
|
const s = (e.match(/{/gm) || []).length, t = (e.match(/}/gm) || []).length;
|
|
53
|
-
return s > t &&
|
|
53
|
+
return s > t && a({
|
|
54
54
|
type: c.Warning,
|
|
55
55
|
message: r("custom-fields.missing-closing-braces")
|
|
56
|
-
}), s < t &&
|
|
56
|
+
}), s < t && a({
|
|
57
57
|
type: c.Warning,
|
|
58
58
|
message: r("custom-fields.missing-opening-braces")
|
|
59
59
|
}), s === t;
|
|
60
60
|
}, x = (e) => {
|
|
61
61
|
const s = e.match(/{{\s*(\w+\s+((\w+\|\w+)|(\w+)))\s*}}/gm) === null;
|
|
62
|
-
return s ||
|
|
62
|
+
return s || a({
|
|
63
63
|
type: c.Warning,
|
|
64
64
|
message: r("custom-fields.invalid-custom-fields")
|
|
65
65
|
}), s;
|
|
66
66
|
}, T = (e, s) => {
|
|
67
67
|
const t = e.match(/{{([a-zA-Z0-9_\s]*)}}/gm);
|
|
68
68
|
if (t && !p) {
|
|
69
|
-
const n = new Set(s.map((
|
|
70
|
-
if (t.forEach((
|
|
71
|
-
const m =
|
|
69
|
+
const n = new Set(s.map((i) => i.toLowerCase())), l = U(e), o = [];
|
|
70
|
+
if (t.forEach((i) => {
|
|
71
|
+
const m = i.slice(2, -2).trim().toLowerCase();
|
|
72
72
|
(!n.has(m) || m === "") && !Y(m, l) && o.push(m);
|
|
73
73
|
}), o.length > 0) {
|
|
74
|
-
const
|
|
74
|
+
const i = `
|
|
75
75
|
<ul>
|
|
76
76
|
${o.map((m) => `<li>${m}</li>`).join("")}
|
|
77
77
|
</ul>
|
|
78
78
|
`;
|
|
79
|
-
return
|
|
79
|
+
return a({
|
|
80
80
|
type: c.Alert,
|
|
81
|
-
message: r("custom-fields.invalid-custom-fields") +
|
|
81
|
+
message: r("custom-fields.invalid-custom-fields") + i
|
|
82
82
|
}), !1;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -87,12 +87,12 @@ const ce = () => {
|
|
|
87
87
|
const s = e.match(/{%(.*?)%}/g), t = [];
|
|
88
88
|
let n = !0;
|
|
89
89
|
if (s && s.forEach((l) => {
|
|
90
|
-
const o = l.match(_),
|
|
91
|
-
(!o || l !== m) && !
|
|
90
|
+
const o = l.match(_), i = l.match(H), m = (o == null ? void 0 : o.join("")) || "";
|
|
91
|
+
(!o || l !== m) && !i && (a({
|
|
92
92
|
type: c.Alert,
|
|
93
93
|
message: r("newsletter.display-conditions-invalid-syntax")
|
|
94
94
|
}), n = !1), o && o.forEach((f) => {
|
|
95
|
-
f.trim() === "=" && (
|
|
95
|
+
f.trim() === "=" && (a({
|
|
96
96
|
type: c.Alert,
|
|
97
97
|
message: r("custom-conditions.wrong-equality-operators")
|
|
98
98
|
}), n = !1);
|
|
@@ -102,8 +102,8 @@ const ce = () => {
|
|
|
102
102
|
});
|
|
103
103
|
});
|
|
104
104
|
}), t.length) {
|
|
105
|
-
const l = t.filter((
|
|
106
|
-
l.length !== o.length && (
|
|
105
|
+
const l = t.filter((i) => i === "if"), o = t.filter((i) => i === "endif");
|
|
106
|
+
l.length !== o.length && (a({
|
|
107
107
|
type: c.Alert,
|
|
108
108
|
message: r("custom-conditions.missing-if-endif-tag")
|
|
109
109
|
}), n = !1);
|
|
@@ -111,45 +111,47 @@ const ce = () => {
|
|
|
111
111
|
return n;
|
|
112
112
|
}, W = (e) => {
|
|
113
113
|
const s = (e.match(/{% /gm) || []).length, t = (e.match(/ %}/gm) || []).length, n = s === t;
|
|
114
|
-
return n ||
|
|
114
|
+
return n || a({
|
|
115
115
|
type: c.Warning,
|
|
116
116
|
message: r("custom-conditions.no-space-after-braces")
|
|
117
117
|
}), n;
|
|
118
|
-
}, N = (e) => (e.match(/({%(.*?)%})/g) || []).filter((t) => t.includes("if")).map((t) => (t.match(/{{.*}}/gm) || []).length).reduce((t, n) => t + n, 0) > 0 ? (
|
|
118
|
+
}, N = (e) => (e.match(/({%(.*?)%})/g) || []).filter((t) => t.includes("if")).map((t) => (t.match(/{{.*}}/gm) || []).length).reduce((t, n) => t + n, 0) > 0 ? (a({
|
|
119
119
|
type: c.Warning,
|
|
120
120
|
message: r("custom-conditions.no-braces-inside-if-tag")
|
|
121
|
-
}), !1) : !0, O = () => g.recommendationConfigs && Object.values(g.recommendationConfigs).find((s) => s.filters.find((t) => t.value === "")) !== void 0 ? (
|
|
121
|
+
}), !1) : !0, O = () => g.recommendationConfigs && Object.values(g.recommendationConfigs).find((s) => s.filters.find((t) => t.value === "")) !== void 0 ? (a({
|
|
122
122
|
type: c.Alert,
|
|
123
123
|
message: r("newsletter.fill-all-necessary-fields")
|
|
124
124
|
}), !1) : !0, B = (e) => {
|
|
125
125
|
const s = /src="[^"]*\.(svg|pst)"/gm;
|
|
126
|
-
return e.match(s) === null ? !0 : (
|
|
126
|
+
return e.match(s) === null ? !0 : (a({
|
|
127
127
|
type: c.Alert,
|
|
128
128
|
message: r("newsletter.invalid-image-type")
|
|
129
129
|
}), !1);
|
|
130
130
|
}, R = (e) => {
|
|
131
131
|
const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
|
|
132
132
|
return Array.from(n).find((o) => {
|
|
133
|
-
var
|
|
134
|
-
return !((
|
|
135
|
-
}) ? (
|
|
133
|
+
var i;
|
|
134
|
+
return !((i = o.id) != null && i.trim());
|
|
135
|
+
}) ? (a({
|
|
136
136
|
type: c.Alert,
|
|
137
137
|
message: r("unsubscribe-templates.select-checkbox-groups")
|
|
138
138
|
}), !1) : !0;
|
|
139
139
|
}, D = (e) => {
|
|
140
140
|
const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
|
|
141
141
|
return Array.from(n).find((o) => {
|
|
142
|
-
var
|
|
143
|
-
return !((
|
|
144
|
-
}) ? (
|
|
142
|
+
var i;
|
|
143
|
+
return !((i = o.id) != null && i.trim());
|
|
144
|
+
}) ? (a({
|
|
145
145
|
type: c.Alert,
|
|
146
146
|
message: r("unsubscribe-templates.select-radio-button-groups")
|
|
147
147
|
}), !1) : !0;
|
|
148
148
|
};
|
|
149
149
|
return { validateHtml: async (e, s, t = !1) => {
|
|
150
|
+
var o, i;
|
|
150
151
|
const n = [
|
|
151
|
-
...s.map((
|
|
152
|
-
...M
|
|
152
|
+
...s.map((m) => m.value),
|
|
153
|
+
...M,
|
|
154
|
+
...((i = (o = d.value) == null ? void 0 : o.template) == null ? void 0 : i.customFieldAttributes) ?? []
|
|
153
155
|
];
|
|
154
156
|
return await A(e, n, t) && I(e) && k(e) && x(e) && T(e, n) && F(e) && W(e) && N(e) && O() && B(e) && R(e) && D(e);
|
|
155
157
|
} };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { usePartner as
|
|
2
|
-
import { LINK_REGEXES as p, LINK_TYPES as
|
|
3
|
-
import { parsePageList as
|
|
1
|
+
import { usePartner as y } from "../../composables/usePartner.js";
|
|
2
|
+
import { LINK_REGEXES as p, LINK_TYPES as S, INSIDER_ID as m, URLS as R } from "../../enums/unsubscribe.js";
|
|
3
|
+
import { parsePageList as I } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
|
|
4
4
|
import { useConfigStore as N } from "../../stores/config.js";
|
|
5
5
|
import { useDynamicContentStore as U } from "../../stores/dynamic-content.js";
|
|
6
6
|
import { useUnsubscribeStore as C } from "../../stores/unsubscribe.js";
|
|
@@ -9,43 +9,33 @@ const G = [
|
|
|
9
9
|
id: "add-unsubscribe-link-values",
|
|
10
10
|
description: "Adding unsubscribe link values",
|
|
11
11
|
type: "custom",
|
|
12
|
-
processor: (
|
|
13
|
-
const { getPartnerName:
|
|
14
|
-
if (
|
|
15
|
-
return
|
|
16
|
-
let e =
|
|
17
|
-
const
|
|
18
|
-
console.debug("[SD-136953][compiler] blocks found:", d.length);
|
|
12
|
+
processor: (t) => {
|
|
13
|
+
const { getPartnerName: i } = y(), o = N(), s = U(), d = C(), a = o.variationId;
|
|
14
|
+
if (!a)
|
|
15
|
+
return t;
|
|
16
|
+
let e = t;
|
|
17
|
+
const r = `/${i()}/email/${a}?user={{iid}}`, E = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]");
|
|
19
18
|
let c = !1, l = !1;
|
|
20
|
-
return
|
|
21
|
-
var
|
|
19
|
+
return E.forEach((f) => {
|
|
20
|
+
var b;
|
|
22
21
|
const u = f.getAttribute("data-unsubscribe-page-list");
|
|
23
22
|
if (!u)
|
|
24
23
|
return;
|
|
25
|
-
const
|
|
26
|
-
(
|
|
24
|
+
const _ = I(u), g = ((b = d.templates) == null ? void 0 : b.filter(
|
|
25
|
+
(n) => _.includes(n.id)
|
|
27
26
|
)) ?? [];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
hasPreferencesPage: l
|
|
33
|
-
});
|
|
34
|
-
}), (c || l) && (t.selectedDynamicContentList.some((u) => u.value === b) || t.selectedDynamicContentList.push({
|
|
35
|
-
text: b,
|
|
36
|
-
value: b,
|
|
27
|
+
c = c || g.some((n) => n.type === S.UNSUBSCRIBE_LINK_TYPE), l = l || g.some((n) => n.type === S.PREFERENCES_LINK_TYPE);
|
|
28
|
+
}), (c || l) && (s.selectedDynamicContentList.some((u) => u.value === m) || s.selectedDynamicContentList.push({
|
|
29
|
+
text: m,
|
|
30
|
+
value: m,
|
|
37
31
|
fallback: ""
|
|
38
32
|
})), c && (e = e.replace(
|
|
39
33
|
p.GLOBAL_UNSUBSCRIBE_LINK_REGEX,
|
|
40
|
-
|
|
34
|
+
R.UNSUBSCRIBE_URL + r
|
|
41
35
|
)), l && (e = e.replace(
|
|
42
36
|
p.PREFERENCES_UNSUBSCRIBE_LINK_REGEX,
|
|
43
|
-
|
|
44
|
-
)),
|
|
45
|
-
hasUnsubscribePage: c,
|
|
46
|
-
hasPreferencesPage: l,
|
|
47
|
-
stillHasPlaceholder: e.includes("{{ins-global-unsubscribe-link}}")
|
|
48
|
-
}), e;
|
|
37
|
+
R.PREFERENCES_URL + r
|
|
38
|
+
)), E.length && (e = e.replace(p.UNSUBSCRIBE_LINK_REGEX, "")), e;
|
|
49
39
|
},
|
|
50
40
|
priority: 60
|
|
51
41
|
},
|
|
@@ -62,27 +52,27 @@ const G = [
|
|
|
62
52
|
id: "format-comment-braces",
|
|
63
53
|
description: "Adding spaces around comment braces for proper formatting",
|
|
64
54
|
type: "custom",
|
|
65
|
-
processor: (
|
|
55
|
+
processor: (t) => t.replace(/{#/g, "{ #").replace(/#}/g, "# }"),
|
|
66
56
|
priority: 62
|
|
67
57
|
},
|
|
68
58
|
{
|
|
69
59
|
id: "add-universal-link-flags",
|
|
70
60
|
description: "Adding universal link flags",
|
|
71
61
|
type: "custom",
|
|
72
|
-
processor: (
|
|
73
|
-
let
|
|
74
|
-
const
|
|
75
|
-
return
|
|
76
|
-
if (
|
|
62
|
+
processor: (t) => {
|
|
63
|
+
let i = t;
|
|
64
|
+
const o = i.match(/<a[^>]+>(.*?)<\/a>/gm);
|
|
65
|
+
return o && o.forEach((s) => {
|
|
66
|
+
if (s.includes("insEmail=1"))
|
|
77
67
|
return;
|
|
78
|
-
if (
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
return e.includes("?") || e.includes("#") ?
|
|
68
|
+
if (s.match(/<a\s+(?:[^>]*?\s+)?href=(["'`”])(.*?)\1\s+(?:[^>]*?\s+)?universal=(["'`”])true\3/gm)) {
|
|
69
|
+
const a = s.replace(/href=(["'`”])(.*?)\1/gm, (e) => {
|
|
70
|
+
const r = e.slice(6, e.length - 1).trim();
|
|
71
|
+
return e.includes("?") || e.includes("#") ? r.slice(-1) === "&" ? e.replace(r, `${r}insEmail=1`) : e.replace(r, `${r}&insEmail=1`) : e.replace(r, `${r}?insEmail=1`);
|
|
82
72
|
});
|
|
83
|
-
|
|
73
|
+
i = i.replace(s, a);
|
|
84
74
|
}
|
|
85
|
-
}),
|
|
75
|
+
}), i;
|
|
86
76
|
},
|
|
87
77
|
priority: 63
|
|
88
78
|
}
|
|
@@ -75,7 +75,8 @@ const e = {
|
|
|
75
75
|
"The image with the invalid link cannot be saved to the image gallery": "Enter a valid image link to continue.",
|
|
76
76
|
"The data source link is unavailable. Please, make sure there is an access to the data source.": "Enter an accessible Data Source Link to contiue.",
|
|
77
77
|
"The file should not exceed the maximum resolution of {maxImageResolution}px.": "Upload files up to 1024x512 pixels to continue.",
|
|
78
|
-
"The option is disabled because was overridden in the Code editor": "The option is disabled because it was overridden in the Code Editor."
|
|
78
|
+
"The option is disabled because was overridden in the Code editor": "The option is disabled because it was overridden in the Code Editor.",
|
|
79
|
+
"Dropdown with a list of available data services, preliminarily created in the Data section → Services tab of the Account.": "Service for Data Collection lets you enter a form submission URL for the recipients to submit."
|
|
79
80
|
};
|
|
80
81
|
export {
|
|
81
82
|
e as default
|
|
@@ -169,7 +169,7 @@ class q extends b {
|
|
|
169
169
|
if (e && e.includes(a))
|
|
170
170
|
return t;
|
|
171
171
|
}
|
|
172
|
-
return "querySelector" in t ? t.querySelector(`.${a}`) : null;
|
|
172
|
+
return "querySelector" in t ? t.querySelector(`.${a}`) ?? null : null;
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
175
|
* Migrate configuration from legacy format
|