@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.
Files changed (36) hide show
  1. package/dist/@types/config/schemas.js +3 -3
  2. package/dist/composables/useSave.js +17 -19
  3. package/dist/composables/useSaveValidation.js +252 -134
  4. package/dist/composables/useTranslations.js +9 -14
  5. package/dist/enums/save-validation.js +2 -2
  6. package/dist/node_modules/valibot/dist/index.js +154 -232
  7. package/dist/package.json.js +1 -1
  8. package/dist/src/composables/useSaveValidation.d.ts +2 -2
  9. package/dist/src/enums/save-validation.d.ts +15 -3
  10. package/dist/static/stripo-runtime-manifest.json.js +2 -2
  11. package/package.json +2 -2
  12. package/dist/@types/email-be/html-validation.js +0 -28
  13. package/dist/enums/email-be.js +0 -27
  14. package/dist/services/emailBe/errors/ApiError.js +0 -50
  15. package/dist/services/emailBe/errors/handleApiError.js +0 -31
  16. package/dist/services/emailBe/errors/toApiError.js +0 -71
  17. package/dist/services/emailBe/html/HtmlValidationService.js +0 -35
  18. package/dist/services/emailBe/html/index.js +0 -6
  19. package/dist/services/emailBe/http/HttpManager.js +0 -68
  20. package/dist/services/emailBe/http/RetryStack.js +0 -24
  21. package/dist/services/emailBe/http/client.js +0 -61
  22. package/dist/services/emailBe/http/index.js +0 -10
  23. package/dist/services/emailBe/http/transportErrors.js +0 -20
  24. package/dist/src/@types/email-be/html-validation.d.ts +0 -51
  25. package/dist/src/enums/email-be.d.ts +0 -26
  26. package/dist/src/services/emailBe/errors/ApiError.d.ts +0 -40
  27. package/dist/src/services/emailBe/errors/handleApiError.d.ts +0 -11
  28. package/dist/src/services/emailBe/errors/toApiError.d.ts +0 -2
  29. package/dist/src/services/emailBe/html/HtmlValidationService.d.ts +0 -8
  30. package/dist/src/services/emailBe/html/index.d.ts +0 -2
  31. package/dist/src/services/emailBe/http/HttpManager.d.ts +0 -13
  32. package/dist/src/services/emailBe/http/RetryStack.d.ts +0 -6
  33. package/dist/src/services/emailBe/http/client.d.ts +0 -3
  34. package/dist/src/services/emailBe/http/index.d.ts +0 -2
  35. package/dist/src/services/emailBe/http/transportErrors.d.ts +0 -15
  36. 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, lazy as T, looseObject as C, variant as I, union as h } from "../../node_modules/valibot/dist/index.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, 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 = T(() => C({
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 = I("type", [
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 rt } from "./validators/useLiquidValidator.js";
20
- import { useSyncModuleBlockValidator as st } from "./validators/useSyncModuleBlockValidator.js";
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 } = rt(), { validateCouponBlockTags: H } = ot(), {
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 } = st(), { 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) => {
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 r = await T(o);
35
- r != null && r.message && h({
34
+ const s = await T(o);
35
+ s != null && s.message && h({
36
36
  type: J.Warning,
37
- message: r.message,
38
- actionButton: r.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: r } = x(t.rawHtml);
46
- if (await k(o), t.modules = r, !e.suppress) {
47
- const s = e.blankCompiled ? { compiledHtml: "", ampHtml: "" } : {};
48
- S({ ...t, ...s, silent: e.silent });
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 r;
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 s = await L(
60
+ const r = await L(
61
61
  o.compiledHtml,
62
62
  o.dynamicContentList,
63
63
  o.rawHtml
64
64
  );
65
- if (!s)
66
- return;
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 (!((r = a.value) != null && r.externalValidation && !await a.value.externalValidation(o)) && !await f(o.compiledHtml, o.css, e))
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 A } from "../config/compiler/utils/recommendationIgnoreUtils.js";
2
- import { HtmlSyntax as I } from "../enums/email-be.js";
3
- import { DISPLAY_CONDITIONS_REGEX as B } from "../enums/html-validator.js";
4
- import { SaveValidationRule as m } from "../enums/save-validation.js";
5
- import { ToasterTypeOptions as l } from "../enums/toaster.js";
6
- import { BLOCK_ROOT_SELECTOR as U } from "../extensions/Blocks/Checkbox/constants/selectors.js";
7
- import { itemsBlockDynamicVariables as h } from "../extensions/Blocks/Items/enums/productEnums.js";
8
- import { BLOCK_ROOT_SELECTOR as w } from "../extensions/Blocks/RadioButton/constants/selectors.js";
9
- import { useRecommendationExtensionStore as K } from "../extensions/Blocks/Recommendation/store/recommendation.js";
10
- import { getInvalidFields as x, STRATEGY_FIELD_KEY as G, RecommendationAssignStrategyKey as M, RecommendationRequiredFieldsKey as Y } from "../extensions/Blocks/Recommendation/validation/requiredFields.js";
11
- import { htmlValidationService as H } from "../services/emailBe/html/index.js";
12
- import { useConfigStore as P } from "../stores/config.js";
13
- import { useDynamicContentStore as q } from "../stores/dynamic-content.js";
14
- import { useRecommendationStore as V } from "../stores/recommendation.js";
15
- import { escapeHtml as b } from "../utils/htmlEscape.js";
16
- import { useTemplatePreparation as W } from "../utils/templatePreparation.js";
17
- import { useActionsApi as X } from "./useActionsApi.js";
18
- import { useConfig as j } from "./useConfig.js";
19
- import { useHtmlCompiler as z } from "./useHtmlCompiler.js";
20
- import { buildPartnerAttributeNameSet as $, getInvalidDynamicContentTags as Q, getRecommendationBlockIds as Z, findInvalidCustomFields as J } from "./useHtmlValidator.js";
21
- import { useTranslations as tt } from "./useTranslations.js";
22
- import { hasInsiderUnsubscribeCode as et, EXTERNALLY_MANAGED_UNSUBSCRIBE_KEY as nt } from "./validators/useUnsubscribeBlockValidator.js";
23
- const E = "custom-fields.invalid-custom-fields", it = "custom-conditions.missing-if-endif-tag", ot = "newsletter.fill-all-necessary-fields", rt = "unsubscribe-templates.select-checkbox-groups", st = "unsubscribe-templates.select-radio-button-groups", at = /({%(.*?)%})/g, ct = ["unsubscribe-page-not-selected"], mt = ["malformed-merge-tag"], lt = "liquid-syntax-error", dt = ["if", "endif", "else", "elif", "now"], ut = (t) => !dt.includes(t.toLowerCase()), ft = (t) => ["if", "endif"].includes(t.toLowerCase());
24
- function pt({ code: t, details: n }) {
25
- return ct.includes(t) ? "" : (t === lt ? n.slice(1) : n).join(", ");
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 gt(t) {
28
- const n = pt(t);
29
- return {
30
- rule: m.EmailBeHtml,
31
- type: l.Error,
32
- key: t.trans.key,
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 Et(t) {
38
- return et(t) ? [{
39
- rule: m.ExternallyManagedUnsubscribe,
40
- type: l.Warning,
41
- key: nt
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 yt(t, n) {
45
- const r = t.match(at);
46
- if (!r)
54
+ function we(t, i) {
55
+ const n = t.match(L);
56
+ if (!n)
47
57
  return [];
48
- const s = [];
49
- return r.forEach((o) => {
50
- const d = o.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
51
- if (d && d.length > 0) {
52
- const [u] = d;
53
- ut(u) && !n.includes(u) && s.push({
54
- rule: m.CustomFieldScript,
55
- type: l.Warning,
56
- key: E,
57
- detail: u
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
- }), s;
70
+ }), u;
71
+ }
72
+ function Ye(t) {
73
+ return t.length > 0 ? [] : [{ rule: o.EmptyHtml, type: r.Warning, key: fe }];
61
74
  }
62
- function St(t) {
63
- return Q(t).map((n) => ({
64
- rule: m.InvalidDynamicTag,
65
- type: l.Warning,
66
- key: E,
67
- detail: n
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 Ct(t, n, r, s) {
71
- const o = Z(t);
72
- return J(t, n, o, r, s).map((d) => ({
73
- rule: m.InvalidCustomField,
74
- type: l.Error,
75
- key: E,
76
- detail: d
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 It(t) {
80
- const n = (t.match(/{%(.*?)%}/g) ?? []).flatMap((o) => o.match(B) ?? []).flatMap((o) => o.match(/^[a-zA-Z]*$/g) ?? []).filter(ft), r = n.filter((o) => o === "if").length, s = n.filter((o) => o === "endif").length;
81
- return r === s ? [] : [{ rule: m.MissingIfEndif, type: l.Error, key: it }];
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 _(t, n, r, s) {
84
- const o = new DOMParser().parseFromString(t, "text/html");
85
- return Array.from(o.querySelectorAll(n)).filter((d) => {
86
- var u;
87
- return !((u = d.id) != null && u.trim());
88
- }).map(() => ({ rule: r, type: l.Error, key: s }));
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
- const _t = (t) => t && Object.fromEntries(Object.entries(t).map(([n, r]) => [n, b(String(r))])), Vt = () => {
91
- const { config: t, isFeatureEnabled: n } = j(), r = tt(), { getCompiledEmail: s, getTemplateData: o } = X(), { compileHtml: d } = z(), { hydrateRecommendationStore: u } = W(), F = q(), O = V(), p = K(), R = P(), D = (e) => ({
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 ? r(e.key, _t(e.params)) : b(e.message)
96
- }), T = async (e) => {
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 p.fetchRecommendationFilters();
172
+ await y.fetchRecommendationFilters();
101
173
  } catch {
102
174
  return null;
103
175
  }
104
- return $(p.filterList);
105
- }, k = async (e) => {
106
- const a = await H.validate({
107
- html: e,
108
- syntax: n("liquidSyntax") ? I.LIQUID : I.PONGO
109
- });
110
- return a.ok ? a.data.errors.filter((i) => !mt.includes(i.code)).map(gt) : null;
111
- }, v = () => {
112
- const e = Object.values(p.blockStates).map((i) => x(i.recommendationConfigs, p)).filter((i) => i.length > 0).map((i) => {
113
- const c = i.every((f) => f === G);
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: m.RecommendationRequiredFields,
116
- type: c ? l.Warning : l.Error,
117
- key: c ? M : Y
231
+ rule: o.RecommendationRequiredFields,
232
+ type: l ? r.Warning : r.Error,
233
+ key: l ? V : X
118
234
  };
119
- }), a = (O.recommendationConfigs ?? []).filter((i) => i.filters.some((c) => c.value === "")).map(() => ({
120
- rule: m.RecommendationFilters,
121
- type: l.Error,
122
- key: ot
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
- }, L = async (e, a) => {
126
- var S, C;
127
- const i = [
128
- ...a.map((N) => N.value),
129
- ...h,
130
- ...((C = (S = t.value) == null ? void 0 : S.template) == null ? void 0 : C.customFieldAttributes) ?? []
131
- ], c = A(e), f = await T(c), { isTransactional: g } = R;
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
- ...g ? [] : yt(e, i),
134
- ...St(e),
135
- ...g ? [] : Ct(e, i, c, f),
136
- ...It(e),
137
- ...v(),
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
- U,
141
- m.CheckboxUnsubGroup,
142
- rt
262
+ x,
263
+ o.CheckboxUnsubGroup,
264
+ Fe
143
265
  ),
144
- ..._(
266
+ ...R(
145
267
  e,
146
- w,
147
- m.RadioButtonUnsubGroup,
148
- st
268
+ G,
269
+ o.RadioButtonUnsubGroup,
270
+ be
149
271
  )
150
272
  ];
151
- }, y = async (e, a, i) => {
152
- const [c, f] = await Promise.all([
153
- k(e),
154
- n("liquidSyntax") ? [] : L(e, a)
155
- ]);
156
- return c ? [
157
- ...c,
158
- ...n("blockUnsubscribeLinks") ? Et(i) : [],
159
- ...f
160
- ].map(D) : null;
161
- };
162
- return { collectSaveValidationErrors: y, validateCurrentTemplate: async () => {
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
- Vt as useSaveValidation
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 s, i;
8
- const { config } = useConfig(), translationsPath = ((i = (s = config.value) == null ? void 0 : s.editor) == null ? void 0 : i.translationsPath) || DEFAULT_EDITOR.translationsPath, translations = ref(eval(translationsPath)), trans = (t, n) => {
9
- var a;
10
- const o = (a = translations.value) == null ? void 0 : a[t];
11
- if (!o)
12
- return console.warn(`Translation key not found: ${t}`), t;
13
- const r = Object.keys(n ?? {}).filter(Boolean).map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
14
- if (n && r.length) {
15
- const e = new RegExp(`{(${r.join("|")})}|:(${r.join("|")})\\b`, "g");
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 r = /* @__PURE__ */ ((n) => (n.CustomFieldScript = "custom-field-script", n.InvalidDynamicTag = "invalid-dynamic-tag", n.InvalidCustomField = "invalid-custom-field", n.MissingIfEndif = "missing-if-endif", n.RecommendationRequiredFields = "recommendation-required-fields", n.RecommendationFilters = "recommendation-filters", n.CheckboxUnsubGroup = "checkbox-unsub-group", n.RadioButtonUnsubGroup = "radio-button-unsub-group", n.ExternallyManagedUnsubscribe = "externally-managed-unsubscribe", n.EmailBeHtml = "email-be-html", n))(r || {});
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
- r as SaveValidationRule
3
+ n as SaveValidationRule
4
4
  };