@useinsider/guido 3.20.0 → 3.20.1-beta.8a05319

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 (26) hide show
  1. package/dist/config/compiler/itemsCompilerRules.js +14 -5
  2. package/dist/config/compiler/utils/itemsCompilerUtils.js +48 -21
  3. package/dist/config/migrator/itemsBlockMigrator.js +112 -108
  4. package/dist/extensions/Blocks/Items/block.js +78 -67
  5. package/dist/extensions/Blocks/Items/constants/cardWidth.js +20 -0
  6. package/dist/extensions/Blocks/Items/layouts/vertical.html.js +1 -1
  7. package/dist/extensions/Blocks/Recommendation/block.js +51 -44
  8. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +90 -73
  9. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +209 -203
  10. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +122 -90
  11. package/dist/extensions/Blocks/Recommendation/utils/blockUrlConfig.js +25 -0
  12. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +46 -25
  13. package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +40 -17
  14. package/dist/src/config/compiler/utils/itemsCompilerUtils.d.ts +5 -0
  15. package/dist/src/extensions/Blocks/Items/block.d.ts +5 -0
  16. package/dist/src/extensions/Blocks/Items/constants/cardWidth.d.ts +12 -0
  17. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +2 -0
  18. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
  19. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +18 -5
  20. package/dist/src/extensions/Blocks/Recommendation/utils/blockUrlConfig.d.ts +4 -0
  21. package/dist/src/extensions/Blocks/Recommendation/utils/nodeConfigWriter.d.ts +3 -1
  22. package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +7 -0
  23. package/dist/src/utils/liquidProtection.d.ts +3 -0
  24. package/dist/utils/liquidProtection.js +5 -0
  25. package/dist/utils/templatePreparation.js +61 -85
  26. package/package.json +1 -1
@@ -1,32 +1,33 @@
1
1
  var k = Object.defineProperty;
