@useinsider/guido 2.1.0-beta.bc229b1 → 2.1.0-beta.bd5d1ea

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 (41) hide show
  1. package/README.md +41 -2
  2. package/dist/components/Guido.vue.js +1 -1
  3. package/dist/components/Guido.vue2.js +66 -66
  4. package/dist/components/organisms/base/Toaster.vue.js +4 -4
  5. package/dist/components/organisms/base/Toaster.vue2.js +12 -9
  6. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +5 -5
  7. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +2 -2
  8. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  9. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  10. package/dist/composables/useSave.js +16 -12
  11. package/dist/composables/useStripo.js +66 -62
  12. package/dist/composables/useStripoEventHandler.js +27 -12
  13. package/dist/composables/useSyncModuleExtractor.js +45 -0
  14. package/dist/config/migrator/itemsBlockMigrator.js +65 -64
  15. package/dist/enums/unsubscribe.js +25 -21
  16. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  17. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  18. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  19. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  20. package/dist/guido.css +1 -1
  21. package/dist/services/stripoApi.js +55 -19
  22. package/dist/src/@types/config/schemas.d.ts +1 -1
  23. package/dist/src/@types/events.d.ts +38 -2
  24. package/dist/src/components/Guido.vue.d.ts +2 -2
  25. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  26. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  27. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  28. package/dist/src/composables/useGuidoActions.d.ts +1 -1
  29. package/dist/src/composables/useSave.d.ts +2 -2
  30. package/dist/src/composables/useStripo.d.ts +2 -2
  31. package/dist/src/composables/useSyncModuleExtractor.d.ts +4 -0
  32. package/dist/src/enums/unsubscribe.d.ts +3 -0
  33. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  34. package/dist/src/mock/api/settings.d.ts +2 -0
  35. package/dist/src/services/stripoApi.d.ts +5 -0
  36. package/dist/src/stores/editor.d.ts +23 -0
  37. package/dist/src/utils/templatePreparation.d.ts +1 -1
  38. package/dist/stores/editor.js +2 -1
  39. package/dist/stores/unsubscribe.js +37 -34
  40. package/dist/utils/templatePreparation.js +1 -1
  41. package/package.json +2 -2
