@useinsider/guido 3.27.0-beta.0dd857f → 3.27.0-beta.ad1c5f2
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 +3 -3
- package/dist/composables/useSave.js +17 -19
- package/dist/composables/useSaveValidation.js +252 -134
- package/dist/composables/useTranslations.js +9 -14
- package/dist/enums/save-validation.js +2 -2
- package/dist/node_modules/valibot/dist/index.js +154 -232
- package/dist/package.json.js +1 -1
- package/dist/src/composables/useSaveValidation.d.ts +2 -2
- package/dist/src/enums/save-validation.d.ts +15 -3
- package/dist/static/stripo-runtime-manifest.json.js +2 -2
- package/package.json +2 -2
- package/dist/@types/email-be/html-validation.js +0 -28
- package/dist/enums/email-be.js +0 -27
- package/dist/services/emailBe/errors/ApiError.js +0 -50
- package/dist/services/emailBe/errors/handleApiError.js +0 -31
- package/dist/services/emailBe/errors/toApiError.js +0 -71
- package/dist/services/emailBe/html/HtmlValidationService.js +0 -35
- package/dist/services/emailBe/html/index.js +0 -6
- package/dist/services/emailBe/http/HttpManager.js +0 -68
- package/dist/services/emailBe/http/RetryStack.js +0 -24
- package/dist/services/emailBe/http/client.js +0 -61
- package/dist/services/emailBe/http/index.js +0 -10
- package/dist/services/emailBe/http/transportErrors.js +0 -20
- package/dist/src/@types/email-be/html-validation.d.ts +0 -51
- package/dist/src/enums/email-be.d.ts +0 -26
- package/dist/src/services/emailBe/errors/ApiError.d.ts +0 -40
- package/dist/src/services/emailBe/errors/handleApiError.d.ts +0 -11
- package/dist/src/services/emailBe/errors/toApiError.d.ts +0 -2
- package/dist/src/services/emailBe/html/HtmlValidationService.d.ts +0 -8
- package/dist/src/services/emailBe/html/index.d.ts +0 -2
- package/dist/src/services/emailBe/http/HttpManager.d.ts +0 -13
- package/dist/src/services/emailBe/http/RetryStack.d.ts +0 -6
- package/dist/src/services/emailBe/http/client.d.ts +0 -3
- package/dist/src/services/emailBe/http/index.d.ts +0 -2
- package/dist/src/services/emailBe/http/transportErrors.d.ts +0 -15
- package/dist/src/services/emailBe/http/types.d.ts +0 -46
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModuleFolderDefaults as y } from "../../enums/defaults.js";
|
|
2
|
-
import { object as o, number as c, optional as e, string as t, picklist as m, pipe as r, minLength as p, custom as k, boolean as a, array as n, transform as S, unknown as i, record as g, fallback as R, literal as u,
|
|
2
|
+
import { object as o, number as c, optional as e, string as t, picklist as m, pipe as r, minLength as p, custom as k, boolean as a, array as n, transform as S, unknown as i, record as g, fallback as R, literal as u, looseObject as C, variant as T, union as h, lazy as I } from "../../node_modules/valibot/dist/index.js";
|
|
3
3
|
const b = {
|
|
4
4
|
/** Promotional/marketing emails */
|
|
5
5
|
PROMOTIONAL: 1,
|
|
@@ -76,7 +76,7 @@ const b = {
|
|
|
76
76
|
value: t()
|
|
77
77
|
})
|
|
78
78
|
)
|
|
79
|
-
}), f =
|
|
79
|
+
}), f = I(() => C({
|
|
80
80
|
text: e(t()),
|
|
81
81
|
// eslint-disable-next-line camelcase -- backend field name
|
|
82
82
|
tag_text: e(t()),
|
|
@@ -324,7 +324,7 @@ const b = {
|
|
|
324
324
|
(s) => typeof s == "function",
|
|
325
325
|
"processor must be a function"
|
|
326
326
|
)
|
|
327
|
-
}), V =
|
|
327
|
+
}), V = T("type", [
|
|
328
328
|
H,
|
|
329
329
|
_,
|
|
330
330
|
q,
|
|
@@ -16,40 +16,40 @@ import { useHtmlValidator as tt } from "./useHtmlValidator.js";
|
|
|
16
16
|
import { useToaster as et } from "./useToaster.js";
|
|
17
17
|
import { useCouponBlockValidator as ot } from "./validators/useCouponBlockValidator.js";
|
|
18
18
|
import { useHtmlDocumentCountValidator as it } from "./validators/useHtmlDocumentCountValidator.js";
|
|
19
|
-
import { useLiquidValidator as
|
|
20
|
-
import { useSyncModuleBlockValidator as
|
|
19
|
+
import { useLiquidValidator as st } from "./validators/useLiquidValidator.js";
|
|
20
|
+
import { useSyncModuleBlockValidator as rt } from "./validators/useSyncModuleBlockValidator.js";
|
|
21
21
|
import { useUnsubscribeBlockValidator as at } from "./validators/useUnsubscribeBlockValidator.js";
|
|
22
22
|
const Pt = () => {
|
|
23
|
-
const n = I(), S = N(), { validateHtml: y } = tt(), { validateLiquidSyntax: b } =
|
|
23
|
+
const n = I(), S = N(), { validateHtml: y } = tt(), { validateLiquidSyntax: b } = st(), { validateCouponBlockTags: H } = ot(), {
|
|
24
24
|
validateUnsubscribeBlockUniqueness: E,
|
|
25
25
|
validateUnsubscribeBlockHasTemplate: g,
|
|
26
26
|
validateNoInsiderUnsubscribeCode: V
|
|
27
|
-
} = at(), { validateSyncModuleBlocks: l } =
|
|
27
|
+
} = at(), { validateSyncModuleBlocks: l } = rt(), { validateSingleHtmlDocument: c } = it(), { callbacks: a, isFeatureEnabled: u } = D(), { extractSyncModuleData: x } = G(), { setSyncModuleUnsubscriptionPages: k } = K(), { editorSave: C, getTemplateData: m } = O(), { showToaster: h } = et(), { getBlockedDomains: B, resolveToast: T } = $(), { prepareTemplateDetails: p } = Z(), { collectSaveValidationErrors: L } = j(), { isEnabled: P } = z(), U = Y(), A = X(), w = Q(), { runExclusive: d } = F(), f = async (t, e, i) => {
|
|
28
28
|
if (!u("allowlistEnabled"))
|
|
29
29
|
return !1;
|
|
30
30
|
const o = await B(t, e);
|
|
31
31
|
if (!o.length)
|
|
32
32
|
return !1;
|
|
33
33
|
if (!i) {
|
|
34
|
-
const
|
|
35
|
-
|
|
34
|
+
const s = await T(o);
|
|
35
|
+
s != null && s.message && h({
|
|
36
36
|
type: J.Warning,
|
|
37
|
-
message:
|
|
38
|
-
actionButton:
|
|
37
|
+
message: s.message,
|
|
38
|
+
actionButton: s.actionButton
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
return !0;
|
|
42
42
|
}, M = async (t, e) => !H(t.compiledHtml) || u("blockUnsubscribeLinks") && !V(t.rawHtml, e) || !E(t.compiledHtml) || !g(t.compiledHtml) ? !1 : u("liquidSyntax") ? b(t.compiledHtml) : y(t.compiledHtml, t.dynamicContentList, !0), v = async (t, e) => {
|
|
43
43
|
if (!await C())
|
|
44
44
|
return;
|
|
45
|
-
const { unsubscribePayload: o, stripoModules:
|
|
46
|
-
if (await k(o), t.modules =
|
|
47
|
-
const
|
|
48
|
-
S({ ...t, ...
|
|
45
|
+
const { unsubscribePayload: o, stripoModules: s } = x(t.rawHtml);
|
|
46
|
+
if (await k(o), t.modules = s, !e.suppress) {
|
|
47
|
+
const r = e.blankCompiled ? { compiledHtml: "", ampHtml: "" } : {};
|
|
48
|
+
S({ ...t, ...r, silent: e.silent });
|
|
49
49
|
}
|
|
50
50
|
return t;
|
|
51
51
|
}, W = async (t, e) => {
|
|
52
|
-
var
|
|
52
|
+
var s;
|
|
53
53
|
n();
|
|
54
54
|
const i = await m();
|
|
55
55
|
if (!c(i.html, e))
|
|
@@ -57,20 +57,18 @@ const Pt = () => {
|
|
|
57
57
|
const o = await p(i);
|
|
58
58
|
if (l(o.rawHtml, e)) {
|
|
59
59
|
if (P.value && !e) {
|
|
60
|
-
const
|
|
60
|
+
const r = await L(
|
|
61
61
|
o.compiledHtml,
|
|
62
62
|
o.dynamicContentList,
|
|
63
63
|
o.rawHtml
|
|
64
64
|
);
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
if (s.length) {
|
|
68
|
-
U.open(s, "save");
|
|
65
|
+
if (r.length) {
|
|
66
|
+
U.open(r, "save");
|
|
69
67
|
return;
|
|
70
68
|
}
|
|
71
69
|
} else if (!await M(o, e))
|
|
72
70
|
return;
|
|
73
|
-
if (!((
|
|
71
|
+
if (!((s = a.value) != null && s.externalValidation && !await a.value.externalValidation(o)) && !await f(o.compiledHtml, o.css, e))
|
|
74
72
|
return v(o, { silent: e, suppress: t });
|
|
75
73
|
}
|
|
76
74
|
}, R = async () => {
|
|
@@ -1,171 +1,289 @@
|
|
|
1
|
-
import { getIgnoredRecommendationBlockIds as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { useTranslations as
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
import { getIgnoredRecommendationBlockIds as Y } from "../config/compiler/utils/recommendationIgnoreUtils.js";
|
|
2
|
+
import { CanNotMakeAnyChangesForRunningKey as k, DISPLAY_CONDITIONS_REGEX as U, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as M } from "../enums/html-validator.js";
|
|
3
|
+
import { SaveValidationRule as o } from "../enums/save-validation.js";
|
|
4
|
+
import { ToasterTypeOptions as r } from "../enums/toaster.js";
|
|
5
|
+
import { BLOCK_ROOT_SELECTOR as x } from "../extensions/Blocks/Checkbox/constants/selectors.js";
|
|
6
|
+
import { itemsBlockDynamicVariables as W } from "../extensions/Blocks/Items/enums/productEnums.js";
|
|
7
|
+
import { BLOCK_ROOT_SELECTOR as G } from "../extensions/Blocks/RadioButton/constants/selectors.js";
|
|
8
|
+
import { useRecommendationExtensionStore as P } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
9
|
+
import { getInvalidFields as q, STRATEGY_FIELD_KEY as H, RecommendationAssignStrategyKey as V, RecommendationRequiredFieldsKey as X } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
|
|
10
|
+
import { useConfigStore as j } from "../stores/config.js";
|
|
11
|
+
import { useDynamicContentStore as z } from "../stores/dynamic-content.js";
|
|
12
|
+
import { useRecommendationStore as $ } from "../stores/recommendation.js";
|
|
13
|
+
import { base64EncodeWithSpecialChars as T } from "../utils/base64.js";
|
|
14
|
+
import { escapeHtml as Q } from "../utils/htmlEscape.js";
|
|
15
|
+
import { useTemplatePreparation as Z } from "../utils/templatePreparation.js";
|
|
16
|
+
import { useActionsApi as J } from "./useActionsApi.js";
|
|
17
|
+
import { useConfig as ee } from "./useConfig.js";
|
|
18
|
+
import { useHtmlCompiler as te } from "./useHtmlCompiler.js";
|
|
19
|
+
import { buildPartnerAttributeNameSet as ne, getInvalidDynamicContentTags as ie, getRecommendationBlockIds as oe, findInvalidCustomFields as re } from "./useHtmlValidator.js";
|
|
20
|
+
import { useHttp as se } from "./useHttp.js";
|
|
21
|
+
import { useTranslations as ae } from "./useTranslations.js";
|
|
22
|
+
import { findInvalidCouponBlocks as ce, COUPON_TAG_MODIFIED_KEY as le } from "./validators/useCouponBlockValidator.js";
|
|
23
|
+
import { hasInsiderUnsubscribeCode as ue, EXTERNALLY_MANAGED_UNSUBSCRIBE_KEY as me, findDuplicateUnsubPageTypes as de, countUnsubBlocksWithoutPage as pe, EMPTY_BLOCK_KEY as ge } from "./validators/useUnsubscribeBlockValidator.js";
|
|
24
|
+
const fe = "newsletter.html-content-is-empty", ye = "custom-fields.missing-closing-braces", Ee = "custom-fields.missing-opening-braces", S = "custom-fields.invalid-custom-fields", Ie = "newsletter.display-conditions-invalid-syntax", Se = "custom-conditions.wrong-equality-operators", _e = "custom-conditions.missing-if-endif-tag", Ce = "custom-conditions.no-space-after-braces", he = "custom-conditions.no-braces-inside-if-tag", ke = "newsletter.fill-all-necessary-fields", Te = "newsletter.invalid-image-type", Fe = "unsubscribe-templates.select-checkbox-groups", be = "unsubscribe-templates.select-radio-button-groups", F = "newsletter.invalid-url-link-for-toaster", b = "journey-builder.liquid-validation-failed", Re = "/newsletter/template-library/check-template-html-body", Le = /src="[^"]*\.(svg|pst)"/gm, L = /({%(.*?)%})/g, Ne = ["if", "endif", "else", "elif", "now"], Oe = (t) => !Ne.includes(t.toLowerCase()), Ae = (t) => ["if", "endif"].includes(t.toLowerCase());
|
|
25
|
+
function De(t) {
|
|
26
|
+
return ce(t).map((i) => ({
|
|
27
|
+
rule: o.CouponTagModified,
|
|
28
|
+
type: r.Warning,
|
|
29
|
+
key: le,
|
|
30
|
+
detail: i
|
|
31
|
+
}));
|
|
26
32
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
params: t.trans.replace,
|
|
34
|
-
...n ? { detail: n } : {}
|
|
35
|
-
};
|
|
33
|
+
function ve(t) {
|
|
34
|
+
return de(t).map((i) => ({
|
|
35
|
+
rule: o.DuplicateUnsubBlock,
|
|
36
|
+
type: r.Error,
|
|
37
|
+
key: i.messageKey
|
|
38
|
+
}));
|
|
36
39
|
}
|
|
37
|
-
function
|
|
38
|
-
return
|
|
39
|
-
rule:
|
|
40
|
-
type:
|
|
41
|
-
key:
|
|
40
|
+
function Ke(t) {
|
|
41
|
+
return Array.from({ length: pe(t) }, () => ({
|
|
42
|
+
rule: o.UnsubBlockMissingTemplate,
|
|
43
|
+
type: r.Warning,
|
|
44
|
+
key: ge
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
function Be(t) {
|
|
48
|
+
return ue(t) ? [{
|
|
49
|
+
rule: o.ExternallyManagedUnsubscribe,
|
|
50
|
+
type: r.Warning,
|
|
51
|
+
key: me
|
|
42
52
|
}] : [];
|
|
43
53
|
}
|
|
44
|
-
function
|
|
45
|
-
const
|
|
46
|
-
if (!
|
|
54
|
+
function we(t, i) {
|
|
55
|
+
const n = t.match(L);
|
|
56
|
+
if (!n)
|
|
47
57
|
return [];
|
|
48
|
-
const
|
|
49
|
-
return
|
|
50
|
-
const
|
|
51
|
-
if (
|
|
52
|
-
const [
|
|
53
|
-
|
|
54
|
-
rule:
|
|
55
|
-
type:
|
|
56
|
-
key:
|
|
57
|
-
detail:
|
|
58
|
+
const u = [];
|
|
59
|
+
return n.forEach((m) => {
|
|
60
|
+
const c = m.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
|
|
61
|
+
if (c && c.length > 0) {
|
|
62
|
+
const [d] = c;
|
|
63
|
+
Oe(d) && !i.includes(d) && u.push({
|
|
64
|
+
rule: o.CustomFieldScript,
|
|
65
|
+
type: r.Warning,
|
|
66
|
+
key: S,
|
|
67
|
+
detail: d
|
|
58
68
|
});
|
|
59
69
|
}
|
|
60
|
-
}),
|
|
70
|
+
}), u;
|
|
71
|
+
}
|
|
72
|
+
function Ye(t) {
|
|
73
|
+
return t.length > 0 ? [] : [{ rule: o.EmptyHtml, type: r.Warning, key: fe }];
|
|
61
74
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
75
|
+
function Ue(t) {
|
|
76
|
+
const i = (t.match(/{/gm) || []).length, n = (t.match(/}/gm) || []).length;
|
|
77
|
+
return i > n ? [{
|
|
78
|
+
rule: o.MismatchedBraces,
|
|
79
|
+
type: r.Warning,
|
|
80
|
+
key: ye
|
|
81
|
+
}] : i < n ? [{
|
|
82
|
+
rule: o.MismatchedBraces,
|
|
83
|
+
type: r.Warning,
|
|
84
|
+
key: Ee
|
|
85
|
+
}] : [];
|
|
86
|
+
}
|
|
87
|
+
function Me(t) {
|
|
88
|
+
return ie(t).map((i) => ({
|
|
89
|
+
rule: o.InvalidDynamicTag,
|
|
90
|
+
type: r.Warning,
|
|
91
|
+
key: S,
|
|
92
|
+
detail: i
|
|
68
93
|
}));
|
|
69
94
|
}
|
|
70
|
-
function
|
|
71
|
-
const
|
|
72
|
-
return
|
|
73
|
-
rule:
|
|
74
|
-
type:
|
|
75
|
-
key:
|
|
76
|
-
detail:
|
|
95
|
+
function xe(t, i, n, u) {
|
|
96
|
+
const m = oe(t);
|
|
97
|
+
return re(t, i, m, n, u).map((c) => ({
|
|
98
|
+
rule: o.InvalidCustomField,
|
|
99
|
+
type: r.Error,
|
|
100
|
+
key: S,
|
|
101
|
+
detail: c
|
|
77
102
|
}));
|
|
78
103
|
}
|
|
79
|
-
function
|
|
80
|
-
const
|
|
81
|
-
|
|
104
|
+
function We(t) {
|
|
105
|
+
const i = t.match(/{%(.*?)%}/g), n = [], u = [];
|
|
106
|
+
if (i && i.forEach((m) => {
|
|
107
|
+
const c = m.match(U), d = m.match(M), I = (c == null ? void 0 : c.join("")) || "";
|
|
108
|
+
(!c || m !== I) && !d && u.push({
|
|
109
|
+
rule: o.ConditionsSyntax,
|
|
110
|
+
type: r.Error,
|
|
111
|
+
key: Ie,
|
|
112
|
+
detail: m
|
|
113
|
+
}), c && c.forEach((g) => {
|
|
114
|
+
g.trim() === "=" && u.push({
|
|
115
|
+
rule: o.WrongEqualityOperator,
|
|
116
|
+
type: r.Error,
|
|
117
|
+
key: Se
|
|
118
|
+
}), (g.match(/^[a-zA-Z]*$/g) ?? []).forEach((f) => {
|
|
119
|
+
Ae(f) && n.push(f);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}), n.length) {
|
|
123
|
+
const m = n.filter((d) => d === "if").length, c = n.filter((d) => d === "endif").length;
|
|
124
|
+
m !== c && u.push({
|
|
125
|
+
rule: o.MissingIfEndif,
|
|
126
|
+
type: r.Error,
|
|
127
|
+
key: _e
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return u;
|
|
82
131
|
}
|
|
83
|
-
function
|
|
84
|
-
const
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
132
|
+
function Ge(t) {
|
|
133
|
+
const i = (t.match(/{% /gm) || []).length, n = (t.match(/ %}/gm) || []).length;
|
|
134
|
+
return i === n ? [] : [{
|
|
135
|
+
rule: o.ConditionTagSpacing,
|
|
136
|
+
type: r.Warning,
|
|
137
|
+
key: Ce
|
|
138
|
+
}];
|
|
89
139
|
}
|
|
90
|
-
|
|
91
|
-
|
|
140
|
+
function Pe(t) {
|
|
141
|
+
return (t.match(L) || []).filter((n) => n.includes("if")).map((n) => (n.match(/{{.*}}/gm) || []).length).reduce((n, u) => n + u, 0) === 0 ? [] : [{
|
|
142
|
+
rule: o.BracesInsideIfTag,
|
|
143
|
+
type: r.Warning,
|
|
144
|
+
key: he
|
|
145
|
+
}];
|
|
146
|
+
}
|
|
147
|
+
function qe(t) {
|
|
148
|
+
return (t.match(Le) ?? []).map((i) => ({
|
|
149
|
+
rule: o.InvalidImageType,
|
|
150
|
+
type: r.Error,
|
|
151
|
+
key: Te,
|
|
152
|
+
detail: i
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
function R(t, i, n, u) {
|
|
156
|
+
const m = new DOMParser().parseFromString(t, "text/html");
|
|
157
|
+
return Array.from(m.querySelectorAll(i)).filter((c) => {
|
|
158
|
+
var d;
|
|
159
|
+
return !((d = c.id) != null && d.trim());
|
|
160
|
+
}).map(() => ({ rule: n, type: r.Error, key: u }));
|
|
161
|
+
}
|
|
162
|
+
const ft = () => {
|
|
163
|
+
const { config: t, isFeatureEnabled: i } = ee(), n = ae(), { post: u } = se(), { getCompiledEmail: m, getTemplateData: c } = J(), { compileHtml: d } = te(), { hydrateRecommendationStore: I } = Z(), g = z(), f = $(), y = P(), N = j(), O = (e) => ({
|
|
92
164
|
rule: e.rule,
|
|
93
165
|
type: e.type,
|
|
94
166
|
detail: e.detail,
|
|
95
|
-
message: "key" in e ?
|
|
96
|
-
}),
|
|
167
|
+
message: "key" in e ? n(e.key) : Q(e.message)
|
|
168
|
+
}), A = async (e) => {
|
|
97
169
|
if (e.size === 0)
|
|
98
170
|
return /* @__PURE__ */ new Set();
|
|
99
171
|
try {
|
|
100
|
-
await
|
|
172
|
+
await y.fetchRecommendationFilters();
|
|
101
173
|
} catch {
|
|
102
174
|
return null;
|
|
103
175
|
}
|
|
104
|
-
return
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
html: e,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
176
|
+
return ne(y.filterList);
|
|
177
|
+
}, D = async (e) => {
|
|
178
|
+
try {
|
|
179
|
+
const a = await u(Re, { html: T(e) }), { status: s, message: l } = a.data, p = [], E = s === void 0 && !!l && l !== n(F);
|
|
180
|
+
return s || p.push({
|
|
181
|
+
rule: o.InvalidLinks,
|
|
182
|
+
type: r.Error,
|
|
183
|
+
...E ? { message: l } : { key: F }
|
|
184
|
+
}), l === n(k) && p.push({
|
|
185
|
+
rule: o.LinkCheckInProgress,
|
|
186
|
+
type: r.Error,
|
|
187
|
+
key: k
|
|
188
|
+
}), p;
|
|
189
|
+
} catch (a) {
|
|
190
|
+
return console.warn("Link-check collector failed; skipping the link rule.", a), [];
|
|
191
|
+
}
|
|
192
|
+
}, v = async (e) => {
|
|
193
|
+
try {
|
|
194
|
+
const a = await u("/newsletter/contents/validate-syntax", [{
|
|
195
|
+
identifier: "default",
|
|
196
|
+
syntax: "liquid",
|
|
197
|
+
contents: {
|
|
198
|
+
subject: null,
|
|
199
|
+
preheader: null,
|
|
200
|
+
html: T(e),
|
|
201
|
+
ampHtml: null
|
|
202
|
+
}
|
|
203
|
+
}]);
|
|
204
|
+
if (!Array.isArray(a.data)) {
|
|
205
|
+
const l = a.data;
|
|
206
|
+
return [{
|
|
207
|
+
rule: o.LiquidSyntax,
|
|
208
|
+
type: r.Warning,
|
|
209
|
+
message: l.message ?? n(b)
|
|
210
|
+
}];
|
|
211
|
+
}
|
|
212
|
+
const [s] = a.data;
|
|
213
|
+
return Object.values((s == null ? void 0 : s.errors) ?? {}).map((l) => ({
|
|
214
|
+
rule: o.LiquidSyntax,
|
|
215
|
+
type: r.Warning,
|
|
216
|
+
message: l.replace(/^line \d+:\s*/, "")
|
|
217
|
+
}));
|
|
218
|
+
} catch (a) {
|
|
219
|
+
if (a != null && a.authReported)
|
|
220
|
+
throw a;
|
|
221
|
+
return [{
|
|
222
|
+
rule: o.LiquidSyntax,
|
|
223
|
+
type: r.Error,
|
|
224
|
+
message: n(b)
|
|
225
|
+
}];
|
|
226
|
+
}
|
|
227
|
+
}, K = () => {
|
|
228
|
+
const e = Object.values(y.blockStates).map((s) => q(s.recommendationConfigs, y)).filter((s) => s.length > 0).map((s) => {
|
|
229
|
+
const l = s.every((p) => p === H);
|
|
114
230
|
return {
|
|
115
|
-
rule:
|
|
116
|
-
type:
|
|
117
|
-
key:
|
|
231
|
+
rule: o.RecommendationRequiredFields,
|
|
232
|
+
type: l ? r.Warning : r.Error,
|
|
233
|
+
key: l ? V : X
|
|
118
234
|
};
|
|
119
|
-
}), a = (
|
|
120
|
-
rule:
|
|
121
|
-
type:
|
|
122
|
-
key:
|
|
235
|
+
}), a = (f.recommendationConfigs ?? []).filter((s) => s.filters.some((l) => l.value === "")).map(() => ({
|
|
236
|
+
rule: o.RecommendationFilters,
|
|
237
|
+
type: r.Error,
|
|
238
|
+
key: ke
|
|
123
239
|
}));
|
|
124
240
|
return [...e, ...a];
|
|
125
|
-
},
|
|
126
|
-
var
|
|
127
|
-
const
|
|
128
|
-
...a.map((
|
|
129
|
-
...
|
|
130
|
-
...((
|
|
131
|
-
],
|
|
241
|
+
}, B = async (e, a) => {
|
|
242
|
+
var C, h;
|
|
243
|
+
const s = [
|
|
244
|
+
...a.map((w) => w.value),
|
|
245
|
+
...W,
|
|
246
|
+
...((h = (C = t.value) == null ? void 0 : C.template) == null ? void 0 : h.customFieldAttributes) ?? []
|
|
247
|
+
], l = Y(e), p = await A(l), { isTransactional: E } = N;
|
|
132
248
|
return [
|
|
133
|
-
...
|
|
134
|
-
...
|
|
135
|
-
...
|
|
136
|
-
...
|
|
137
|
-
...
|
|
138
|
-
...
|
|
249
|
+
...await D(e),
|
|
250
|
+
...E ? [] : we(e, s),
|
|
251
|
+
...Ye(e),
|
|
252
|
+
...Ue(e),
|
|
253
|
+
...Me(e),
|
|
254
|
+
...E ? [] : xe(e, s, l, p),
|
|
255
|
+
...We(e),
|
|
256
|
+
...Ge(e),
|
|
257
|
+
...Pe(e),
|
|
258
|
+
...K(),
|
|
259
|
+
...qe(e),
|
|
260
|
+
...R(
|
|
139
261
|
e,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
262
|
+
x,
|
|
263
|
+
o.CheckboxUnsubGroup,
|
|
264
|
+
Fe
|
|
143
265
|
),
|
|
144
|
-
...
|
|
266
|
+
...R(
|
|
145
267
|
e,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
268
|
+
G,
|
|
269
|
+
o.RadioButtonUnsubGroup,
|
|
270
|
+
be
|
|
149
271
|
)
|
|
150
272
|
];
|
|
151
|
-
},
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const { html: e } = await o();
|
|
164
|
-
await u(e);
|
|
165
|
-
const { html: a } = await s({ minimize: !0, resetDataSavedFlag: !1 }), { compiledHtml: i } = d(a);
|
|
166
|
-
return y(i, F.getSelectedDynamicContentList, e);
|
|
273
|
+
}, _ = async (e, a, s) => [
|
|
274
|
+
...De(e),
|
|
275
|
+
...i("blockUnsubscribeLinks") ? Be(s) : [],
|
|
276
|
+
...ve(e),
|
|
277
|
+
...Ke(e),
|
|
278
|
+
...i("liquidSyntax") ? await v(e) : await B(e, a)
|
|
279
|
+
].map(O);
|
|
280
|
+
return { collectSaveValidationErrors: _, validateCurrentTemplate: async () => {
|
|
281
|
+
const { html: e } = await c();
|
|
282
|
+
await I(e);
|
|
283
|
+
const { html: a } = await m({ minimize: !0, resetDataSavedFlag: !1 }), { compiledHtml: s } = d(a);
|
|
284
|
+
return _(s, g.getSelectedDynamicContentList, e);
|
|
167
285
|
} };
|
|
168
286
|
};
|
|
169
287
|
export {
|
|
170
|
-
|
|
288
|
+
ft as useSaveValidation
|
|
171
289
|
};
|
|
@@ -4,20 +4,15 @@ import memoize from "../node_modules/lodash-es/memoize.js";
|
|
|
4
4
|
import { ref } from "vue";
|
|
5
5
|
import { useConfig } from "./useConfig.js";
|
|
6
6
|
const useTranslations = () => {
|
|
7
|
-
var
|
|
8
|
-
const { config } = useConfig(), translationsPath = ((
|
|
9
|
-
var
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return o.replace(e, (f, l, c) => String(
|
|
17
|
-
n[l ?? c]
|
|
18
|
-
));
|
|
19
|
-
}
|
|
20
|
-
return o;
|
|
7
|
+
var o, e;
|
|
8
|
+
const { config } = useConfig(), translationsPath = ((e = (o = config.value) == null ? void 0 : o.editor) == null ? void 0 : e.translationsPath) || DEFAULT_EDITOR.translationsPath, translations = ref(eval(translationsPath)), trans = (t, n) => {
|
|
9
|
+
var s;
|
|
10
|
+
const r = (s = translations.value) == null ? void 0 : s[t];
|
|
11
|
+
return r ? n ? Object.entries(n).reduce(
|
|
12
|
+
// A function replacer keeps `$&`, `$$` and `$1` in the value literal.
|
|
13
|
+
(i, [a, l]) => i.replace(new RegExp(`{${a}}`, "g"), () => String(l)),
|
|
14
|
+
r
|
|
15
|
+
) : r : (console.warn(`Translation key not found: ${t}`), t);
|
|
21
16
|
};
|
|
22
17
|
return memoize(
|
|
23
18
|
trans,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var n = /* @__PURE__ */ ((s) => (s.CouponTagModified = "coupon-tag-modified", s.DuplicateUnsubBlock = "duplicate-unsub-block", s.UnsubBlockMissingTemplate = "unsub-block-missing-template", s.LiquidSyntax = "liquid-syntax", s.InvalidLinks = "invalid-links", s.LinkCheckInProgress = "link-check-in-progress", s.CustomFieldScript = "custom-field-script", s.EmptyHtml = "empty-html", s.MismatchedBraces = "mismatched-braces", s.InvalidDynamicTag = "invalid-dynamic-tag", s.InvalidCustomField = "invalid-custom-field", s.ConditionsSyntax = "conditions-syntax", s.WrongEqualityOperator = "wrong-equality-operator", s.MissingIfEndif = "missing-if-endif", s.ConditionTagSpacing = "condition-tag-spacing", s.BracesInsideIfTag = "braces-inside-if-tag", s.RecommendationRequiredFields = "recommendation-required-fields", s.RecommendationFilters = "recommendation-filters", s.InvalidImageType = "invalid-image-type", s.CheckboxUnsubGroup = "checkbox-unsub-group", s.RadioButtonUnsubGroup = "radio-button-unsub-group", s.ExternallyManagedUnsubscribe = "externally-managed-unsubscribe", s))(n || {});
|
|
2
2
|
export {
|
|
3
|
-
|
|
3
|
+
n as SaveValidationRule
|
|
4
4
|
};
|