2
- var D = (l, a, t) => a in l ? k(l, a, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[a] = t;
3
- var y = (l, a, t) => D(l, typeof a != "symbol" ? a + "" : a, t);
4
- import { BlockId as N } from "../../../enums/block.js";
2
+ var S = (d, l, e) => l in d ? k(d, l, { enumerable: !0, configurable: !0, writable: !0, value: e }) : d[l] = e;
3
+ var g = (d, l, e) => S(d, typeof l != "symbol" ? l + "" : l, e);
4
+ import { BlockId as D } from "../../../enums/block.js";
5
5
  import { useOnboardingStore as T } from "../../../stores/onboarding.js";
6
- import { getMigrationBannerHtml as S } from "../../../utils/migrationBannerHtml.js";
7
- import { Block as A, BlockCompositionType as M, ModificationDescription as u } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
8
- import { currencyAttrTargets as H, ITEMS_CURRENCY_ATTR as m } from "./constants/currency.js";
9
- import { ItemsBlockId as R } from "./enums/controlEnums.js";
10
- import { SETTINGS_ENUMS as C, DefaultConfigValues as g } from "./enums/settingsEnums.js";
6
+ import { getMigrationBannerHtml as N } from "../../../utils/migrationBannerHtml.js";
7
+ import { Block as H, BlockCompositionType as R, ModificationDescription as u } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
8
+ import { PRODUCT_WRAPPER_SELECTOR as M, isZeroWidthValue as m } from "./constants/cardWidth.js";
9
+ import { currencyAttrTargets as w, ITEMS_CURRENCY_ATTR as y } from "./constants/currency.js";
10
+ import { ItemsBlockId as E } from "./enums/controlEnums.js";
11
+ import { SETTINGS_ENUMS as b, DefaultConfigValues as p } from "./enums/settingsEnums.js";
11
12
  import { getDefaultTemplate as O } from "./template.js";
12
- import { getItemsBlockContainer as b, getItemsBlockConfig as h, deriveItemNumber as B, generateBlockInstanceId as E, getDefaultItemsBlockConfig as w } from "./utils/nodeConfigUtils.js";
13
- const _ = N.Items, P = "Reconcile Items currency DOM attributes";
14
- class K extends A {
13
+ import { getItemsBlockContainer as _, getItemsBlockConfig as C, deriveItemNumber as B, generateBlockInstanceId as P, getDefaultItemsBlockConfig as v } from "./utils/nodeConfigUtils.js";
14
+ const A = D.Items, V = "Reconcile Items currency DOM attributes";
15
+ class $ extends H {
15
16
  constructor() {
16
17
  super(...arguments);
17
18
  /** Block instances whose currency attrs were already self-healed this session (SD-147588 — undo-safe). */
18
- y(this, "_currencyHealed", /* @__PURE__ */ new Set());
19
+ g(this, "_currencyHealed", /* @__PURE__ */ new Set());
19
20
  /** blockInstanceIds already claimed by a live block this session (SD-147588 collision detection). */
20
- y(this, "_seenInstanceIds", /* @__PURE__ */ new Set());
21
+ g(this, "_seenInstanceIds", /* @__PURE__ */ new Set());
21
22
  }
22
23
  getId() {
23
- return _;
24
+ return A;
24
25
  }
25
26
  getIcon() {
26
27
  return "items-icon";
27
28
  }
28
29
  getBlockCompositionType() {
29
- return M.CONTAINER;
30
+ return R.CONTAINER;
30
31
  }
31
32
  getName() {
32
33
  return this.api.translate("Items");
@@ -35,20 +36,20 @@ class K extends A {
35
36
  return this.api.translate("Items lets you display personalized products based on user behavior.");
36
37
  }
37
38
  getSettingsPanelTitleHtml() {
38
- return S(
39
- _,
39
+ return N(
40
+ A,
40
41
  this.api.translate("Items"),
41
42
  this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.")
42
43
  );
43
44
  }
44
45
  getTemplate() {
45
46
  return O({
46
- orientation: C.ORIENTATION.VERTICAL,
47
- itemsType: C.ITEMS_TYPE.CART_ITEMS,
47
+ orientation: b.ORIENTATION.VERTICAL,
48
+ itemsType: b.ITEMS_TYPE.CART_ITEMS,
48
49
  itemId: "{{Abandoned Cart Item (1) Url}}",
49
- currencySymbol: g.productPriceCurrencySymbolControlValue,
50
- currencyLocation: g.productPriceCurrencyLocationControlValue,
51
- formattedPrice: g.productPriceFormattedControlValue === "1"
50
+ currencySymbol: p.productPriceCurrencySymbolControlValue,
51
+ currencyLocation: p.productPriceCurrencyLocationControlValue,
52
+ formattedPrice: p.productPriceFormattedControlValue === "1"
52
53
  });
53
54
  }
54
55
  allowInnerBlocksDND() {
@@ -57,27 +58,27 @@ class K extends A {
57
58
  canBeSavedAsModule() {
58
59
  return !0;
59
60
  }
60
- onCreated(t) {
61
- const o = this.api.getDocumentModifier(), c = this.api.getDocumentRootCssNode();
62
- c.querySelector('[product-attr="imageSrc"] img') || o.modifyCss(c).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
63
- const i = b(t);
64
- if (!i)
61
+ onCreated(e) {
62
+ const t = this.api.getDocumentModifier(), c = this.api.getDocumentRootCssNode();
63
+ c.querySelector('[product-attr="imageSrc"] img') || t.modifyCss(c).appendRule('[product-attr="imageSrc"] img {object-fit: contain;}');
64
+ const r = _(e);
65
+ if (!r)
65
66
  return;
66
- const r = i.getNodeConfig(), s = r && Object.keys(r).length > 0, e = h(t);
67
- if (e != null && e.initialized) {
67
+ const o = r.getNodeConfig(), s = o && Object.keys(o).length > 0, i = C(e);
68
+ if (i != null && i.initialized) {
68
69
  if (!s) {
69
- const d = this.api.getDocumentModifier();
70
- d.modifyHtml(i).setNodeConfig(e), this._stampProductTdDomAttributes(i, e, d), this._shouldReconcileCurrency(e) && this._reconcileCurrencyDomAttributes(i, e, d), d.apply(new u("Migrate legacy config to nodeConfig")), this._markCurrencyHealed(e.blockInstanceId);
70
+ const a = this.api.getDocumentModifier();
71
+ a.modifyHtml(r).setNodeConfig(i), this._stampProductTdDomAttributes(r, i, a), this._healCollapsedWidths(r, a), this._shouldReconcileCurrency(i) && this._reconcileCurrencyDomAttributes(r, i, a), a.apply(new u("Migrate legacy config to nodeConfig")), this._markCurrencyHealed(i.blockInstanceId);
71
72
  return;
72
73
  }
73
74
  } else {
74
- const d = w(), p = this.api.getDocumentModifier();
75
- p.modifyHtml(i).setNodeConfig(d), this._stampProductTdDomAttributes(i, d, p, !0), p.apply(new u("Initialize Items block with default configuration")), T().startOnboarding("itemsOnboarding");
75
+ const a = v(), I = this.api.getDocumentModifier();
76
+ I.modifyHtml(r).setNodeConfig(a), this._stampProductTdDomAttributes(r, a, I, !0), I.apply(new u("Initialize Items block with default configuration")), T().startOnboarding("itemsOnboarding");
76
77
  return;
77
78
  }
78
- const n = this._resolveInstanceId(e.blockInstanceId), f = this.api.getDocumentModifier();
79
- let I = !1;
80
- n !== e.blockInstanceId && (f.modifyHtml(i).setNodeConfig({ ...e, blockInstanceId: n }), I = !0), !this._currencyHealed.has(n) && this._reconcileCurrencyDomAttributes(i, e, f) && (I = !0), I && f.apply(new u("Assign Items block instance ID and reconcile currency")), this._markCurrencyHealed(n);
79
+ const n = this._resolveInstanceId(i.blockInstanceId), f = this.api.getDocumentModifier();
80
+ let h = !1;
81
+ n !== i.blockInstanceId && (f.modifyHtml(r).setNodeConfig({ ...i, blockInstanceId: n }), h = !0), !this._currencyHealed.has(n) && this._reconcileCurrencyDomAttributes(r, i, f) && (h = !0), this._healCollapsedWidths(r, f) && (h = !0), h && f.apply(new u("Assign Items block instance ID and reconcile currency")), this._markCurrencyHealed(n);
81
82
  }
82
83
  /**
83
84
  * Re-seeds nodeConfig from the persisted esd-ext-config when a saved module
@@ -85,24 +86,24 @@ class K extends A {
85
86
  * into nodeConfig, so without this a reused module would reset to defaults.
86
87
  * Guarded to the nodeConfig-empty case so it runs once and never loops.
87
88
  */
88
- onDocumentChanged(t) {
89
- const o = b(t);
90
- if (!o)
89
+ onDocumentChanged(e) {
90
+ const t = _(e);
91
+ if (!t)
91
92
  return;
92
- const c = o.getNodeConfig();
93
+ const c = t.getNodeConfig();
93
94
  if (c && Object.keys(c).length > 0) {
94
- const e = h(t);
95
- if (e != null && e.initialized && this._shouldReconcileCurrency(e)) {
95
+ const i = C(e);
96
+ if (i != null && i.initialized && this._shouldReconcileCurrency(i)) {
96
97
  const n = this.api.getDocumentModifier();
97
- this._reconcileCurrencyDomAttributes(o, e, n) && n.apply(new u(P)), this._markCurrencyHealed(e.blockInstanceId);
98
+ this._reconcileCurrencyDomAttributes(t, i, n) && n.apply(new u(V)), this._markCurrencyHealed(i.blockInstanceId);
98
99
  }
99
100
  return;
100
101
  }
101
- const r = h(t);
102
- if (!(r != null && r.initialized))
102
+ const o = C(e);
103
+ if (!(o != null && o.initialized))
103
104
  return;
104
105
  const s = this.api.getDocumentModifier();
105
- s.modifyHtml(o).setNodeConfig(r), this._stampProductTdDomAttributes(o, r, s), this._shouldReconcileCurrency(r) && this._reconcileCurrencyDomAttributes(o, r, s), s.apply(new u("Recover Items block config from saved module")), this._markCurrencyHealed(r.blockInstanceId);
106
+ s.modifyHtml(t).setNodeConfig(o), this._stampProductTdDomAttributes(t, o, s), this._healCollapsedWidths(t, s), this._shouldReconcileCurrency(o) && this._reconcileCurrencyDomAttributes(t, o, s), s.apply(new u("Recover Items block config from saved module")), this._markCurrencyHealed(o.blockInstanceId);
106
107
  }
107
108
  /**
108
109
  * Bakes the compiler-read DOM attributes (`data-type`, `data-number`, `data-nodup`) onto the
@@ -112,11 +113,21 @@ class K extends A {
112
113
  * restored before export. The name `<a>` carries no data-type/data-number of its own and
113
114
  * relies on this td-level fallback in pairProductVariables.
114
115
  */
115
- _stampProductTdDomAttributes(t, o, c, i = !1) {
116
- const r = B(o.itemsSelectValue, o.type), s = (e, n) => {
117
- i && t.getAttribute(e) || c.modifyHtml(t).setAttribute(e, n);
116
+ _stampProductTdDomAttributes(e, t, c, r = !1) {
117
+ const o = B(t.itemsSelectValue, t.type), s = (i, n) => {
118
+ r && e.getAttribute(i) || c.modifyHtml(e).setAttribute(i, n);
118
119
  };
119
- s("data-type", o.type), s("data-number", r), s("data-nodup", String(o.priceHideDiscount));
120
+ s("data-type", t.type), s("data-number", o), s("data-nodup", String(t.priceHideDiscount));
121
+ }
122
+ /**
123
+ * Repairs a saved module's collapsed card into the state the load migrator produces. Acts only
124
+ * on a zero width, so Stripo's non-zero drop-time width never triggers it and a healed block no-ops.
125
+ */
126
+ _healCollapsedWidths(e, t) {
127
+ const r = e.querySelectorAll(M).filter((o) => m(o.getAttribute("width")) || m(o.getStyle("width")));
128
+ return !m(e.getAttribute("width")) && !r.length ? !1 : (e.hasClass("esd-container-frame") && t.modifyHtml(e).removeClass("esd-container-frame"), e.getAttribute("width") !== null && t.modifyHtml(e).removeAttribute("width"), r.forEach((o) => {
129
+ m(o.getAttribute("width")) && t.modifyHtml(o).setAttribute("width", "100%"), m(o.getStyle("width")) && t.modifyHtml(o).setStyle("width", "100%");
130
+ }), !0);
120
131
  }
121
132
  /**
122
133
  * Whether a currency self-heal pass should run for this block (SD-147588). The only gate here is
@@ -126,12 +137,12 @@ class K extends A {
126
137
  * the symbol write alone is skipped for the 'USD' sentinel — so we must NOT gate the whole pass
127
138
  * on symbol customization here, or a default-symbol block with a toggled location never heals.
128
139
  */
129
- _shouldReconcileCurrency(t) {
130
- return !t.blockInstanceId || !this._currencyHealed.has(t.blockInstanceId);
140
+ _shouldReconcileCurrency(e) {
141
+ return !e.blockInstanceId || !this._currencyHealed.has(e.blockInstanceId);
131
142
  }
132
143
  /** Marks a block instance's currency as reconciled so it is not healed again (undo-safe). */
133
- _markCurrencyHealed(t) {
134
- t && this._currencyHealed.add(t);
144
+ _markCurrencyHealed(e) {
145
+ e && this._currencyHealed.add(e);
135
146
  }
136
147
  /**
137
148
  * Resolves the id for a just-created block to one that is unique per live instance.
@@ -140,13 +151,13 @@ class K extends A {
140
151
  * currency heal guard and settings-panel switch detection. Mint a fresh id on absence
141
152
  * or collision, otherwise keep the existing one. Registers the result as claimed.
142
153
  */
143
- _resolveInstanceId(t) {
144
- let o = t;
145
- if (!o || this._seenInstanceIds.has(o))
154
+ _resolveInstanceId(e) {
155
+ let t = e;
156
+ if (!t || this._seenInstanceIds.has(t))
146
157
  do
147
- o = E();
148
- while (this._seenInstanceIds.has(o));
149
- return this._seenInstanceIds.add(o), o;
158
+ t = P();
159
+ while (this._seenInstanceIds.has(t));
160
+ return this._seenInstanceIds.add(t), t;
150
161
  }
151
162
  /**
152
163
  * Stamps the export-read currency attrs onto every price `<p>` from config, so a template whose
@@ -159,15 +170,15 @@ class K extends A {
159
170
  * Returns true only when an attr actually changed, so the caller can skip an empty apply that
160
171
  * would otherwise re-trigger onDocumentChanged and loop.
161
172
  */
162
- _reconcileCurrencyDomAttributes(t, o, c) {
163
- const { position: i, symbol: r } = H(o), s = t.querySelectorAll(`.${R.PRICE} p`);
164
- let e = !1;
173
+ _reconcileCurrencyDomAttributes(e, t, c) {
174
+ const { position: r, symbol: o } = w(t), s = e.querySelectorAll(`.${E.PRICE} p`);
175
+ let i = !1;
165
176
  return s.forEach((n) => {
166
- i !== void 0 && n.getAttribute(m.POSITION) !== i && (c.modifyHtml(n).setAttribute(m.POSITION, i), e = !0), r !== void 0 && n.getAttribute(m.SYMBOL) !== r && (c.modifyHtml(n).setAttribute(m.SYMBOL, r), e = !0);
167
- }), e;
177
+ r !== void 0 && n.getAttribute(y.POSITION) !== r && (c.modifyHtml(n).setAttribute(y.POSITION, r), i = !0), o !== void 0 && n.getAttribute(y.SYMBOL) !== o && (c.modifyHtml(n).setAttribute(y.SYMBOL, o), i = !0);
178
+ }), i;
168
179
  }
169
180
  }
170
181
  export {
171
- _ as BLOCK_ID,
172
- K as ItemsBlock
182
+ A as BLOCK_ID,
183
+ $ as ItemsBlock
173
184
  };
@@ -0,0 +1,20 @@
1
+ const R = ".ins-product-td", T = ".ins-product-wrapper", s = "width: 100%", c = /(^|;)\s*width\s*:\s*0(?:px|%)?\s*(?:!important)?\s*(?=;|$)/i, n = new RegExp(c.source, "gi"), o = /(^|;)\s*width\s*:/i, _ = /^0(?:px|%)?$/i, a = (t) => _.test((t ?? "").trim()), E = (t) => c.test(t), h = (t) => {
2
+ if (E(t))
3
+ return t.replace(
4
+ n,
5
+ (i, e) => `${e}${e ? " " : ""}${s}`
6
+ );
7
+ if (o.test(t))
8
+ return t;
9
+ const r = t.trim();
10
+ return r ? r.endsWith(";") ? `${r} ${s};` : `${r}; ${s};` : `${s};`;
11
+ }, p = (t) => t.replace(n, (r, i) => i).replace(/;{2,}/g, ";").replace(/^\s*;\s*/, "").replace(/;\s*$/, "").trim();
12
+ export {
13
+ R as PRODUCT_TD_SELECTOR,
14
+ T as PRODUCT_WRAPPER_SELECTOR,
15
+ s as WIDTH_PIN_DECLARATION,
16
+ E as hasZeroWidthDeclaration,
17
+ a as isZeroWidthValue,
18
+ h as withWidthPin,
19
+ p as withoutZeroWidth
20
+ };
@@ -1,5 +1,5 @@
1
1
  const t = `{-{-TEMPLATE_FIRST_LINE-}-}
2
- <table class="es-left ins-product-wrapper" cellspacing="0" cellpadding="0" align="left" width="100%">
2
+ <table class="es-left ins-product-wrapper" cellspacing="0" cellpadding="0" align="left" width="100%" style="width: 100%;">
3
3
  <tbody>
4
4
  <tr>
5
5
  <td class="es-p20b es-p10r es-p10l es-m-p20b es-p10t" width="100%" align="center">
@@ -1,30 +1,34 @@
1
- var y = Object.defineProperty;
2
- var A = (l, c, t) => c in l ? y(l, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[c] = t;
3
- var h = (l, c, t) => A(l, typeof c != "symbol" ? c + "" : c, t);
4
- import { useConfig as d } from "../../../composables/useConfig.js";
5
- import { BlockId as D } from "../../../enums/block.js";
6
- import { getMigrationBannerHtml as C } from "../../../utils/migrationBannerHtml.js";
1
+ var B = Object.defineProperty;
2
+ var b = (a, l, t) => l in a ? B(a, l, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[l] = t;
3
+ var d = (a, l, t) => b(a, typeof l != "symbol" ? l + "" : l, t);
4
+ import { useConfig as g } from "../../../composables/useConfig.js";
5
+ import { BlockId as C } from "../../../enums/block.js";
6
+ import { getMigrationBannerHtml as A } from "../../../utils/migrationBannerHtml.js";
7
7
  import { Block as E, BlockCompositionType as S, ModificationDescription as p } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
8
- import { CURRENT_CONFIG_VERSION as N, PRE_RRS_CONFIG_VERSION as O } from "./constants/defaultConfig.js";
8
+ import { CURRENT_CONFIG_VERSION as N, PRE_RRS_CONFIG_VERSION as w } from "./constants/defaultConfig.js";
9
9
  import { RECOMMENDATION_ID_ATTR as m } from "./constants/selectors.js";
10
10
  import { regenerateMobileProductRows as M } from "./controls/main/utils.js";
11
- import { ensureMobileCssRulesExist as I, setMobileLayoutOptOut as R, hasMobileLayoutOptOut as w } from "./controls/mobileLayout/cssRules.js";
11
+ import { ensureMobileCssRulesExist as I, setMobileLayoutOptOut as R, hasMobileLayoutOptOut as O } from "./controls/mobileLayout/cssRules.js";
12
12
  import { RecommendationConfigService as s } from "./services/configService.js";
13
- import { useRecommendationExtensionStore as g } from "./store/recommendation.js";
14
- import { getDefaultTemplate as T } from "./templates/grid/template.js";
15
- import { useRecommendationBlockWarning as v } from "./useRecommendationBlockWarning.js";
16
- const k = D.Recommendation, u = "recommendation-block-v2", B = "hide-price";
17
- let b = !1;
18
- class j extends E {
13
+ import { useRecommendationExtensionStore as h } from "./store/recommendation.js";
14
+ import { getDefaultTemplate as x } from "./templates/grid/template.js";
15
+ import { useRecommendationBlockWarning as T } from "./useRecommendationBlockWarning.js";
16
+ import { registerNodeConfigWriter as H } from "./utils/nodeConfigWriter.js";
17
+ import { refreshDuplicatedStrategyBlocks as $ } from "./utils/strategyCommit.js";
18
+ const k = C.Recommendation, u = "recommendation-block-v2", D = "hide-price";
19
+ let y = !1;
20
+ class Y extends E {
19
21
  constructor() {
20
22
  super();
21
23
  /**
22
24
  * Stores the ID generated in getTemplate() so onCreated() can reuse it.
23
25
  * This avoids generating a new (different) ID in onCreated().
24
26
  */
25
- h(this, "_pendingBlockId", null);
27
+ d(this, "_pendingBlockId", null);
26
28
  /** Ids already reset under their new name, so the deferred pass skips their stale snapshot. */
27
- h(this, "_resetSourceIds", /* @__PURE__ */ new Set());
29
+ d(this, "_resetSourceIds", /* @__PURE__ */ new Set());
30
+ /** Ids handed to duplicates the document root does not show yet: a copied module renames all its blocks at once. */
31
+ d(this, "_unsettledDuplicateIds", /* @__PURE__ */ new Set());
28
32
  }
29
33
  getId() {
30
34
  return k;
@@ -44,7 +48,7 @@ class j extends E {
44
48
  );
45
49
  }
46
50
  getSettingsPanelTitleHtml() {
47
- return C(
51
+ return A(
48
52
  k,
49
53
  this.api.translate("Recommendation Block"),
50
54
  this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.")
@@ -68,7 +72,7 @@ class j extends E {
68
72
  */
69
73
  getTemplate() {
70
74
  const t = this._generateNextId();
71
- return this._pendingBlockId = t, T(t);
75
+ return this._pendingBlockId = t, x(t);
72
76
  }
73
77
  /**
74
78
  * Called when a new block is dropped into the template
@@ -91,20 +95,20 @@ class j extends E {
91
95
  }
92
96
  const i = this._pendingBlockId ?? this._generateNextId();
93
97
  this._pendingBlockId = null, this._assignRecommendationId(t, i);
94
- const n = d().isFeatureEnabled("reusableRecommendationStrategy"), o = n && !s.hasConfig(t), { config: r, wasFreshDrop: a } = s.initializeConfig(
98
+ const n = g().isFeatureEnabled("reusableRecommendationStrategy"), o = n && !s.hasConfig(t), { config: r, wasFreshDrop: c } = s.initializeConfig(
95
99
  this.api,
96
100
  t,
97
101
  {
98
102
  recommendationId: i,
99
- configVersion: n ? N : O,
100
- ...o ? { partnerName: d().partnerName.value } : {},
103
+ configVersion: n ? N : w,
104
+ ...o ? { partnerName: g().partnerName.value } : {},
101
105
  // An RRS block picks a strategy, not an algorithm, and its algorithm control is
102
106
  // hidden. Keeping the `mostPopular` default would bake a most-popular feed URL
103
107
  // at save for a block the user never configured.
104
108
  ...o ? { strategy: "" } : {}
105
109
  }
106
- ), f = g();
107
- if (f.setCurrentBlock(i), this._stampHidePrice(t, r.priceHideIfSameAsDiscounted), a) {
110
+ ), f = h();
111
+ if (f.setCurrentBlock(i), this._stampHidePrice(t, r.priceHideIfSameAsDiscounted), c) {
108
112
  I(this.api);
109
113
  const _ = this._getBlockElement(t);
110
114
  _ && (R(this.api, _, !0), M({
@@ -134,11 +138,11 @@ class j extends E {
134
138
  }
135
139
  this._healLingeringDuplicate(t), s.needsMigration(t) && this._migrateFromLegacy(t), this._healHidePriceAttr(t);
136
140
  try {
137
- b || (I(this.api), b = !0);
141
+ y || (I(this.api), y = !0);
138
142
  const e = s.getConfig(t), i = this._getBlockElement(t);
139
143
  if (i) {
140
144
  const n = !e.mobileLayoutEnabled;
141
- w(i) !== n && R(this.api, i, n);
145
+ O(i) !== n && R(this.api, i, n);
142
146
  }
143
147
  } catch {
144
148
  }
@@ -152,7 +156,7 @@ class j extends E {
152
156
  */
153
157
  onDelete(t) {
154
158
  const e = this._getRecommendationId(t);
155
- e && g().removeBlockState(e);
159
+ e && h().removeBlockState(e);
156
160
  }
157
161
  /**
158
162
  * Warns (dark advisory toaster) when the design holds more than one live
@@ -168,7 +172,7 @@ class j extends E {
168
172
  */
169
173
  _warnIfMultipleBlocks() {
170
174
  try {
171
- v().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
175
+ T().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
172
176
  } catch {
173
177
  }
174
178
  }
@@ -178,17 +182,20 @@ class j extends E {
178
182
  */
179
183
  _generateNextId() {
180
184
  let t = 0;
185
+ const e = /* @__PURE__ */ new Set();
181
186
  try {
182
- const e = this.api.getDocumentRoot();
183
- e && "querySelectorAll" in e && e.querySelectorAll(`.${u}`).forEach((n) => {
184
- if ("getAttribute" in n) {
185
- const o = n.getAttribute(m), r = o ? parseInt(o) : 0;
186
- r > t && (t = r);
187
+ const i = this.api.getDocumentRoot();
188
+ i && "querySelectorAll" in i && i.querySelectorAll(`.${u}`).forEach((o) => {
189
+ if ("getAttribute" in o) {
190
+ const r = o.getAttribute(m), c = r ? parseInt(r) : 0;
191
+ e.add(c), c > t && (t = c);
187
192
  }
188
193
  });
189
194
  } catch {
190
195
  }
191
- return t + 1;
196
+ return this._unsettledDuplicateIds.forEach((i) => {
197
+ e.has(i) && this._unsettledDuplicateIds.delete(i);
198
+ }), Math.max(t, ...this._unsettledDuplicateIds) + 1;
192
199
  }
193
200
  /**
194
201
  * Drops the "already fetched" claims of a block that arrived holding a baked id
@@ -198,9 +205,9 @@ class j extends E {
198
205
  * the renamed one depending on where the module was dropped (SD-149916).
199
206
  */
200
207
  _scheduleArrivalReset(t) {
201
- d().isFeatureEnabled("reusableRecommendationStrategy") && setTimeout(() => {
208
+ g().isFeatureEnabled("reusableRecommendationStrategy") && setTimeout(() => {
202
209
  const e = this._getRecommendationId(t);
203
- e !== null && e > 0 && !this._resetSourceIds.delete(e) && g().resetArrivedBlock(e);
210
+ e !== null && e > 0 && !this._resetSourceIds.delete(e) && h().resetArrivedBlock(e);
204
211
  }, 0);
205
212
  }
206
213
  /**
@@ -231,9 +238,9 @@ class j extends E {
231
238
  if (!o)
232
239
  return;
233
240
  let r = -1;
234
- for (let a = 0; a < n.length; a++)
235
- if (n[a] === o) {
236
- r = a;
241
+ for (let c = 0; c < n.length; c++)
242
+ if (n[c] === o) {
243
+ r = c;
237
244
  break;
238
245
  }
239
246
  if (r <= 0)
@@ -256,8 +263,8 @@ class j extends E {
256
263
  }
257
264
  /** Assigns a fresh id to a duplicated block and syncs DOM, node config and store. */
258
265
  _handleDuplicate(t, e) {
259
- const i = this._reassignDuplicateId(t, e), n = g();
260
- n.cloneBlockState(e, i), n.setCurrentBlock(i), d().isFeatureEnabled("reusableRecommendationStrategy") && (this._resetSourceIds.add(e), n.resetArrivedBlock(i)), this._warnIfMultipleBlocks();
266
+ const i = this._reassignDuplicateId(t, e), n = h();
267
+ n.cloneBlockState(e, i), n.setCurrentBlock(i), g().isFeatureEnabled("reusableRecommendationStrategy") && (this._resetSourceIds.add(e), H(this.api), $(e, i, s.getConfig(t)).catch((o) => console.error("[recommendation] refreshing a duplicated strategy failed", o))), this._warnIfMultipleBlocks();
261
268
  }
262
269
  /**
263
270
  * Core id-reassignment for a duplicated block: rewrites the DOM
@@ -272,7 +279,7 @@ class j extends E {
272
279
  */
273
280
  _reassignDuplicateId(t, e) {
274
281
  const i = this._generateNextId(), n = this._getBlockElement(t);
275
- return this._assignRecommendationId(t, i), n && this._reassignInstanceClass(n, e, i), s.hasConfig(t) && s.updateConfig(
282
+ return this._unsettledDuplicateIds.add(i), this._assignRecommendationId(t, i), n && this._reassignInstanceClass(n, e, i), s.hasConfig(t) && s.updateConfig(
276
283
  this.api,
277
284
  t,
278
285
  { recommendationId: i },
@@ -313,7 +320,7 @@ class j extends E {
313
320
  */
314
321
  _stampHidePrice(t, e) {
315
322
  const i = this._getBlockElement(t);
316
- i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(B, String(e)).apply(new p("Stamp hide-price"));
323
+ i && this.api.getDocumentModifier().modifyHtml(i).setAttribute(D, String(e)).apply(new p("Stamp hide-price"));
317
324
  }
318
325
  /**
319
326
  * Stamps `hide-price` from config only when the block lacks the attribute —
@@ -321,7 +328,7 @@ class j extends E {
321
328
  */
322
329
  _healHidePriceAttr(t) {
323
330
  const e = this._getBlockElement(t);
324
- if (!e || !("getAttribute" in e) || e.getAttribute(B) !== null)
331
+ if (!e || !("getAttribute" in e) || e.getAttribute(D) !== null)
325
332
  return;
326
333
  const { priceHideIfSameAsDiscounted: i } = s.getConfig(t);
327
334
  this._stampHidePrice(t, i);
@@ -359,5 +366,5 @@ class j extends E {
359
366
  }
360
367
  export {
361
368
  k as BLOCK_ID,
362
- j as RecommendationBlock
369
+ Y as RecommendationBlock
363
370
  };