@@ -1,27 +1,27 @@
1
- import { useActionsApi as _ } from "./useActionsApi.js";
2
- import { useBlocksConfig as B } from "./useBlocksConfig.js";
3
- import { useConfig as v } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as A } from "./useCustomInterfaceAppearance.js";
5
- import { useStripoEventHandler as F } from "./useStripoEventHandler.js";
6
- import { useToaster as D } from "./useToaster.js";
7
- import { localePatch as I } from "../config/i18n/index.js";
8
- import { displayConditions as M } from "../enums/displayConditions.js";
9
- import { useStripoApi as U } from "../services/stripoApi.js";
10
- import P from "../static/styles/customEditorStyle.css.js";
11
- import { useEditorStore as R } from "../stores/editor.js";
12
- import { dynamicContentToMergeTags as H } from "../utils/genericUtil.js";
13
- import O from "../package.json.js";
14
- const Z = (c) => {
15
- const { features: l, template: y } = v(), { handleError: u } = D(), { getToken: C, getCustomFonts: S } = U(), { handleEvent: E } = F(), { getStripoBlocksConfig: h } = B(), w = async (i, r = []) => {
16
- var m, f, g;
17
- const o = R(), { html: n, css: p } = i, { baseBlocks: s, extensions: t } = await h(), a = ((m = l.value) == null ? void 0 : m.displayConditions) ?? !0, k = ((f = l.value) == null ? void 0 : f.modulesDisabled) ?? !1, T = ((g = y.value) == null ? void 0 : g.forceRecreate) ?? !1;
1
+ import { useActionsApi as A } from "./useActionsApi.js";
2
+ import { useBlocksConfig as F } from "./useBlocksConfig.js";
3
+ import { useConfig as D } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as I } from "./useCustomInterfaceAppearance.js";
5
+ import { useStripoEventHandler as P } from "./useStripoEventHandler.js";
6
+ import { useToaster as U } from "./useToaster.js";
7
+ import { localePatch as R } from "../config/i18n/index.js";
8
+ import { displayConditions as H } from "../enums/displayConditions.js";
9
+ import { useStripoApi as O } from "../services/stripoApi.js";
10
+ import q from "../static/styles/customEditorStyle.css.js";
11
+ import { useEditorStore as S } from "../stores/editor.js";
12
+ import { dynamicContentToMergeTags as x } from "../utils/genericUtil.js";
13
+ import L from "../package.json.js";
14
+ const oe = (C, c) => {
15
+ const { features: l, template: E } = D(), { handleError: u } = U(), { getToken: h, getCustomFonts: w, getSyncModulesStatus: b } = O(), { handleEvent: k } = P(), { getStripoBlocksConfig: T } = F(), V = async (i, n = [], r = !1) => {
16
+ var f, g, y;
17
+ const e = S(), { html: m, css: a } = i, { baseBlocks: o, extensions: d } = await T(), p = ((f = l.value) == null ? void 0 : f.displayConditions) ?? !0, B = ((g = l.value) == null ? void 0 : g.modulesDisabled) ?? !1, v = ((y = E.value) == null ? void 0 : y.forceRecreate) ?? !1;
18
18
  window.UIEditor.initEditor(
19
19
  document.querySelector("#guido-editor"),
20
20
  {
21
- metadata: c,
22
- html: n,
23
- css: p,
24
- forceRecreate: T,
21
+ metadata: C,
22
+ html: m,
23
+ css: a,
24
+ forceRecreate: v,
25
25
  locale: "en",
26
26
  undoButtonSelector: "#guido__undo-button",
27
27
  redoButtonSelector: "#guido__redo-button",
@@ -31,89 +31,93 @@ const Z = (c) => {
31
31
  customAppearanceMergetags: !0,
32
32
  customAppearanceMergetagsBorderColor: "#f1f3fe",
33
33
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
34
- customViewStyles: P,
35
- conditionsEnabled: a,
36
- customConditionsEnabled: a,
37
- conditionCategories: M,
34
+ customViewStyles: q,
35
+ conditionsEnabled: p,
36
+ customConditionsEnabled: p,
37
+ conditionCategories: H,
38
38
  enableXSSSecurity: !0,
39
- modulesDisabled: k,
39
+ modulesDisabled: B,
40
+ syncModulesEnabled: r,
40
41
  messageSettingsEnabled: !0,
41
42
  displayGmailAnnotations: !0,
42
43
  displayHiddenPreheader: !1,
43
44
  displayTitle: !1,
44
45
  displayUTM: !1,
45
46
  selectElementAfterDrop: !0,
46
- ...s ? { baseBlocks: s } : {},
47
+ ...o ? { baseBlocks: o } : {},
47
48
  editorFonts: {
48
49
  showDefaultStandardFonts: !0,
49
50
  showDefaultNotStandardFonts: !0,
50
- customFonts: r
51
+ customFonts: n
51
52
  },
52
53
  mergeTags: [
53
54
  {
54
- entries: H(c.preselectedDynamicContentList)
55
+ entries: x(c.preselectedDynamicContentList)
55
56
  }
56
57
  ],
57
- async onTokenRefreshRequest(e) {
58
+ async onTokenRefreshRequest(t) {
58
59
  try {
59
- const d = await C();
60
- e(d);
61
- } catch (d) {
62
- u(d, "Failed to refresh token");
60
+ const s = await h();
61
+ t(s);
62
+ } catch (s) {
63
+ u(s, "Failed to refresh token");
63
64
  }
64
65
  },
65
66
  onTemplateLoaded() {
66
67
  try {
67
- const { importCss: e } = A(), { activateCustomViewStyles: d, updateTimerInClonedTemplate: V } = _();
68
- e(), d(), V(), c.onReady(), o.isStripoInitialized = !0, o.loadingStatus = !1, setTimeout(() => {
69
- o.hasChanges = !1;
68
+ const { importCss: t } = I(), { activateCustomViewStyles: s, updateTimerInClonedTemplate: M } = A();
69
+ t(), s(), M(), c.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
70
+ e.hasChanges = !1;
70
71
  }, 1e3);
71
- } catch (e) {
72
- u(e, "Failed to load custom interface appearance");
72
+ } catch (t) {
73
+ u(t, "Failed to load custom interface appearance");
73
74
  }
74
75
  },
75
- onCodeEditorVisibilityChanged(e) {
76
- o.isCodeEditorOpen = e;
76
+ onCodeEditorVisibilityChanged(t) {
77
+ e.isCodeEditorOpen = t;
77
78
  },
78
- onEditorVisualModeChanged(e) {
79
- o.editorVisualMode = e.toLowerCase();
79
+ onEditorVisualModeChanged(t) {
80
+ e.editorVisualMode = t.toLowerCase();
80
81
  },
81
- onVersionHistoryVisibilityChanged(e) {
82
- o.isVersionHistoryOpen = e;
82
+ onVersionHistoryVisibilityChanged(t) {
83
+ e.isVersionHistoryOpen = t;
83
84
  },
84
85
  onDataChanged() {
85
- o.hasChanges = !0;
86
+ e.hasChanges = !0;
86
87
  },
87
- onEvent: E,
88
+ onEvent: k,
88
89
  ignoreClickOutsideSelectors: [
89
90
  "#guido-dynamic-content-modal",
90
91
  ".in-on-board-wrapper",
91
92
  ".in-drawer__container"
92
93
  ],
93
- extensions: t,
94
- localePatch: I
94
+ extensions: d,
95
+ localePatch: R
95
96
  }
96
97
  );
97
- }, b = (i) => new Promise((r, o) => {
98
- var a;
98
+ }, _ = (i) => new Promise((n, r) => {
99
+ var d;
99
100
  if (document.getElementById("UiEditorScript")) {
100
- i(), r();
101
+ i(), n();
101
102
  return;
102
103
  }
103
- const n = O.guido, s = `https://email-static.useinsider.com/guido/${(a = n == null ? void 0 : n.stripo) == null ? void 0 : a.version}/UIEditor.js`, t = document.createElement("script");
104
- t.id = "UiEditorScript", t.type = "module", t.src = s, t.onload = () => {
105
- i(), r();
106
- }, t.onerror = () => {
107
- o(new Error(`Failed to load Stripo UIEditor script from S3: ${s}`));
108
- }, document.body.appendChild(t);
104
+ const e = L.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
105
+ o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
106
+ i(), n();
107
+ }, o.onerror = () => {
108
+ r(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
109
+ }, document.body.appendChild(o);
109
110
  });
110
111
  return { initPlugin: async (i) => {
111
- await b(async () => {
112
- const r = await S();
113
- await w(i, r);
112
+ await _(async () => {
113
+ const n = S(), [r, e] = await Promise.all([
114
+ w(),
115
+ b()
116
+ ]);
117
+ n.syncModulesEnabled = e, await V(i, r, e);
114
118
  });
115
119
  } };
116
120
  };
117
121
  export {
118
- Z as useStripo
122
+ oe as useStripo
119
123
  };
@@ -1,20 +1,35 @@
1
- import { useOnboardingStore as i } from "../stores/onboarding.js";
2
- const c = () => {
3
- const e = {
4
- block_dropped: ({ blockName: t }) => {
5
- if (t === "BLOCK_TEXT") {
6
- const n = i(), o = !n.shouldShowOnboarding("textBlockOnboarding"), r = n.isActive("textBlockOnboarding");
7
- if (o || r)
1
+ import { useStripoApi as i } from "../services/stripoApi.js";
2
+ import { useEditorStore as u } from "../stores/editor.js";
3
+ import { useOnboardingStore as l } from "../stores/onboarding.js";
4
+ import { useUnsubscribeStore as b } from "../stores/unsubscribe.js";
5
+ const v = () => {
6
+ const { updateSyncModule: d, getSyncModule: r } = i(), n = u(), s = b(), a = {
7
+ block_dropped: ({ blockName: e }) => {
8
+ if (e === "BLOCK_TEXT") {
9
+ const o = l(), t = !o.shouldShowOnboarding("textBlockOnboarding"), c = o.isActive("textBlockOnboarding");
10
+ if (t || c)
8
11
  return;
9
- n.start("textBlockOnboarding");
12
+ o.start("textBlockOnboarding");
10
13
  }
14
+ },
15
+ module_saved: async (e) => {
16
+ n.syncModulesEnabled && (console.debug("[module_saved] Saved module data:", e), await d(e));
17
+ },
18
+ module_dropped: async (e) => {
19
+ if (!n.syncModulesEnabled)
20
+ return;
21
+ const { moduleId: o } = e, t = await r(o);
22
+ console.debug("[module_dropped] Sync module data:", t), t.unsubscriptionPreferencePages.length && await s.fetchTemplates();
23
+ },
24
+ module_updated: async (e) => {
25
+ n.syncModulesEnabled && (console.debug("[module_updated] Updated module data:", e), await d(e));
11
26
  }
12
27
  };
13
- return { handleEvent: async (t, n) => {
14
- const o = e[t];
15
- o && await o(n);
28
+ return { handleEvent: async (e, o) => {
29
+ const t = a[e];
30
+ console.debug("Stripo Event: ", e, o), t && await t(o);
16
31
  } };
17
32
  };
18
33
  export {
19
- c as useStripoEventHandler
34
+ v as useStripoEventHandler
20
35
  };
@@ -0,0 +1,45 @@
1
+ import { UNSUBSCRIBE_SYNC_MODULE_TYPES as T } from "../enums/unsubscribe.js";
2
+ import { DATA_ATTRIBUTES as p } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
3
+ import { useEditorStore as f } from "../stores/editor.js";
4
+ const y = ".esd-synchronizable-module", A = '[esd-extension-block-id="unsubscribe-block"]', _ = "esd-custom-block-id", B = () => {
5
+ const d = f();
6
+ return { extractSyncModuleData: (E) => {
7
+ const S = {
8
+ unsubscribePayload: [],
9
+ stripoModules: []
10
+ };
11
+ if (!d.syncModulesEnabled)
12
+ return S;
13
+ const b = new DOMParser().parseFromString(E, "text/html").querySelectorAll(y), r = [], s = [];
14
+ return b.forEach((o) => {
15
+ const t = o.getAttribute(_);
16
+ if (!t)
17
+ return;
18
+ const n = o.querySelectorAll(A);
19
+ if (n.length === 0) {
20
+ s.push(Number(t));
21
+ return;
22
+ }
23
+ n.forEach((c) => {
24
+ const u = c.getAttribute(p.PAGE_LIST), i = c.getAttribute(p.PAGE_TYPE);
25
+ if (!u || !i)
26
+ return;
27
+ const m = parseInt(i), a = T[m];
28
+ if (!a)
29
+ return;
30
+ const l = u.split(",").map((e) => parseInt(e.trim())).filter((e) => !Number.isNaN(e));
31
+ l.length !== 0 && r.push({
32
+ stripoModuleId: t,
33
+ unsubscriptionPreferencePages: l,
34
+ type: a
35
+ });
36
+ });
37
+ }), {
38
+ unsubscribePayload: r,
39
+ stripoModules: s
40
+ };
41
+ } };
42
+ };
43
+ export {
44
+ B as useSyncModuleExtractor
45
+ };
@@ -1,8 +1,8 @@
1
- var B = Object.defineProperty;
2
- var U = (e, t, r) => t in e ? B(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
- var M = (e, t, r) => U(e, typeof t != "symbol" ? t + "" : t, r);
4
- import { productPairs as v } from "../../extensions/Blocks/Items/enums/productEnums.js";
5
- import { ItemInCartOptions as E, DefaultConfigValues as g, SETTINGS_ENUMS as u } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
1
+ var v = Object.defineProperty;
2
+ var B = (e, t, r) => t in e ? v(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
+ var M = (e, t, r) => B(e, typeof t != "symbol" ? t + "" : t, r);
4
+ import { productPairs as U } from "../../extensions/Blocks/Items/enums/productEnums.js";
5
+ import { ItemInCartOptions as T, DefaultConfigValues as g, SETTINGS_ENUMS as u } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
6
6
  import { getDefaultTemplate as K } from "../../extensions/Blocks/Items/template.js";
7
7
  const w = {
8
8
  img: {
@@ -85,18 +85,19 @@ function q(e) {
85
85
  }[e] || u.ITEMS_TYPE.CART_ITEMS : u.ITEMS_TYPE.CART_ITEMS;
86
86
  }
87
87
  function R(e) {
88
- const t = (a, o) => a == null ? o : a === "1" || a === "true", r = (a, o) => a || o, c = e["data-type"] || e["data-source"], i = q(c);
89
- let n = e["data-cart_items_select_control_value"] || g.cartItemsSelectControlValue;
90
- if (n && !n.includes("{{") && /^\d+$/.test(n)) {
91
- const a = parseInt(n) - 1, o = E[i];
92
- o && o[a] && (n = o[a].value);
88
+ var a;
89
+ const t = (_, c) => _ == null ? c : _ === "1" || _ === "true", r = (_, c) => _ || c, l = e["data-type"] || e["data-source"], i = q(l), n = T[i];
90
+ let o = e["data-cart_items_select_control_value"] || ((a = n == null ? void 0 : n[0]) == null ? void 0 : a.value) || g.cartItemsSelectControlValue;
91
+ if (o && !o.includes("{{") && /^\d+$/.test(o)) {
92
+ const _ = parseInt(o) - 1, c = T[i];
93
+ c && c[_] && (o = c[_].value);
93
94
  }
94
95
  return {
95
96
  initialized: !0,
96
97
  blockInstanceId: r(e["data-block-instance-id"], F()),
97
98
  source: i,
98
99
  type: i,
99
- itemsSelectValue: n,
100
+ itemsSelectValue: o,
100
101
  orientation: e["data-card_orientation_control_value"] || u.ORIENTATION.VERTICAL,
101
102
  nameTrimming: t(e["data-product_name_control_trim"], !0),
102
103
  priceHideDiscount: t(e["data-product_price_control_nodup"], !0),
@@ -154,36 +155,36 @@ class V {
154
155
  try {
155
156
  let r = this.removeJinjaConditionals(t);
156
157
  r = this.replaceTemplateVariables(r);
157
- const c = this.parser.parseFromString(r, "text/html"), i = c.querySelectorAll(
158
+ const l = this.parser.parseFromString(r, "text/html"), i = l.querySelectorAll(
158
159
  "td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
159
160
  );
160
161
  return i.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), r) : (i.forEach((n) => {
161
- const a = this.extractConfiguration(n), o = K({
162
- orientation: a.orientation,
163
- itemsType: a.itemsType,
164
- itemId: a.itemId,
165
- currencySymbol: a.currencySymbol,
166
- currencyLocation: a.currencyLocation,
167
- formattedPrice: a.formattedPrice,
168
- configBlockAttributes: a.configBlockAttributes,
162
+ const o = this.extractConfiguration(n), a = K({
163
+ orientation: o.orientation,
164
+ itemsType: o.itemsType,
165
+ itemId: o.itemId,
166
+ currencySymbol: o.currencySymbol,
167
+ currencyLocation: o.currencyLocation,
168
+ formattedPrice: o.formattedPrice,
169
+ configBlockAttributes: o.configBlockAttributes,
169
170
  migrate: !0,
170
- nameStyles: a.nameStyles,
171
- buttonStyles: a.buttonStyles,
172
- priceStyles: a.priceStyles,
173
- originalPriceStyles: a.originalPriceStyles,
174
- quantityStyles: a.quantityStyles,
175
- nodeConfig: R(a.configBlockAttributes)
176
- }), l = this.parser.parseFromString(
177
- `<table><tbody><tr>${o}</tr></tbody></table>`,
171
+ nameStyles: o.nameStyles,
172
+ buttonStyles: o.buttonStyles,
173
+ priceStyles: o.priceStyles,
174
+ originalPriceStyles: o.originalPriceStyles,
175
+ quantityStyles: o.quantityStyles,
176
+ nodeConfig: R(o.configBlockAttributes)
177
+ }), c = this.parser.parseFromString(
178
+ `<table><tbody><tr>${a}</tr></tbody></table>`,
178
179
  "text/html"
179
180
  ).querySelector("td");
180
- if (l && n.parentNode) {
181
- const f = R(a.configBlockAttributes);
182
- l.setAttribute("esd-ext-config", JSON.stringify(f));
183
- const d = l.querySelector("esd-config-block");
184
- d && d.remove(), n.parentNode.replaceChild(l, n);
181
+ if (c && n.parentNode) {
182
+ const f = R(o.configBlockAttributes);
183
+ c.setAttribute("esd-ext-config", JSON.stringify(f));
184
+ const d = c.querySelector("esd-config-block");
185
+ d && d.remove(), n.parentNode.replaceChild(c, n);
185
186
  }
186
- }), c.documentElement.outerHTML);
187
+ }), l.documentElement.outerHTML);
187
188
  } catch (r) {
188
189
  return console.error("ItemsBlockMigrator failed:", r), t;
189
190
  }
@@ -196,14 +197,14 @@ class V {
196
197
  */
197
198
  extractConfiguration(t) {
198
199
  var C, D, P;
199
- const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", c = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", i = parseInt(c) - 1, n = E[r], a = ((P = n == null ? void 0 : n[i]) == null ? void 0 : P.value) || n[0].value, o = t.querySelector('[product-attr="price"]'), _ = (o == null ? void 0 : o.getAttribute("data-currency_symbol")) || "USD", f = ((o == null ? void 0 : o.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", d = (o == null ? void 0 : o.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r, c), S = s["data-card_orientation_control_value"];
200
+ const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", l = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", i = parseInt(l) - 1, n = T[r], o = ((P = n == null ? void 0 : n[i]) == null ? void 0 : P.value) || n[0].value, a = t.querySelector('[product-attr="price"]'), _ = (a == null ? void 0 : a.getAttribute("data-currency_symbol")) || "USD", f = ((a == null ? void 0 : a.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", d = (a == null ? void 0 : a.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r, l), S = s["data-card_orientation_control_value"];
200
201
  let b;
201
202
  S ? b = S === "horizontal" ? "horizontal" : "vertical" : b = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
202
- const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (o == null ? void 0 : o.getAttribute("style")) || void 0, T = t.querySelector("p.original-price"), k = (T == null ? void 0 : T.getAttribute("style")) || void 0, A = t.querySelector('[product-attr="quantity"]'), L = (A == null ? void 0 : A.getAttribute("style")) || void 0;
203
+ const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (a == null ? void 0 : a.getAttribute("style")) || void 0, A = t.querySelector("p.original-price"), k = (A == null ? void 0 : A.getAttribute("style")) || void 0, E = t.querySelector('[product-attr="quantity"]'), L = (E == null ? void 0 : E.getAttribute("style")) || void 0;
203
204
  return {
204
205
  orientation: b,
205
206
  itemsType: r,
206
- itemId: a,
207
+ itemId: o,
207
208
  currencySymbol: _,
208
209
  currencyLocation: f,
209
210
  formattedPrice: d,
@@ -222,27 +223,27 @@ class V {
222
223
  * @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
223
224
  * @param itemNumber - The item number (1-based index)
224
225
  */
225
- extractConfigBlockAttributes(t, r, c) {
226
+ extractConfigBlockAttributes(t, r, l) {
226
227
  const i = t.querySelector("esd-config-block"), n = {};
227
228
  if (!i)
228
229
  return this.getDefaultConfigBlockAttributes();
229
- if (Array.from(i.attributes).forEach((o) => {
230
- o.name.startsWith("data-") && (n[o.name] = o.value);
230
+ if (Array.from(i.attributes).forEach((a) => {
231
+ a.name.startsWith("data-") && (n[a.name] = a.value);
231
232
  }), n["data-cart_items_select_control_value"]) {
232
- const o = n["data-cart_items_select_control_value"];
233
- if (/^\d+$/.test(o)) {
234
- const _ = parseInt(o) - 1, l = E[r];
235
- l && l[_] && (n["data-cart_items_select_control_value"] = l[_].value);
233
+ const a = n["data-cart_items_select_control_value"];
234
+ if (/^\d+$/.test(a)) {
235
+ const _ = parseInt(a) - 1, c = T[r];
236
+ c && c[_] && (n["data-cart_items_select_control_value"] = c[_].value);
236
237
  }
237
238
  }
238
239
  if (n["data-product_price_control_curency"]) {
239
- const o = n["data-product_price_control_curency"];
240
- let _ = o;
241
- o === "before" ? _ = "0" : o === "after" && (_ = "1"), n["data-product_price_control_curency"] = _, n["data-product_price_currency_location"] = _;
240
+ const a = n["data-product_price_control_curency"];
241
+ let _ = a;
242
+ a === "before" ? _ = "0" : a === "after" && (_ = "1"), n["data-product_price_control_curency"] = _, n["data-product_price_currency_location"] = _;
242
243
  }
243
244
  (!n["data-product_price_control_currency_symbol"] || n["data-product_price_control_currency_symbol"].trim() === "") && (n["data-product_price_control_currency_symbol"] = "USD");
244
- const a = { ...this.getDefaultConfigBlockAttributes(), ...n };
245
- return a["data-type"] = r, a["data-source"] = r, a["data-product_image_link"] = $(r, c), a["data-product_button_link"] = x(r, c), a;
245
+ const o = { ...this.getDefaultConfigBlockAttributes(), ...n };
246
+ return o["data-type"] = r, o["data-source"] = r, o["data-product_image_link"] = $(r, l), o["data-product_button_link"] = x(r, l), o;
246
247
  }
247
248
  /**
248
249
  * Returns default esd-config-block attributes based on the old template structure
@@ -302,15 +303,15 @@ class V {
302
303
  * contains display condition Jinja scripts that should NOT be removed.
303
304
  */
304
305
  removeJinjaConditionals(t) {
305
- const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", c = t.match(/esd-custom-display-conditions="[^"]*"/);
306
- let i = c ? t.replace(c[0], r) : t;
306
+ const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", l = t.match(/esd-custom-display-conditions="[^"]*"/);
307
+ let i = l ? t.replace(l[0], r) : t;
307
308
  return i = i.replace(
308
309
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(&gt;|>)\s*\d+\s*%\}/g,
309
310
  ""
310
311
  ), i = i.replace(
311
312
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!&#61;|!=)\s*\1_originalprice_\d+\s*%\}/g,
312
313
  ""
313
- ), i = i.replace(/\{%\s*endif\s*%\}/g, ""), c && (i = i.replace(r, c[0])), i = i.replace(/\n\s*\n\s*\n/g, `
314
+ ), i = i.replace(/\{%\s*endif\s*%\}/g, ""), l && (i = i.replace(r, l[0])), i = i.replace(/\n\s*\n\s*\n/g, `
314
315
 
315
316
  `), i;
316
317
  }
@@ -324,26 +325,26 @@ class V {
324
325
  * - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
325
326
  */
326
327
  replaceTemplateVariables(t) {
327
- const { PAIRS_FOR_EXTENSION: r } = v;
328
- return t.replace(/{{([^}]+)}}/g, (c, i) => {
328
+ const { PAIRS_FOR_EXTENSION: r } = U;
329
+ return t.replace(/{{([^}]+)}}/g, (l, i) => {
329
330
  const n = i.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
330
331
  if (!n)
331
- return c;
332
- const [, a, o, _] = n, l = O[a];
333
- if (!l)
334
- return console.warn(`Unknown variable prefix: ${a}`), c;
335
- const f = w[o];
332
+ return l;
333
+ const [, o, a, _] = n, c = O[o];
334
+ if (!c)
335
+ return console.warn(`Unknown variable prefix: ${o}`), l;
336
+ const f = w[a];
336
337
  if (!f)
337
- return console.warn(`Unknown variable suffix mapping for: ${o}`), c;
338
- const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][l];
338
+ return console.warn(`Unknown variable suffix mapping for: ${a}`), l;
339
+ const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][c];
339
340
  if (!p)
340
- return console.warn(`No data found for: ${d}.${l}`), c;
341
+ return console.warn(`No data found for: ${d}.${c}`), l;
341
342
  if (S) {
342
343
  const y = parseInt(_) - 1, m = p[s];
343
- return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${l}.${s}[${y}]`), c);
344
+ return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${c}.${s}[${y}]`), l);
344
345
  }
345
346
  const I = p[s];
346
- return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${l}.${s}`), c);
347
+ return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${c}.${s}`), l);
347
348
  });
348
349
  }
349
350
  }
@@ -1,17 +1,17 @@
1
1
  import { useTranslations as e } from "../composables/useTranslations.js";
2
2
  import { getEnvironmentPrefix as R } from "../utils/environmentUtil.js";
3
- const I = {
3
+ const _ = {
4
4
  UNSUBSCRIBE_LINK_TYPE: 1,
5
5
  PREFERENCES_LINK_TYPE: 3
6
- }, r = {
6
+ }, I = {
7
7
  UNSUBSCRIBE_LINK_REGEX: /{{ins-unsubscribe-link}}/g,
8
8
  DATA_OGSB_BUTTON_CSS_REGEX: "\\[data-ogsb\\]\\s*\\.es-button\\.es-button-[0-9]+\\s*\\{(?:[^\\}]*)\\}",
9
9
  GLOBAL_UNSUBSCRIBE_LINK_REGEX: /{{ins-global-unsubscribe-link}}/g,
10
10
  PREFERENCES_UNSUBSCRIBE_LINK_REGEX: /{{ins-preferences-unsubscribe-link}}/g
11
- }, s = R(), _ = {
12
- UNSUBSCRIBE_URL: `https://mail.${s}.com/user/v1/unsub`,
13
- PREFERENCES_URL: `https://mail.${s}.com/user/v1/prefs`
14
- }, i = "iid", B = {
11
+ }, n = R(), r = {
12
+ UNSUBSCRIBE_URL: `https://mail.${n}.com/user/v1/unsub`,
13
+ PREFERENCES_URL: `https://mail.${n}.com/user/v1/prefs`
14
+ }, B = "iid", i = {
15
15
  name: "Global Unsubscribe",
16
16
  sendGridId: "G"
17
17
  }, C = "/email/unsubscribe-pages", E = {
@@ -20,6 +20,9 @@ const I = {
20
20
  SUBSCRIPTION_PREFERENCE_CENTER: 3,
21
21
  SUBSCRIPTION_PREFERENCE_CONFIRMATION: 4,
22
22
  RESUBSCRIBE: 5
23
+ }, U = {
24
+ [E.GLOBAL_UNSUBSCRIBE]: "custom-unsubscribe",
25
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: "custom-preferences"
23
26
  }, t = {
24
27
  [E.GLOBAL_UNSUBSCRIBE]: [
25
28
  E.GLOBAL_UNSUBSCRIBE,
@@ -30,29 +33,30 @@ const I = {
30
33
  E.SUBSCRIPTION_PREFERENCE_CENTER,
31
34
  E.SUBSCRIPTION_PREFERENCE_CONFIRMATION
32
35
  ]
33
- }, U = () => {
34
- const n = e();
36
+ }, c = () => {
37
+ const s = e();
35
38
  return {
36
- [E.GLOBAL_UNSUBSCRIBE]: n("unsubscription-preference.type-global-unsubscribe"),
37
- [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: n("unsubscription-preference.type-global-unsubscription-confirmation"),
38
- [E.RESUBSCRIBE]: n("unsubscription-preference.type-resubscribe"),
39
- [E.SUBSCRIPTION_PREFERENCE_CENTER]: n("unsubscription-preference.type-subscription-preferences-center"),
40
- [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: n("unsubscription-preference.type-subscription-preferences-confirmation")
39
+ [E.GLOBAL_UNSUBSCRIBE]: s("unsubscription-preference.type-global-unsubscribe"),
40
+ [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: s("unsubscription-preference.type-global-unsubscription-confirmation"),
41
+ [E.RESUBSCRIBE]: s("unsubscription-preference.type-resubscribe"),
42
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: s("unsubscription-preference.type-subscription-preferences-center"),
43
+ [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: s("unsubscription-preference.type-subscription-preferences-confirmation")
41
44
  };
42
- }, c = {
45
+ }, o = {
43
46
  default: "{{ins-unsubscribe-link}}",
44
47
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
45
48
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
46
49
  };
47
50
  export {
48
- B as DEFAULT_UNSUBSCRIBE_GROUP,
49
- i as INSIDER_ID,
50
- r as LINK_REGEXES,
51
- I as LINK_TYPES,
52
- c as MERGE_TAGS,
51
+ i as DEFAULT_UNSUBSCRIBE_GROUP,
52
+ B as INSIDER_ID,
53
+ I as LINK_REGEXES,
54
+ _ as LINK_TYPES,
55
+ o as MERGE_TAGS,
53
56
  E as PAGE_TYPES,
54
57
  t as TYPE_COLLECTIONS,
55
58
  C as UNSUBSCRIBE_PAGES_LINK,
56
- _ as URLS,
57
- U as getTypeTranslations
59
+ U as UNSUBSCRIBE_SYNC_MODULE_TYPES,
60
+ r as URLS,
61
+ c as getTypeTranslations
58
62
  };