@useinsider/guido 3.13.0 → 3.13.1-beta.88c2f20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/@types/config/defaults.js +6 -2
- package/dist/@types/config/schemas.js +24 -17
- package/dist/components/Guido.vue.js +1 -1
- package/dist/components/Guido.vue2.js +78 -72
- package/dist/composables/useActionsApi.js +24 -18
- package/dist/composables/useEmailTemplateApplier.js +26 -24
- package/dist/composables/useTimerClone.js +1 -1
- package/dist/composables/useTranslations.js +7 -5
- package/dist/config/compiler/outlookCompilerRules.js +21 -8
- package/dist/config/migrator/index.js +11 -10
- package/dist/config/migrator/trackIdMigrator.js +11 -0
- package/dist/guido.css +1 -1
- package/dist/library.js +14 -9
- package/dist/src/@types/config/schemas.d.ts +14 -0
- package/dist/src/composables/useActionsApi.d.ts +1 -1
- package/dist/src/composables/useConfig.d.ts +4 -0
- package/dist/src/composables/useModuleDynamicContentRepair.d.ts +0 -5
- package/dist/src/config/migrator/index.d.ts +6 -1
- package/dist/src/config/migrator/trackIdMigrator.d.ts +6 -0
- package/dist/src/library.d.ts +2 -0
- package/dist/src/stores/config.d.ts +36 -0
- package/dist/src/stores/editor.d.ts +25 -0
- package/dist/src/utils/linkTrackingIds.d.ts +25 -0
- package/dist/stores/editor.js +4 -1
- package/dist/utils/linkTrackingIds.js +44 -0
- package/dist/utils/templatePreparation.js +70 -59
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
9
9
|
isStripoInitialized: boolean;
|
|
10
10
|
templateId: string;
|
|
11
11
|
syncModulesEnabled: boolean;
|
|
12
|
+
trackIdSessionFloor: number;
|
|
12
13
|
}, {
|
|
13
14
|
isEditorToolbarVisible: (state: {
|
|
14
15
|
loadingStatus: boolean;
|
|
@@ -21,6 +22,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
21
22
|
isStripoInitialized: boolean;
|
|
22
23
|
templateId: string;
|
|
23
24
|
syncModulesEnabled: boolean;
|
|
25
|
+
trackIdSessionFloor: number;
|
|
24
26
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
25
27
|
loadingStatus: boolean;
|
|
26
28
|
isCodeEditorOpen: boolean;
|
|
@@ -32,6 +34,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
32
34
|
isStripoInitialized: boolean;
|
|
33
35
|
templateId: string;
|
|
34
36
|
syncModulesEnabled: boolean;
|
|
37
|
+
trackIdSessionFloor: number;
|
|
35
38
|
}>) => boolean;
|
|
36
39
|
isUndoButtonDisabled: (state: {
|
|
37
40
|
loadingStatus: boolean;
|
|
@@ -44,6 +47,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
44
47
|
isStripoInitialized: boolean;
|
|
45
48
|
templateId: string;
|
|
46
49
|
syncModulesEnabled: boolean;
|
|
50
|
+
trackIdSessionFloor: number;
|
|
47
51
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
48
52
|
loadingStatus: boolean;
|
|
49
53
|
isCodeEditorOpen: boolean;
|
|
@@ -55,6 +59,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
55
59
|
isStripoInitialized: boolean;
|
|
56
60
|
templateId: string;
|
|
57
61
|
syncModulesEnabled: boolean;
|
|
62
|
+
trackIdSessionFloor: number;
|
|
58
63
|
}>) => boolean;
|
|
59
64
|
isRedoButtonDisabled: (state: {
|
|
60
65
|
loadingStatus: boolean;
|
|
@@ -67,6 +72,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
67
72
|
isStripoInitialized: boolean;
|
|
68
73
|
templateId: string;
|
|
69
74
|
syncModulesEnabled: boolean;
|
|
75
|
+
trackIdSessionFloor: number;
|
|
70
76
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
71
77
|
loadingStatus: boolean;
|
|
72
78
|
isCodeEditorOpen: boolean;
|
|
@@ -78,6 +84,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
78
84
|
isStripoInitialized: boolean;
|
|
79
85
|
templateId: string;
|
|
80
86
|
syncModulesEnabled: boolean;
|
|
87
|
+
trackIdSessionFloor: number;
|
|
81
88
|
}>) => boolean;
|
|
82
89
|
isCodeEditorButtonDisabled: (state: {
|
|
83
90
|
loadingStatus: boolean;
|
|
@@ -90,6 +97,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
90
97
|
isStripoInitialized: boolean;
|
|
91
98
|
templateId: string;
|
|
92
99
|
syncModulesEnabled: boolean;
|
|
100
|
+
trackIdSessionFloor: number;
|
|
93
101
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
94
102
|
loadingStatus: boolean;
|
|
95
103
|
isCodeEditorOpen: boolean;
|
|
@@ -101,6 +109,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
101
109
|
isStripoInitialized: boolean;
|
|
102
110
|
templateId: string;
|
|
103
111
|
syncModulesEnabled: boolean;
|
|
112
|
+
trackIdSessionFloor: number;
|
|
104
113
|
}>) => boolean;
|
|
105
114
|
isPreviewButtonDisabled: (state: {
|
|
106
115
|
loadingStatus: boolean;
|
|
@@ -113,6 +122,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
113
122
|
isStripoInitialized: boolean;
|
|
114
123
|
templateId: string;
|
|
115
124
|
syncModulesEnabled: boolean;
|
|
125
|
+
trackIdSessionFloor: number;
|
|
116
126
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
117
127
|
loadingStatus: boolean;
|
|
118
128
|
isCodeEditorOpen: boolean;
|
|
@@ -124,6 +134,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
124
134
|
isStripoInitialized: boolean;
|
|
125
135
|
templateId: string;
|
|
126
136
|
syncModulesEnabled: boolean;
|
|
137
|
+
trackIdSessionFloor: number;
|
|
127
138
|
}>) => boolean;
|
|
128
139
|
isViewOptionsDisabled: (state: {
|
|
129
140
|
loadingStatus: boolean;
|
|
@@ -136,6 +147,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
136
147
|
isStripoInitialized: boolean;
|
|
137
148
|
templateId: string;
|
|
138
149
|
syncModulesEnabled: boolean;
|
|
150
|
+
trackIdSessionFloor: number;
|
|
139
151
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
140
152
|
loadingStatus: boolean;
|
|
141
153
|
isCodeEditorOpen: boolean;
|
|
@@ -147,6 +159,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
147
159
|
isStripoInitialized: boolean;
|
|
148
160
|
templateId: string;
|
|
149
161
|
syncModulesEnabled: boolean;
|
|
162
|
+
trackIdSessionFloor: number;
|
|
150
163
|
}>) => boolean;
|
|
151
164
|
isVersionHistoryButtonDisabled: (state: {
|
|
152
165
|
loadingStatus: boolean;
|
|
@@ -159,6 +172,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
159
172
|
isStripoInitialized: boolean;
|
|
160
173
|
templateId: string;
|
|
161
174
|
syncModulesEnabled: boolean;
|
|
175
|
+
trackIdSessionFloor: number;
|
|
162
176
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
163
177
|
loadingStatus: boolean;
|
|
164
178
|
isCodeEditorOpen: boolean;
|
|
@@ -170,6 +184,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
170
184
|
isStripoInitialized: boolean;
|
|
171
185
|
templateId: string;
|
|
172
186
|
syncModulesEnabled: boolean;
|
|
187
|
+
trackIdSessionFloor: number;
|
|
173
188
|
}>) => boolean;
|
|
174
189
|
isExportButtonDisabled: (state: {
|
|
175
190
|
loadingStatus: boolean;
|
|
@@ -182,6 +197,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
182
197
|
isStripoInitialized: boolean;
|
|
183
198
|
templateId: string;
|
|
184
199
|
syncModulesEnabled: boolean;
|
|
200
|
+
trackIdSessionFloor: number;
|
|
185
201
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
186
202
|
loadingStatus: boolean;
|
|
187
203
|
isCodeEditorOpen: boolean;
|
|
@@ -193,6 +209,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
193
209
|
isStripoInitialized: boolean;
|
|
194
210
|
templateId: string;
|
|
195
211
|
syncModulesEnabled: boolean;
|
|
212
|
+
trackIdSessionFloor: number;
|
|
196
213
|
}>) => boolean;
|
|
197
214
|
isSaveAsButtonDisabled: (state: {
|
|
198
215
|
loadingStatus: boolean;
|
|
@@ -205,6 +222,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
205
222
|
isStripoInitialized: boolean;
|
|
206
223
|
templateId: string;
|
|
207
224
|
syncModulesEnabled: boolean;
|
|
225
|
+
trackIdSessionFloor: number;
|
|
208
226
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
209
227
|
loadingStatus: boolean;
|
|
210
228
|
isCodeEditorOpen: boolean;
|
|
@@ -216,6 +234,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
216
234
|
isStripoInitialized: boolean;
|
|
217
235
|
templateId: string;
|
|
218
236
|
syncModulesEnabled: boolean;
|
|
237
|
+
trackIdSessionFloor: number;
|
|
219
238
|
}>) => boolean;
|
|
220
239
|
isTestButtonDisabled: (state: {
|
|
221
240
|
loadingStatus: boolean;
|
|
@@ -228,6 +247,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
228
247
|
isStripoInitialized: boolean;
|
|
229
248
|
templateId: string;
|
|
230
249
|
syncModulesEnabled: boolean;
|
|
250
|
+
trackIdSessionFloor: number;
|
|
231
251
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
232
252
|
loadingStatus: boolean;
|
|
233
253
|
isCodeEditorOpen: boolean;
|
|
@@ -239,6 +259,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
239
259
|
isStripoInitialized: boolean;
|
|
240
260
|
templateId: string;
|
|
241
261
|
syncModulesEnabled: boolean;
|
|
262
|
+
trackIdSessionFloor: number;
|
|
242
263
|
}>) => boolean;
|
|
243
264
|
isSaveButtonDisabled: (state: {
|
|
244
265
|
loadingStatus: boolean;
|
|
@@ -251,6 +272,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
251
272
|
isStripoInitialized: boolean;
|
|
252
273
|
templateId: string;
|
|
253
274
|
syncModulesEnabled: boolean;
|
|
275
|
+
trackIdSessionFloor: number;
|
|
254
276
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
255
277
|
loadingStatus: boolean;
|
|
256
278
|
isCodeEditorOpen: boolean;
|
|
@@ -262,6 +284,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
262
284
|
isStripoInitialized: boolean;
|
|
263
285
|
templateId: string;
|
|
264
286
|
syncModulesEnabled: boolean;
|
|
287
|
+
trackIdSessionFloor: number;
|
|
265
288
|
}>) => boolean;
|
|
266
289
|
isInSaveableState: (state: {
|
|
267
290
|
loadingStatus: boolean;
|
|
@@ -274,6 +297,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
274
297
|
isStripoInitialized: boolean;
|
|
275
298
|
templateId: string;
|
|
276
299
|
syncModulesEnabled: boolean;
|
|
300
|
+
trackIdSessionFloor: number;
|
|
277
301
|
} & import("pinia").PiniaCustomStateProperties<{
|
|
278
302
|
loadingStatus: boolean;
|
|
279
303
|
isCodeEditorOpen: boolean;
|
|
@@ -285,5 +309,6 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
285
309
|
isStripoInitialized: boolean;
|
|
286
310
|
templateId: string;
|
|
287
311
|
syncModulesEnabled: boolean;
|
|
312
|
+
trackIdSessionFloor: number;
|
|
288
313
|
}>) => boolean;
|
|
289
314
|
}, {}>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent link tracking ids for the click heatmap (SD-141414).
|
|
3
|
+
* Pure string transforms — no DOM parse/serialize round-trip, safe for both
|
|
4
|
+
* Stripo raw HTML and hand-authored HTML-editor documents. Shared with email-fe.
|
|
5
|
+
*/
|
|
6
|
+
export declare const TRACK_ID_ATTRIBUTE = "data-ins-track-id";
|
|
7
|
+
export declare const TRACK_SEQ_ATTRIBUTE = "data-ins-track-seq";
|
|
8
|
+
export interface TrackingIdResult {
|
|
9
|
+
html: string;
|
|
10
|
+
changed: boolean;
|
|
11
|
+
nextSeq: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reads the persisted id high-water mark: <body> attr, then <html> attr,
|
|
15
|
+
* then the leading comment fallback. Returns 0 when absent.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readTrackSeq(html: string): number;
|
|
18
|
+
/**
|
|
19
|
+
* Ensures every <a> opening tag carries a unique positive-integer id and the
|
|
20
|
+
* document records the id high-water mark. Ids are minted above
|
|
21
|
+
* max(persisted seq, max id in document, floor) so deleted ids are never
|
|
22
|
+
* reused — even after a version restore or paste-over (floor = session floor).
|
|
23
|
+
* Idempotent: a document already normalized returns changed=false.
|
|
24
|
+
*/
|
|
25
|
+
export declare function assignTrackingIds(html: string, floor?: number): TrackingIdResult;
|
package/dist/stores/editor.js
CHANGED
|
@@ -10,7 +10,10 @@ const o = e("guidoEditor", {
|
|
|
10
10
|
hasChanges: !1,
|
|
11
11
|
isStripoInitialized: !1,
|
|
12
12
|
templateId: "",
|
|
13
|
-
syncModulesEnabled: !1
|
|
13
|
+
syncModulesEnabled: !1,
|
|
14
|
+
// In-session id high-water mark; floors tracking-id minting so ids
|
|
15
|
+
// deleted by a version restore / paste-over are never reused.
|
|
16
|
+
trackIdSessionFloor: 0
|
|
14
17
|
}),
|
|
15
18
|
getters: {
|
|
16
19
|
// Middle Slot
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const E = "data-ins-track-id", g = "data-ins-track-seq", N = /<a\b(?:[^>"']|"[^"]*"|'[^']*')*>/gi, $ = /\bdata-ins-track-id\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/i, R = /\bdata-ins-track-seq\s*=\s*(?:"(\d+)"|'(\d+)'|(\d+))/i, f = /<body\b[^>]*>/i, b = /<html\b[^>]*>/i, _ = /<!--\s*ins-track-seq:(\d+)\s*-->/i, S = /^[1-9][0-9]{0,14}$/;
|
|
2
|
+
function k(e) {
|
|
3
|
+
const t = Number(e);
|
|
4
|
+
return Number.isSafeInteger(t) && t > 0 ? t : 0;
|
|
5
|
+
}
|
|
6
|
+
function p(e) {
|
|
7
|
+
var c, T, a;
|
|
8
|
+
const s = [(c = f.exec(e)) == null ? void 0 : c[0], (T = b.exec(e)) == null ? void 0 : T[0]].reduce(
|
|
9
|
+
(i, o) => i ?? (o ? R.exec(o) : null),
|
|
10
|
+
null
|
|
11
|
+
), n = (s == null ? void 0 : s[1]) ?? (s == null ? void 0 : s[2]) ?? (s == null ? void 0 : s[3]) ?? ((a = _.exec(e)) == null ? void 0 : a[1]) ?? "";
|
|
12
|
+
return k(n);
|
|
13
|
+
}
|
|
14
|
+
function I(e, t) {
|
|
15
|
+
const s = `${g}="${t}"`, n = f.exec(e) ?? b.exec(e);
|
|
16
|
+
if (n) {
|
|
17
|
+
const [c] = n, T = R.exec(c), a = T ? c.replace(T[0], s) : c.replace(/\/?>$/, (i) => ` ${s}${i}`);
|
|
18
|
+
return e.slice(0, n.index) + a + e.slice(n.index + c.length);
|
|
19
|
+
}
|
|
20
|
+
return _.test(e) ? e.replace(_, `<!--ins-track-seq:${t}-->`) : `<!--ins-track-seq:${t}-->${e}`;
|
|
21
|
+
}
|
|
22
|
+
function q(e, t, s) {
|
|
23
|
+
const n = `${E}="${s}"`;
|
|
24
|
+
return t ? e.replace(t[0], n) : e.replace(/^<a\b/i, (c) => `${c} ${n}`);
|
|
25
|
+
}
|
|
26
|
+
function P(e, t = 0) {
|
|
27
|
+
const s = /* @__PURE__ */ new Set();
|
|
28
|
+
let n = 0;
|
|
29
|
+
const c = [...e.matchAll(N)].map((r) => {
|
|
30
|
+
const [x] = r, u = $.exec(x), A = u ? u[1] ?? u[2] ?? u[3] ?? "" : "";
|
|
31
|
+
let d = null;
|
|
32
|
+
return S.test(A) && !s.has(Number(A)) && (d = Number(A), s.add(d), n = Math.max(n, d)), { index: r.index, tag: x, attrMatch: u, id: d };
|
|
33
|
+
}), T = p(e);
|
|
34
|
+
let a = Math.max(T, n, t), i = "", o = 0, l = !1;
|
|
35
|
+
return c.forEach((r) => {
|
|
36
|
+
i += e.slice(o, r.index), r.id === null ? (a += 1, i += q(r.tag, r.attrMatch, a), l = !0) : i += r.tag, o = r.index + r.tag.length;
|
|
37
|
+
}), i += e.slice(o), a > 0 && T !== a && (i = I(i, a), l = !0), { html: i, changed: l, nextSeq: a };
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
E as TRACK_ID_ATTRIBUTE,
|
|
41
|
+
g as TRACK_SEQ_ATTRIBUTE,
|
|
42
|
+
P as assignTrackingIds,
|
|
43
|
+
p as readTrackSeq
|
|
44
|
+
};
|
|
@@ -1,62 +1,65 @@
|
|
|
1
|
-
import { useActionsApi as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { useActionsApi as k } from "../composables/useActionsApi.js";
|
|
2
|
+
import { useConfig as U } from "../composables/useConfig.js";
|
|
3
|
+
import { useHtmlCompiler as x } from "../composables/useHtmlCompiler.js";
|
|
4
|
+
import { DEFAULT_CURRENCY as d, DEFAULT_NODE_CONFIG as s } from "../extensions/Blocks/Recommendation/constants/defaultConfig.js";
|
|
5
|
+
import { useRecommendationExtensionStore as T } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
6
|
+
import { mapLegacyStrategy as L } from "../extensions/Blocks/Recommendation/utils/legacyStrategyMap.js";
|
|
7
|
+
import { DATA_ATTRIBUTES as C } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
|
|
8
|
+
import { parsePageList as R } from "../extensions/Blocks/Unsubscribe/utils/utils.js";
|
|
9
|
+
import { useDynamicContentStore as N } from "../stores/dynamic-content.js";
|
|
10
|
+
import { useEditorStore as z } from "../stores/editor.js";
|
|
11
|
+
import { useUnsubscribeStore as _ } from "../stores/unsubscribe.js";
|
|
12
|
+
import { assignTrackingIds as v } from "./linkTrackingIds.js";
|
|
13
|
+
function O(c) {
|
|
14
|
+
const n = new DOMParser().parseFromString(c, "text/html").querySelectorAll(`[${C.PAGE_LIST}]`), t = [];
|
|
15
|
+
return n.forEach((a) => {
|
|
16
|
+
const r = a.getAttribute(C.PAGE_LIST);
|
|
17
|
+
r && t.push(...R(r));
|
|
15
18
|
}), [...new Set(t)];
|
|
16
19
|
}
|
|
17
|
-
async function
|
|
18
|
-
const m = new DOMParser().parseFromString(
|
|
20
|
+
async function M(c) {
|
|
21
|
+
const m = new DOMParser().parseFromString(c, "text/html").querySelectorAll(".recommendation-block-v2");
|
|
19
22
|
if (m.length === 0)
|
|
20
23
|
return;
|
|
21
|
-
const
|
|
24
|
+
const n = T();
|
|
22
25
|
m.forEach((t) => {
|
|
23
|
-
var
|
|
24
|
-
const a = t.getAttribute("recommendation-id"),
|
|
25
|
-
if (!Number.isFinite(
|
|
26
|
+
var l, g, f, i, S;
|
|
27
|
+
const a = t.getAttribute("recommendation-id"), r = a ? Number(a) : NaN;
|
|
28
|
+
if (!Number.isFinite(r))
|
|
26
29
|
return;
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
30
|
+
const p = t.getAttribute("esd-ext-config");
|
|
31
|
+
if (!p)
|
|
29
32
|
return;
|
|
30
33
|
let e;
|
|
31
34
|
try {
|
|
32
|
-
e = JSON.parse(
|
|
35
|
+
e = JSON.parse(p);
|
|
33
36
|
} catch {
|
|
34
37
|
return;
|
|
35
38
|
}
|
|
36
39
|
if (!e || typeof e != "object" || Array.isArray(e))
|
|
37
40
|
return;
|
|
38
|
-
const
|
|
41
|
+
const o = {
|
|
39
42
|
// Normalize legacy strategy keys (e.g. `mostViewed` → `mostPopular`) so
|
|
40
43
|
// already-saved blocks that never re-run the migrator don't emit a
|
|
41
44
|
// strategy-less campaign URL. `||` also catches '' / undefined (SD-144882).
|
|
42
|
-
strategy:
|
|
43
|
-
language: e.language ??
|
|
44
|
-
size: e.size ??
|
|
45
|
+
strategy: L(e.strategy) || s.strategy,
|
|
46
|
+
language: e.language ?? s.language,
|
|
47
|
+
size: e.size ?? s.size,
|
|
45
48
|
// Spread the default arrays so each block gets a fresh reference
|
|
46
49
|
// instead of sharing the singleton in DEFAULT_NODE_CONFIG.
|
|
47
|
-
productIds: e.productIds ?? [...
|
|
48
|
-
filters: e.filters ?? [...
|
|
49
|
-
shuffleProducts: e.shuffleProducts ??
|
|
50
|
-
currencyCode: ((
|
|
51
|
-
currencyAlignment: ((
|
|
52
|
-
currencyDecimalCount: ((
|
|
53
|
-
currencyDecimalSeparator: ((
|
|
54
|
-
currencyThousandSeparator: ((
|
|
50
|
+
productIds: e.productIds ?? [...s.productIds],
|
|
51
|
+
filters: e.filters ?? [...s.filters],
|
|
52
|
+
shuffleProducts: e.shuffleProducts ?? s.shuffleProducts,
|
|
53
|
+
currencyCode: ((l = e.currency) == null ? void 0 : l.code) ?? d.code,
|
|
54
|
+
currencyAlignment: ((g = e.currency) == null ? void 0 : g.alignment) ?? d.alignment,
|
|
55
|
+
currencyDecimalCount: ((f = e.currency) == null ? void 0 : f.decimalCount) ?? d.decimalCount,
|
|
56
|
+
currencyDecimalSeparator: ((i = e.currency) == null ? void 0 : i.decimalSeparator) ?? d.decimalSeparator,
|
|
57
|
+
currencyThousandSeparator: ((S = e.currency) == null ? void 0 : S.thousandSeparator) ?? d.thousandSeparator
|
|
55
58
|
};
|
|
56
|
-
|
|
59
|
+
n.seedBlockUrlConfig(r, o);
|
|
57
60
|
});
|
|
58
61
|
try {
|
|
59
|
-
await
|
|
62
|
+
await n.fetchRecommendationCreateData();
|
|
60
63
|
} catch (t) {
|
|
61
64
|
console.warn(
|
|
62
65
|
"Recommendation reference data pre-load failed; validator will skip the availability check.",
|
|
@@ -64,43 +67,51 @@ async function R(s) {
|
|
|
64
67
|
);
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
|
-
const
|
|
68
|
-
const
|
|
70
|
+
const Z = () => {
|
|
71
|
+
const c = N(), u = _(), { getCompiledEmail: m, getTemplateData: n, updateHtmlAndCss: t } = k(), { compileHtml: a, compileAmpHtml: r } = x(), { isFeatureEnabled: p } = U();
|
|
69
72
|
return {
|
|
70
73
|
prepareTemplateDetails: async () => {
|
|
71
|
-
|
|
74
|
+
let { html: o, css: l, syncModulesIds: g = [] } = await n();
|
|
75
|
+
if (p("linkTrackingIds"))
|
|
76
|
+
try {
|
|
77
|
+
const h = z(), { html: A, changed: H, nextSeq: I } = v(o, h.trackIdSessionFloor);
|
|
78
|
+
H && (await t(A, l), o = A), h.trackIdSessionFloor = I;
|
|
79
|
+
} catch (h) {
|
|
80
|
+
console.error("Tracking-id assignment failed, saving without new ids:", h);
|
|
81
|
+
}
|
|
82
|
+
const { html: f, ampHtml: i = "", ampErrors: S = [] } = await m({
|
|
72
83
|
minimize: !0,
|
|
73
84
|
resetDataSavedFlag: !1
|
|
74
|
-
})
|
|
75
|
-
u.selectedUnsubscribePages.length && await u.fetchTemplates(), await
|
|
76
|
-
const { compiledHtml:
|
|
85
|
+
});
|
|
86
|
+
u.selectedUnsubscribePages.length && await u.fetchTemplates(), await M(o);
|
|
87
|
+
const { compiledHtml: w, stats: y, appliedRules: D } = a(f), E = i && r(i).compiledHtml, P = c.getSelectedDynamicContentList, F = T(), b = O(o);
|
|
77
88
|
return console.debug("HTML Compilation Stats:", {
|
|
78
|
-
originalSize:
|
|
79
|
-
compiledSize:
|
|
80
|
-
reduction: `${
|
|
81
|
-
appliedRules:
|
|
82
|
-
executionTime: `${
|
|
89
|
+
originalSize: y.originalSize,
|
|
90
|
+
compiledSize: y.compiledSize,
|
|
91
|
+
reduction: `${y.reductionPercentage.toFixed(2)}%`,
|
|
92
|
+
appliedRules: D,
|
|
93
|
+
executionTime: `${y.executionTime.toFixed(2)}ms`
|
|
83
94
|
}), {
|
|
84
|
-
dynamicContentList:
|
|
85
|
-
compiledHtml:
|
|
86
|
-
rawHtml:
|
|
87
|
-
css:
|
|
88
|
-
ampHtml:
|
|
89
|
-
ampErrors:
|
|
95
|
+
dynamicContentList: P,
|
|
96
|
+
compiledHtml: w,
|
|
97
|
+
rawHtml: o,
|
|
98
|
+
css: l,
|
|
99
|
+
ampHtml: E,
|
|
100
|
+
ampErrors: S,
|
|
90
101
|
modules: g.map(Number),
|
|
91
102
|
recommendation: {
|
|
92
|
-
campaignUrls:
|
|
103
|
+
campaignUrls: F.recommendationCampaignUrls,
|
|
93
104
|
configs: {}
|
|
94
105
|
},
|
|
95
106
|
unsubscribe: {
|
|
96
|
-
status:
|
|
97
|
-
config:
|
|
107
|
+
status: b.length > 0,
|
|
108
|
+
config: b
|
|
98
109
|
}
|
|
99
110
|
};
|
|
100
111
|
}
|
|
101
112
|
};
|
|
102
113
|
};
|
|
103
114
|
export {
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
O as getHtmlReferencedUnsubscribePages,
|
|
116
|
+
Z as useTemplatePreparation
|
|
106
117
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useinsider/guido",
|
|
3
|
-
"version": "3.13.
|
|
3
|
+
"version": "3.13.1-beta.88c2f20",
|
|
4
4
|
"description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
|
|
5
5
|
"main": "./dist/guido.umd.cjs",
|
|
6
6
|
"module": "./dist/library.js",
|