@useinsider/guido 3.19.0-beta.892c3ca → 3.19.0-beta.9fe04f1

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 (78) hide show
  1. package/README.md +0 -1
  2. package/dist/@types/config/schemas.js +118 -107
  3. package/dist/components/Guido.vue.js +9 -9
  4. package/dist/components/Guido.vue2.js +77 -69
  5. package/dist/components/organisms/AutoSaveController.vue2.js +8 -9
  6. package/dist/components/organisms/base/AuthErrorModal.vue.js +18 -0
  7. package/dist/components/organisms/base/AuthErrorModal.vue2.js +42 -0
  8. package/dist/components/organisms/header/EditorActions.vue.js +2 -2
  9. package/dist/components/organisms/header/EditorActions.vue2.js +55 -90
  10. package/dist/components/organisms/header/LeftSlot.vue.js +5 -5
  11. package/dist/components/organisms/header/LeftSlot.vue2.js +12 -16
  12. package/dist/components/wrappers/WpDrawer.vue.js +7 -9
  13. package/dist/components/wrappers/WpDrawer.vue2.js +1 -1
  14. package/dist/components/wrappers/WpModal.vue.js +1 -1
  15. package/dist/components/wrappers/WpModal.vue2.js +4 -3
  16. package/dist/composables/useAuthError.js +52 -0
  17. package/dist/composables/useCortexBlueprintBridge.js +122 -54
  18. package/dist/composables/useEmailTemplateApplier.js +106 -50
  19. package/dist/composables/useHtmlCompiler.js +26 -37
  20. package/dist/composables/useHtmlValidator.js +0 -2
  21. package/dist/composables/useHttp.js +64 -54
  22. package/dist/composables/useLegacyStrategyConversion.js +23 -19
  23. package/dist/composables/useSave.js +45 -90
  24. package/dist/composables/useStripo.js +24 -20
  25. package/dist/composables/useToaster.js +17 -15
  26. package/dist/composables/validators/useCouponBlockValidator.js +21 -24
  27. package/dist/composables/validators/useLiquidValidator.js +15 -15
  28. package/dist/composables/validators/useUnsubscribeBlockValidator.js +27 -34
  29. package/dist/config/migrator/index.js +14 -13
  30. package/dist/config/migrator/recommendationPartnerMigrator.js +50 -0
  31. package/dist/enums/extensions/recommendationBlock.js +30 -29
  32. package/dist/extensions/Blocks/Recommendation/block.js +15 -14
  33. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +45 -38
  34. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +72 -49
  35. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +30 -29
  36. package/dist/extensions/Blocks/Recommendation/utils/partnerScope.js +25 -0
  37. package/dist/guido.css +1 -1
  38. package/dist/src/@types/config/schemas.d.ts +16 -4
  39. package/dist/src/components/Guido.vue.d.ts +1 -17
  40. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -17
  41. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -17
  42. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -17
  43. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +3 -4
  44. package/dist/src/components/wrappers/WpModal.vue.d.ts +5 -1
  45. package/dist/src/composables/useAuthError.d.ts +12 -0
  46. package/dist/src/composables/useConfig.d.ts +2 -2
  47. package/dist/src/composables/useCortexBlueprintBridge.d.ts +2 -3
  48. package/dist/src/composables/useEmailTemplateApplier.d.ts +18 -5
  49. package/dist/src/composables/useHtmlValidator.d.ts +0 -21
  50. package/dist/src/composables/useHttp.d.ts +2 -0
  51. package/dist/src/composables/useSave.d.ts +1 -6
  52. package/dist/src/composables/validators/useCouponBlockValidator.d.ts +0 -3
  53. package/dist/src/composables/validators/useUnsubscribeBlockValidator.d.ts +0 -10
  54. package/dist/src/config/migrator/index.d.ts +2 -1
  55. package/dist/src/config/migrator/recommendationPartnerMigrator.d.ts +19 -0
  56. package/dist/src/enums/extensions/recommendationBlock.d.ts +1 -1
  57. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +6 -0
  58. package/dist/src/extensions/Blocks/Recommendation/utils/partnerScope.d.ts +33 -0
  59. package/dist/src/stores/config.d.ts +20 -32
  60. package/dist/src/stores/guido-email-editor.d.ts +20 -10
  61. package/dist/src/utils/templatePreparation.d.ts +0 -30
  62. package/dist/static/styles/components/recommendation-strategy.css.js +9 -0
  63. package/dist/stores/config.js +67 -84
  64. package/dist/stores/guido-email-editor.js +3 -1
  65. package/dist/utils/templatePreparation.js +36 -39
  66. package/package.json +1 -1
  67. package/dist/components/organisms/validation/ValidationErrorDrawer.vue.js +0 -20
  68. package/dist/components/organisms/validation/ValidationErrorDrawer.vue2.js +0 -49
  69. package/dist/composables/useSaveValidation.js +0 -282
  70. package/dist/composables/useSaveValidationRollout.js +0 -9
  71. package/dist/enums/save-validation.js +0 -4
  72. package/dist/src/@types/save-validation.d.ts +0 -19
  73. package/dist/src/composables/useSaveValidation.d.ts +0 -6
  74. package/dist/src/composables/useSaveValidationRollout.d.ts +0 -3
  75. package/dist/src/enums/save-validation.d.ts +0 -27
  76. package/dist/src/stores/save-validation.d.ts +0 -22
  77. package/dist/stores/save-validation.js +0 -30
  78. /package/dist/src/components/organisms/{validation/ValidationErrorDrawer.vue.d.ts → base/AuthErrorModal.vue.d.ts} +0 -0
@@ -1,19 +1,17 @@
1
1
  import r from "./WpDrawer.vue2.js";
2
2
  import s from "../../_virtual/_plugin-vue2_normalizer.js";
3
3
  var u = function() {
4
- var t = this, o = t._self._c, e = t._self._setupProxy;
5
- return o(e.InDrawer, { class: t.className, attrs: { id: t.id, "footer-status": "", "close-on-outside-click": t.closeOnOutsideClick, "description-status": t.descriptionStatus, "description-text": t.descriptionText, "footer-button-group-options": t.footerButtonGroupOptions, size: t.size, status: t.status, "title-text": t.titleText }, on: { cancelOrBackButtonEvent: function(n) {
4
+ var t = this, n = t._self._c, e = t._self._setupProxy;
5
+ return n(e.InDrawer, { class: t.className, attrs: { id: t.id, "footer-status": "", "close-on-outside-click": t.closeOnOutsideClick, "description-status": t.descriptionStatus, "description-text": t.descriptionText, "footer-button-group-options": t.footerButtonGroupOptions, size: t.size, status: t.status, "title-text": t.titleText }, on: { cancelOrBackButtonEvent: function(o) {
6
6
  return e.emit("cancelOrBackButtonEvent");
7
- }, onCloseEvent: function(n) {
7
+ }, onCloseEvent: function(o) {
8
8
  return e.emit("onCloseEvent");
9
- }, primaryButtonEvent: function(n) {
9
+ }, primaryButtonEvent: function(o) {
10
10
  return e.emit("primaryButtonEvent");
11
- }, secondaryButtonEvent: function(n) {
12
- return e.emit("secondaryButtonEvent");
13
11
  } }, scopedSlots: t._u([t.$slots.headerBottomSlot ? { key: "headerBottomSlot", fn: function() {
14
12
  return [t._t("headerBottomSlot")];
15
13
  }, proxy: !0 } : null, { key: "contentSlot", fn: function() {
16
- return [o("div", [t._t("default")], 2)];
14
+ return [n("div", [t._t("default")], 2)];
17
15
  }, proxy: !0 }], null, !0) });
18
16
  }, i = [], c = /* @__PURE__ */ s(
19
17
  r,
@@ -23,7 +21,7 @@ var u = function() {
23
21
  null,
24
22
  null
25
23
  );
26
- const p = c.exports;
24
+ const f = c.exports;
27
25
  export {
28
- p as default
26
+ f as default
29
27
  };
@@ -13,7 +13,7 @@ const r = /* @__PURE__ */ e({
13
13
  status: { type: Boolean },
14
14
  titleText: null
15
15
  },
16
- emits: ["cancelOrBackButtonEvent", "onCloseEvent", "primaryButtonEvent", "secondaryButtonEvent"],
16
+ emits: ["cancelOrBackButtonEvent", "onCloseEvent", "primaryButtonEvent"],
17
17
  setup(n, { emit: t }) {
18
18
  return { __sfc: !0, emit: t, InDrawer: o };
19
19
  }
@@ -2,7 +2,7 @@ import r from "./WpModal.vue2.js";
2
2
  import s from "../../_virtual/_plugin-vue2_normalizer.js";
3
3
  var i = function() {
4
4
  var t = this, o = t._self._c, e = t._self._setupProxy;
5
- return o(e.InModalV2, { attrs: { id: t.id, "description-status": "", status: "", "close-button-status": t.closeButtonStatus, "close-on-outside-click": t.closeOnOutsideClick, "description-text": t.description, "footer-button-group-options": t.footerButtonOptions, "footer-status": t.footerStatus, size: t.size, "title-text": t.title }, on: { cancelOrBackButtonEvent: function(n) {
5
+ return o(e.InModalV2, { attrs: { id: t.id, "description-status": "", status: "", "close-button-status": t.closeButtonStatus, "close-on-outside-click": t.closeOnOutsideClick, "description-text": t.description, "footer-button-group-options": t.footerButtonOptions, "footer-status": t.footerStatus, size: t.size, state: t.state, "title-text": t.title }, on: { cancelOrBackButtonEvent: function(n) {
6
6
  return e.emit("close");
7
7
  }, onCloseEvent: function(n) {
8
8
  return e.emit("close");
@@ -1,11 +1,12 @@
1
1
  import { defineComponent as e } from "vue";
2
2
  import { InModalV2 as o } from "@useinsider/design-system-vue";
3
- const u = /* @__PURE__ */ e({
3
+ const n = /* @__PURE__ */ e({
4
4
  __name: "WpModal",
5
5
  props: {
6
6
  id: null,
7
7
  title: null,
8
8
  description: { default: "" },
9
+ state: { default: "default" },
9
10
  size: { default: "small" },
10
11
  footerButtonOptions: { default: void 0 },
11
12
  closeButtonStatus: { type: Boolean, default: !0 },
@@ -13,10 +14,10 @@ const u = /* @__PURE__ */ e({
13
14
  footerStatus: { type: Boolean, default: !0 }
14
15
  },
15
16
  emits: ["close", "primary-action", "secondary-action"],
16
- setup(l, { emit: t }) {
17
+ setup(a, { emit: t }) {
17
18
  return { __sfc: !0, emit: t, InModalV2: o };
18
19
  }
19
20
  });
20
21
  export {
21
- u as default
22
+ n as default
22
23
  };
@@ -0,0 +1,52 @@
1
+ import { ToasterTypeOptions as l } from "../enums/toaster.js";
2
+ import { ref as p } from "vue";
3
+ import { useToaster as u } from "./useToaster.js";
4
+ import { useTranslations as f } from "./useTranslations.js";
5
+ const d = ["accessExpired", "domainRestricted", "ipRestricted", "insiderAccessRestricted"], n = p(null), a = (e) => {
6
+ try {
7
+ return new URL(e, window.location.href).origin === window.location.origin;
8
+ } catch {
9
+ return !0;
10
+ }
11
+ }, g = (e) => {
12
+ try {
13
+ const o = new URL(e, window.location.href);
14
+ return o.origin === window.location.origin ? o.href : "";
15
+ } catch {
16
+ return "";
17
+ }
18
+ }, w = (e) => {
19
+ try {
20
+ const o = JSON.parse(e);
21
+ return o && typeof o == "object" && Object.keys(o).length ? o : null;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }, y = (e) => typeof (e == null ? void 0 : e.message) == "string" ? e.message : "", s = (e) => y(e) || f()("user-management.collaborate-forbidden-action"), c = (e) => {
26
+ u().showToaster({ type: l.Error, message: e });
27
+ }, R = (e, o, t) => {
28
+ if (t && !a(t))
29
+ return;
30
+ const r = w(o);
31
+ if (e === 403) {
32
+ c(s(r));
33
+ return;
34
+ }
35
+ if (e === 401 && (r == null ? void 0 : r.type) === "groupLevelAccess") {
36
+ c(s(r));
37
+ return;
38
+ }
39
+ if (e === 401 && typeof (r == null ? void 0 : r.type) == "string" && d.includes(r.type)) {
40
+ const i = typeof r.redirect == "string" ? g(r.redirect) : "";
41
+ if (i) {
42
+ window.location.replace(i);
43
+ return;
44
+ }
45
+ }
46
+ e !== 401 && e !== 419 || n.value || (window.isSessionExpired = !0, n.value = { status: e, data: r });
47
+ }, T = () => ({ authError: n });
48
+ export {
49
+ a as isPanelOrigin,
50
+ R as reportAuthError,
51
+ T as useAuthError
52
+ };
@@ -1,70 +1,138 @@
1
- import { useEmailTemplateApplier as w, resetEmailTemplateApplier as _ } from "./useEmailTemplateApplier.js";
2
- import { useToaster as I } from "./useToaster.js";
3
- import { useTranslations as P } from "./useTranslations.js";
4
- import { ToasterTypeOptions as S } from "../enums/toaster.js";
5
- import { getActivePinia as v } from "pinia";
6
- import { watch as B, onUnmounted as D } from "vue";
7
- const x = "email_template", L = "chat", M = "guido:debug:ai", R = () => {
1
+ import { useEmailTemplateApplier as z, resetEmailTemplateApplier as J } from "./useEmailTemplateApplier.js";
2
+ import { useToaster as Q } from "./useToaster.js";
3
+ import { useTranslations as V } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as Z } from "../enums/toaster.js";
5
+ import { useGuidoEmailEditorStore as W } from "../stores/guido-email-editor.js";
6
+ import { getActivePinia as k } from "pinia";
7
+ import { onUnmounted as tt, watch as et } from "vue";
8
+ const rt = "email_template", nt = "chat", ot = "guido:debug:ai", it = 2, lt = 500, ct = (b, p) => `${b}:${p ?? 1}`;
9
+ let S = null;
10
+ const at = () => {
8
11
  if (typeof window > "u")
9
12
  return !1;
10
13
  try {
11
- return window.localStorage.getItem(M) === "1";
14
+ return window.localStorage.getItem(ot) === "1";
12
15
  } catch {
13
16
  return !1;
14
17
  }
15
- }, H = () => {
16
- const c = v();
17
- if (!c)
18
+ }, bt = () => {
19
+ const b = k();
20
+ if (!b)
18
21
  return;
19
- const l = c._s, p = l == null ? void 0 : l.get(L);
20
- if (!p)
21
- return;
22
- const { markPending: d, applyTemplate: f, applyTemplateDebounced: T } = w(), { showToaster: E } = I(), h = P(), y = (r, t) => {
23
- const e = h(r);
24
- return e === r ? t : e;
25
- }, i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set(), u = R(), A = (r, t) => {
26
- u && console.debug(`[guido:cortex] msg=${r ?? "?"} type=${(t == null ? void 0 : t.type) ?? "?"}`, t);
27
- }, b = (r) => {
28
- if (r.blueprintType !== x)
22
+ const p = W(), M = Symbol("cortexBlueprintBridge");
23
+ S = M, p.$patch((t) => {
24
+ t.bridgeActive = !0;
25
+ });
26
+ const { markPending: F, applyTemplate: H, applyTemplateDebounced: O } = z(), { showToaster: C } = Q(), G = V(), E = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map();
27
+ let s = null;
28
+ const d = /* @__PURE__ */ new Map(), T = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Set(), B = at();
29
+ let w = null, m = null, A;
30
+ const K = (t, r) => {
31
+ B && console.debug(`[guido:cortex] msg=${t ?? "?"} type=${(r == null ? void 0 : r.type) ?? "?"}`, r);
32
+ }, U = () => new Set((A == null ? void 0 : A.appliedBlueprintKeys) ?? []), Y = (t) => t instanceof Error ? t.message : String(t), D = (t, r, n, e) => {
33
+ if (S !== M)
34
+ return;
35
+ const o = p.applyAcks[t], c = Math.max(Date.now(), ((o == null ? void 0 : o.ackAt) ?? 0) + 1), a = { status: r, requestedAt: n, ackAt: c };
36
+ e !== void 0 && (a.error = Y(e)), p.$patch((l) => {
37
+ l.applyAcks = { ...l.applyAcks, [t]: a };
38
+ });
39
+ }, I = (t) => (d.get(t) ?? 0) > 0, P = (t) => (s == null ? void 0 : s.key) === t, v = async (t, r, n) => {
40
+ var a, l, h;
41
+ const e = ((a = r.blueprintData) == null ? void 0 : a.html) ?? "", o = ((l = r.blueprintData) == null ? void 0 : l.css) ?? "", c = r.applyRequestedAt ?? 0;
42
+ d.set(t, (d.get(t) ?? 0) + 1);
43
+ try {
44
+ const i = n === "debounced" ? await O(t, { html: e, css: o }) : await H(t, { html: e, css: o });
45
+ if (i.status === "superseded")
46
+ return;
47
+ if (i.status === "applied") {
48
+ E.set(t, e), u.delete(t), D(t, "applied", c);
49
+ return;
50
+ }
51
+ const y = u.get(t), j = (y == null ? void 0 : y.html) === e ? y.count + 1 : 1;
52
+ u.set(t, { html: e, count: j }), D(t, "failed", c, i.error);
53
+ } catch (i) {
54
+ console.error("[guido:apply] apply threw before it could settle", i), D(t, "failed", c, i);
55
+ } finally {
56
+ d.set(t, (d.get(t) ?? 1) - 1);
57
+ const i = T.get(t);
58
+ i && !I(t) && (T.delete(t), P(t) && (((h = i.blueprintData) == null ? void 0 : h.html) ?? "") !== e && v(t, i, n));
59
+ }
60
+ }, N = (t) => {
61
+ var h;
62
+ if (t.blueprintType !== rt)
29
63
  return;
30
- const t = r.blueprintId, e = r.blueprintData;
31
- if (!t || !(e != null && e.html))
64
+ const { blueprintId: r } = t, n = (h = t.blueprintData) == null ? void 0 : h.html;
65
+ if (!r || !n)
32
66
  return;
33
- if (!r.applyRequested) {
34
- d(t);
67
+ const e = ct(r, t.version);
68
+ if (!t.applyRequested) {
69
+ F(e);
70
+ return;
71
+ }
72
+ const o = t.applyRequestedAt ?? 0, c = _.get(e);
73
+ if (c === void 0 || o > c) {
74
+ const i = c === void 0;
75
+ if (_.set(e, o), u.delete(e), (!s || o >= s.requestedAt) && (s = { key: e, requestedAt: o }), i && U().has(e)) {
76
+ E.set(e, n);
77
+ return;
78
+ }
79
+ v(e, t, "immediate");
80
+ return;
81
+ }
82
+ const a = E.get(e);
83
+ if (a === n || !P(e))
35
84
  return;
85
+ const l = u.get(e);
86
+ if (!((l == null ? void 0 : l.html) === n && l.count >= it)) {
87
+ if (a === void 0) {
88
+ if (I(e)) {
89
+ T.set(e, t);
90
+ return;
91
+ }
92
+ v(e, t, "immediate");
93
+ return;
94
+ }
95
+ f.get(e) !== n && (f.set(e, n), v(e, t, "debounced").finally(() => {
96
+ f.get(e) === n && f.delete(e);
97
+ }));
36
98
  }
37
- const o = i.get(t);
38
- o === void 0 ? (i.set(t, e.html), f(t, e)) : o !== e.html && (i.set(t, e.html), T(t, e));
39
- }, s = (r) => r === void 0 || a.has(r) ? !1 : (a.add(r), E({
40
- type: S.Error,
41
- message: y("newsletter.ai-template-failed", "AI couldn't generate the template. Please try again.")
42
- }), !0), m = B(
43
- () => p.messages,
44
- (r) => {
45
- Array.isArray(r) && r.forEach((t) => {
46
- const e = t == null ? void 0 : t.id;
47
- (t == null ? void 0 : t.isError) === !0 && s(e) && u && console.debug(`[guido:cortex] message-level error id=${e}`, t);
48
- const o = t == null ? void 0 : t.segments;
49
- Array.isArray(o) && o.forEach((n) => {
50
- if (n)
51
- switch (A(e, n), n.type) {
52
- case "blueprint":
53
- b(n);
54
- break;
55
- case "error":
56
- s(e);
57
- break;
58
- }
59
- });
99
+ }, R = (t) => t === void 0 || g.has(t) ? !1 : (g.add(t), C({
100
+ type: Z.Error,
101
+ message: G("newsletter.ai-template-failed")
102
+ }), !0), X = (t) => {
103
+ Array.isArray(t) && t.forEach((r) => {
104
+ const n = r == null ? void 0 : r.id;
105
+ (r == null ? void 0 : r.isError) === !0 && R(n) && B && console.debug(`[guido:cortex] message-level error id=${n}`, r);
106
+ const e = r == null ? void 0 : r.segments;
107
+ Array.isArray(e) && e.forEach((o) => {
108
+ if (o)
109
+ switch (K(n, o), o.type) {
110
+ case "blueprint":
111
+ N(o);
112
+ break;
113
+ case "error":
114
+ R(n);
115
+ break;
116
+ }
60
117
  });
61
- },
62
- { deep: !0, immediate: !0 }
63
- );
64
- D(() => {
65
- m(), i.clear(), a.clear(), _();
118
+ });
119
+ }, $ = () => {
120
+ w !== null && (clearInterval(w), w = null);
121
+ }, q = () => {
122
+ var t;
123
+ return (t = b._s) == null ? void 0 : t.get(nt);
124
+ }, L = (t) => {
125
+ A = t, m = et(() => t.messages, X, { deep: !0, immediate: !0 });
126
+ }, x = q();
127
+ x ? L(x) : w = setInterval(() => {
128
+ const t = q();
129
+ t && ($(), L(t));
130
+ }, lt), tt(() => {
131
+ $(), m == null || m(), A = void 0, E.clear(), f.clear(), _.clear(), u.clear(), s = null, d.clear(), T.clear(), g.clear(), S === M && (S = null, p.$patch((t) => {
132
+ t.bridgeActive = !1, t.applyAcks = {};
133
+ }), J());
66
134
  });
67
135
  };
68
136
  export {
69
- H as useCortexBlueprintBridge
137
+ bt as useCortexBlueprintBridge
70
138
  };
@@ -1,59 +1,115 @@
1
- import { useActionsApi as C } from "./useActionsApi.js";
2
- import { useConfig as h } from "./useConfig.js";
3
- import { useToaster as D } from "./useToaster.js";
4
- import { useTranslations as E } from "./useTranslations.js";
5
- import { ToasterTypeOptions as f } from "../enums/toaster.js";
6
- import { useDynamicContentStore as A } from "../stores/dynamic-content.js";
7
- import { flattenDynamicContentList as w } from "../utils/genericUtil.js";
8
- import { extractUsedDynamicContent as S } from "../utils/registerUsedDynamicContent.js";
9
- import { ref as O } from "vue";
10
- const U = 250, o = O({}), s = {}, u = /* @__PURE__ */ new Map(), z = () => {
11
- const { updateHtmlAndCss: r } = C(), { showToaster: m } = D(), y = E(), { template: T } = h(), d = A(), g = (e, t) => {
12
- const a = y(e);
13
- return a === e ? t : a;
14
- }, v = (e) => {
15
- o.value[e] === void 0 && (o.value = { ...o.value, [e]: "pending" });
16
- }, l = (e, t, a) => {
17
- var c;
18
- o.value = { ...o.value, [e]: "applying" };
1
+ import { useActionsApi as z } from "./useActionsApi.js";
2
+ import { useConfig as N } from "./useConfig.js";
3
+ import { useEditorLock as K } from "./useEditorLock.js";
4
+ import { useToaster as R } from "./useToaster.js";
5
+ import { useTranslations as F } from "./useTranslations.js";
6
+ import { ToasterTypeOptions as v } from "../enums/toaster.js";
7
+ import { useDynamicContentStore as G } from "../stores/dynamic-content.js";
8
+ import { useEditorStore as $ } from "../stores/editor.js";
9
+ import { flattenDynamicContentList as j } from "../utils/genericUtil.js";
10
+ import { extractUsedDynamicContent as J } from "../utils/registerUsedDynamicContent.js";
11
+ import { ref as V, watch as W } from "vue";
12
+ const X = 250, U = 12e4, Y = 1e3, p = { status: "superseded" }, M = { status: "failed", error: new Error("Blueprint has no html to apply") }, a = V({}), A = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map();
13
+ let d = null;
14
+ const E = () => {
15
+ d && (clearInterval(d), d = null);
16
+ }, me = () => {
17
+ const { updateHtmlAndCss: i } = z(), { runExclusive: O } = K(), { showToaster: P } = R(), _ = F(), { template: b } = N(), L = G(), T = $(), w = (e, t) => {
19
18
  try {
20
- r(t, a).catch((n) => {
21
- console.warn("Editor did not acknowledge the template apply.", n);
22
- }), o.value = { ...o.value, [e]: "applied" };
23
- try {
24
- const n = w((c = T.value) == null ? void 0 : c.dynamicContentList), i = S(t, n);
25
- i.length > 0 && d.registerDynamicContent(i);
26
- } catch {
27
- }
28
- u.get(e) !== t && (u.set(e, t), m({
29
- type: f.Success,
30
- message: g("newsletter.ai-template-applied", "Template applied to the editor")
31
- }));
19
+ P({ type: e, message: _(t) });
20
+ } catch (o) {
21
+ console.error("[guido:apply] could not show the apply toast", o);
22
+ }
23
+ }, g = (e, t) => {
24
+ m.get(e) !== t && (m.set(e, t), w(v.Error, "newsletter.ai-template-failed-apply"));
25
+ }, y = () => {
26
+ var e, t;
27
+ return T.isStripoInitialized && typeof ((t = (e = window.StripoEditorApi) == null ? void 0 : e.actionsApi) == null ? void 0 : t.updateHtmlAndCss) == "function";
28
+ }, Q = (e) => {
29
+ a.value[e] === void 0 && (a.value = { ...a.value, [e]: "pending" });
30
+ }, l = (e, t) => {
31
+ a.value = { ...a.value, [e]: t };
32
+ }, H = (e) => {
33
+ var t;
34
+ try {
35
+ const o = j((t = b.value) == null ? void 0 : t.dynamicContentList), r = J(e, o);
36
+ r.length > 0 && L.registerDynamicContent(r);
37
+ } catch {
38
+ }
39
+ }, I = (e, t) => {
40
+ m.delete(e), A.get(e) !== t && (A.set(e, t), w(v.Success, "newsletter.ai-template-applied"));
41
+ }, h = async (e, t, o) => {
42
+ const r = (u.get(e) ?? 0) + 1;
43
+ u.set(e, r), l(e, "applying");
44
+ try {
45
+ await O(() => i(t, o));
32
46
  } catch (n) {
33
- o.value = { ...o.value, [e]: "failed" }, m({
34
- type: f.Error,
35
- message: n instanceof Error ? n.message : "Failed to apply template"
36
- });
47
+ return u.get(e) !== r ? p : (console.error("[guido:apply] editor did not acknowledge the template apply", n), l(e, "failed"), g(e, t), { status: "failed", error: n });
37
48
  }
38
- }, p = (e) => {
39
- const t = s[e];
40
- t && (clearTimeout(t), delete s[e]);
41
- };
42
- return { applyStatus: o, markPending: v, applyTemplate: (e, t) => {
43
- t.html && (p(e), l(e, t.html, t.css ?? ""));
44
- }, applyTemplateDebounced: (e, t) => {
45
- if (!t.html)
49
+ return u.get(e) !== r ? p : (l(e, "applied"), H(t), I(e, t), { status: "applied" });
50
+ }, B = (e) => {
51
+ const t = s.get(e);
52
+ t && (clearTimeout(t.timer), s.delete(e), t.settle(p));
53
+ }, C = (e) => {
54
+ const t = c.get(e);
55
+ t && (clearTimeout(t.timer), c.delete(e), t.settle(p));
56
+ }, q = () => {
57
+ [...c.keys()].forEach(C);
58
+ }, D = async () => {
59
+ if (s.size === 0) {
60
+ E();
46
61
  return;
47
- p(e);
48
- const { html: a } = t, c = t.css ?? "";
49
- s[e] = setTimeout(() => {
50
- delete s[e], l(e, a, c);
62
+ }
63
+ if (!y())
64
+ return;
65
+ E();
66
+ const e = [...s.entries()];
67
+ s.clear(), e.forEach(([, n]) => clearTimeout(n.timer));
68
+ const t = e.pop();
69
+ if (e.forEach(([n, f]) => {
70
+ l(n, "failed"), f.settle({ status: "failed", error: new Error("Displaced by a newer apply") });
71
+ }), !t)
72
+ return;
73
+ const [o, r] = t;
74
+ r.settle(await h(o, r.html, r.css));
75
+ }, x = (e, t, o) => new Promise((r) => {
76
+ B(e);
77
+ const n = setTimeout(() => {
78
+ s.delete(e), l(e, "failed"), g(e, t), r({
79
+ status: "failed",
80
+ error: new Error(`Editor did not become ready within ${U}ms`)
81
+ });
51
82
  }, U);
83
+ s.set(e, { html: t, css: o, timer: n, settle: r }), l(e, "applying"), d ?? (d = setInterval(() => {
84
+ D();
85
+ }, Y));
86
+ }), S = (e, t, o) => y() ? h(e, t, o) : x(e, t, o);
87
+ return W(() => T.isStripoInitialized, (e) => {
88
+ e && D();
89
+ }, { immediate: !0 }), { applyStatus: a, markPending: Q, applyTemplate: (e, t) => {
90
+ const { html: o } = t;
91
+ return o ? (q(), S(e, o, t.css ?? "")) : Promise.resolve(M);
92
+ }, applyTemplateDebounced: (e, t) => {
93
+ const { html: o } = t;
94
+ if (!o)
95
+ return Promise.resolve(M);
96
+ const r = t.css ?? "";
97
+ return new Promise((n) => {
98
+ C(e);
99
+ const f = setTimeout(() => {
100
+ c.delete(e), S(e, o, r).then(n);
101
+ }, X);
102
+ c.set(e, { timer: f, settle: n });
103
+ });
52
104
  } };
53
- }, G = () => {
54
- Object.values(s).forEach(clearTimeout), Object.keys(s).forEach((r) => delete s[r]), o.value = {};
105
+ }, de = () => {
106
+ c.forEach((i) => {
107
+ clearTimeout(i.timer), i.settle(p);
108
+ }), c.clear(), s.forEach((i) => {
109
+ clearTimeout(i.timer), i.settle(p);
110
+ }), s.clear(), E(), m.clear(), a.value = {};
55
111
  };
56
112
  export {
57
- G as resetEmailTemplateApplier,
58
- z as useEmailTemplateApplier
113
+ de as resetEmailTemplateApplier,
114
+ me as useEmailTemplateApplier
59
115
  };
@@ -1,14 +1,13 @@
1
- import { defaultHtmlCompilerRules as d } from "../config/compiler/htmlCompilerRules.js";
2
- import { itemsCompilerRules as f } from "../config/compiler/itemsCompilerRules.js";
3
- import { liquidCompilerRules as g } from "../config/compiler/liquidCompilerRules.js";
4
- import { outlookCompilerRules as R } from "../config/compiler/outlookCompilerRules.js";
1
+ import { defaultHtmlCompilerRules as R } from "../config/compiler/htmlCompilerRules.js";
2
+ import { itemsCompilerRules as g } from "../config/compiler/itemsCompilerRules.js";
3
+ import { liquidCompilerRules as C } from "../config/compiler/liquidCompilerRules.js";
4
+ import { outlookCompilerRules as b } from "../config/compiler/outlookCompilerRules.js";
5
5
  import { recommendationCompilerRules as v } from "../config/compiler/recommendationCompilerRules.js";
6
6
  import { socialCompilerRules as H } from "../config/compiler/socialCompilerRules.js";
7
- import { unsubscribeCompilerRules as b } from "../config/compiler/unsubscribeCompilerRules.js";
8
- import { createHtmlCompiler as n } from "../utils/htmlCompiler.js";
9
- import { computed as p } from "vue";
10
- import { useConfig as C } from "./useConfig.js";
11
- const x = /* @__PURE__ */ new Set([
7
+ import { unsubscribeCompilerRules as x } from "../config/compiler/unsubscribeCompilerRules.js";
8
+ import { createHtmlCompiler as s } from "../utils/htmlCompiler.js";
9
+ import { useConfig as k } from "./useConfig.js";
10
+ const y = /* @__PURE__ */ new Set([
12
11
  // URL/tag encoding fixes — keep merge-tag and placeholder integrity intact.
13
12
  "fix-url-encoding-start",
14
13
  "fix-url-encoding-end",
@@ -31,34 +30,24 @@ const x = /* @__PURE__ */ new Set([
31
30
  // Editor-only attribute strip — AMP4EMAIL has no `contenteditable`, so leaving
32
31
  // it in narrows/breaks rendering. Pure attribute removal, emits nothing.
33
32
  "remove-contenteditable"
34
- ]), I = () => {
35
- const { compiler: i, isFeatureEnabled: u, partner: a } = C(), c = p(() => {
36
- var m, l;
37
- const e = ((m = i.value) == null ? void 0 : m.customRules) || [];
38
- return [
39
- ...!!((l = i.value) != null && l.ignoreDefaultRules) ? [] : d,
40
- ...v,
41
- ...b,
42
- ...f,
43
- ...R,
44
- ...H,
45
- ...u("liquidSyntax") ? g : [],
46
- ...e.map((t, o) => ({
47
- ...t,
48
- priority: t.priority + 1e3 + o
49
- // Ensure additional rules run after default rules
50
- }))
51
- ];
52
- }), r = p(() => {
53
- var t;
54
- const e = c.value, s = n(e), m = n(e.filter((o) => x.has(o.id))), l = (t = a.value) == null ? void 0 : t.fallbackFont;
55
- return {
56
- compileHtml: (o) => s.compile(o, void 0, l),
57
- compileAmpHtml: (o) => m.compile(o, void 0, l)
58
- };
59
- });
60
- return { compileHtml: (e) => r.value.compileHtml(e), compileAmpHtml: (e) => r.value.compileAmpHtml(e) };
33
+ ]), M = () => {
34
+ var i, m, r;
35
+ const { compiler: o, isFeatureEnabled: n, partner: a } = k(), p = ((i = o.value) == null ? void 0 : i.customRules) || [], l = [
36
+ ...!!((m = o.value) != null && m.ignoreDefaultRules) ? [] : R,
37
+ ...v,
38
+ ...x,
39
+ ...g,
40
+ ...b,
41
+ ...H,
42
+ ...n("liquidSyntax") ? C : [],
43
+ ...p.map((e, f) => ({
44
+ ...e,
45
+ priority: e.priority + 1e3 + f
46
+ // Ensure additional rules run after default rules
47
+ }))
48
+ ], u = s(l), c = l.filter((e) => y.has(e.id)), d = s(c), t = (r = a.value) == null ? void 0 : r.fallbackFont;
49
+ return { compileHtml: (e) => u.compile(e, void 0, t), compileAmpHtml: (e) => d.compile(e, void 0, t) };
61
50
  };
62
51
  export {
63
- I as useHtmlCompiler
52
+ M as useHtmlCompiler
64
53
  };
@@ -226,8 +226,6 @@ const ke = () => {
226
226
  export {
227
227
  ge as buildPartnerAttributeNameSet,
228
228
  pe as findInvalidCustomFields,
229
- Ee as getInvalidDynamicContentTags,
230
- me as getRecommendationBlockIds,
231
229
  fe as parseRecommendationVariable,
232
230
  ke as useHtmlValidator
233
231
  };