@beworke/pixel-bemony 0.1.0-rc.1

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 (67) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +176 -0
  3. package/RELEASE_CANDIDATE.md +37 -0
  4. package/dist/browser/index.cjs.js +2598 -0
  5. package/dist/browser/index.cjs.js.map +1 -0
  6. package/dist/browser/index.d.mts +184 -0
  7. package/dist/browser/index.d.ts +184 -0
  8. package/dist/browser/index.esm.js +2557 -0
  9. package/dist/browser/index.esm.js.map +1 -0
  10. package/dist/browser/pixel-bemony.global.js +9848 -0
  11. package/dist/browser/pixel-bemony.global.js.map +1 -0
  12. package/dist/createBemonyPixel-BGRD66p-.d.mts +474 -0
  13. package/dist/createBemonyPixel-BGRD66p-.d.ts +474 -0
  14. package/dist/index.cjs.js +2154 -0
  15. package/dist/index.cjs.js.map +1 -0
  16. package/dist/index.d.mts +320 -0
  17. package/dist/index.d.ts +320 -0
  18. package/dist/index.esm.js +2081 -0
  19. package/dist/index.esm.js.map +1 -0
  20. package/docs/BACKEND_PURCHASE_AND_REDIRECTS.md +125 -0
  21. package/docs/BROWSER_EVENT_ENRICHMENT.md +116 -0
  22. package/docs/SCENARIOS.md +92 -0
  23. package/docs/SECURITY_LIMITATIONS.md +45 -0
  24. package/docs/TEST_MATRIX.md +39 -0
  25. package/docs/TROUBLESHOOTING.md +81 -0
  26. package/examples/README.md +73 -0
  27. package/examples/browser-bootstrap.html +47 -0
  28. package/examples/checkout-price-code.html +37 -0
  29. package/examples/funnel/donsell/downsell_1.html +130 -0
  30. package/examples/funnel/donsell/downsell_2.html +130 -0
  31. package/examples/funnel/donsell/downsell_3.html +130 -0
  32. package/examples/funnel/offer-page.html +105 -0
  33. package/examples/funnel/upsell/upsell_1.html +130 -0
  34. package/examples/funnel/upsell/upsell_2.html +130 -0
  35. package/examples/funnel/upsell/upsell_3.html +139 -0
  36. package/examples/offer-page-price-code.html +22 -0
  37. package/examples/one-click-price-code.html +38 -0
  38. package/examples/security/checkout-sim.css +408 -0
  39. package/examples/security/checkout-sim.js +414 -0
  40. package/examples/security/one-click/pri_downsell_1.html +85 -0
  41. package/examples/security/one-click/pri_downsell_1a.html +85 -0
  42. package/examples/security/one-click/pri_downsell_1b.html +78 -0
  43. package/examples/security/one-click/pri_downsell_2.html +78 -0
  44. package/examples/security/one-click/pri_downsell_2a.html +78 -0
  45. package/examples/security/one-click/pri_downsell_2b.html +78 -0
  46. package/examples/security/one-click/pri_downsell_3.html +78 -0
  47. package/examples/security/one-click/pri_downsell_3a.html +78 -0
  48. package/examples/security/one-click/pri_downsell_3b.html +78 -0
  49. package/examples/security/one-click/pri_upsell_1.html +78 -0
  50. package/examples/security/one-click/pri_upsell_1a.html +78 -0
  51. package/examples/security/one-click/pri_upsell_1b.html +78 -0
  52. package/examples/security/one-click/pri_upsell_2.html +78 -0
  53. package/examples/security/one-click/pri_upsell_2a.html +78 -0
  54. package/examples/security/one-click/pri_upsell_2b.html +78 -0
  55. package/examples/security/one-click/pri_upsell_3.html +78 -0
  56. package/examples/security/one-click/pri_upsell_3a.html +78 -0
  57. package/examples/security/one-click/pri_upsell_3b.html +78 -0
  58. package/examples/security/one-click/pri_upsell_3c.html +78 -0
  59. package/examples/security/pri1766322.html +333 -0
  60. package/examples/security/pri5529930.html +333 -0
  61. package/examples/security/pri6670988.html +334 -0
  62. package/examples/security/thank-you.html +65 -0
  63. package/examples/sim/funnel-flow.js +258 -0
  64. package/examples/sim/one-click-sim.js +167 -0
  65. package/examples/upsell-price-code.html +41 -0
  66. package/examples/url-context-navigation.html +96 -0
  67. package/package.json +63 -0
@@ -0,0 +1,320 @@
1
+ import { B as BemonyPublicPageContext, a as BemonyScenario } from './createBemonyPixel-BGRD66p-.mjs';
2
+ export { J as BEMONY_BROWSER_AUTO_INIT_DEFAULTS, K as BEMONY_DEFAULT_ALLOWED_DOMAINS, L as BEMONY_DEFAULT_API_ENDPOINT, M as BEMONY_DEFAULT_BROWSER_ENVIRONMENT, N as BEMONY_DEFAULT_BROWSER_SCENARIO, O as BEMONY_DEFAULT_NAMESPACE, P as BEMONY_DEFAULT_PIXEL_ID, G as BEMONY_ENVIRONMENTS, A as BEMONY_PAYMENT_METHODS, Q as BEMONY_PLATFORM_DEFAULTS, m as BEMONY_SCENARIOS, S as BEMONY_STORAGE_PREFIX, E as BemonyCheckoutInput, s as BemonyCommerceIdentityInput, T as BemonyCommerceInput, b as BemonyConfigOverrides, i as BemonyCorePixel, n as BemonyDeclineUpsellOptions, F as BemonyEnvironment, u as BemonyLeadInput, g as BemonyLifecycleError, j as BemonyLifecycleErrorCode, p as BemonyOfferInput, o as BemonyOneClickConfirmationInput, U as BemonyPageContextInput, z as BemonyPaymentMethod, y as BemonyPaymentMethodInput, h as BemonyPixel, k as BemonyPixelConstructOptions, e as BemonyPixelOptions, l as BemonyPixelState, I as BemonyPlatformOptions, W as BemonyValidationError, V as BemonyValidationErrorCode, C as CreateBemonyPixelConfigOptions, f as CreateBemonyPixelOptions, R as ResolvePriceCodeResult, d as createBemonyPixel, c as createBemonyPixelConfig, X as isBemonyPageContextInput, q as isCompleteBemonyOffer, v as isValidBemonyLead, D as isValidBemonyPaymentMethod, w as leadFingerprint, Y as normalizeBemonyPageContextInput, H as resolveBemonyEnvironment, t as resolvePriceCode, r as resolvePriceCodeFromAcceptElement, x as sanitizeLeadFields } from './createBemonyPixel-BGRD66p-.mjs';
3
+ import { PixelConfig } from '@beworke/pixel';
4
+ import { CommerceCartMode, UrlLinkDecorationConfig, UrlManagedParamConfig, UrlContextConfig, LinkAutoSource } from '@beworke/pixel/config';
5
+ import '@beworke/pixel/events';
6
+
7
+ type OfferPageCartMode = Extract<CommerceCartMode, 'landing_page' | 'single_product'>;
8
+ type ApplyOfferPageScenarioOptions = {
9
+ allowedDomains?: readonly string[];
10
+ currency?: string;
11
+ cartMode?: OfferPageCartMode;
12
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
13
+ };
14
+ /**
15
+ * Preset do cenário `offer-page` (domínio do cliente / VSL).
16
+ *
17
+ * - target `landing`
18
+ * - commerce `landing_page` | `single_product`
19
+ * - PAGE_VIEW pelo Core
20
+ * - conversion manual: viewContent + addToCart
21
+ * - UrlContext (sid + afid) por allowedDomains
22
+ * - LinkAutoSource: ADD_TO_CART em segmentos `pri*` sem data attributes
23
+ */
24
+ declare function applyOfferPageScenario(base: PixelConfig, options?: ApplyOfferPageScenarioOptions): PixelConfig;
25
+
26
+ type ApplyCheckoutScenarioOptions = {
27
+ allowedDomains?: readonly string[];
28
+ currency?: string;
29
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
30
+ /**
31
+ * Quando false, não registra o detector lifecycle de INITIATE_CHECKOUT.
32
+ * O wrapper também respeita a mesma flag em `maybeAutoInitiateCheckout`.
33
+ * Default: true.
34
+ */
35
+ autoInitiateCheckout?: boolean;
36
+ /**
37
+ * Quando false, não inclui o managed param `oid`. Default: true.
38
+ */
39
+ includeOidManagedParam?: boolean;
40
+ };
41
+ /**
42
+ * Preset do cenário `checkout` (domínio Bemony).
43
+ *
44
+ * - target `checkout`
45
+ * - commerce mode `checkout`
46
+ * - PAGE_VIEW pelo Core
47
+ * - INITIATE_CHECKOUT via wrapper (auto pós-init, idempotente)
48
+ * - manual: lead, addToCart, removeFromCart, addPaymentInfo
49
+ * - purchase manual desabilitado (browser não emite purchase)
50
+ */
51
+ declare function applyCheckoutScenario(base: PixelConfig, options?: ApplyCheckoutScenarioOptions): PixelConfig;
52
+
53
+ /** Base: buy `/pri*` + offer-page legado. No-thanks entra via `buildUpsellLinkSelector`. */
54
+ declare const BEMONY_UPSELL_BUY_LINK_SELECTOR = "a[href*=\"pri\"], [data-bemony-offer][href]";
55
+ /**
56
+ * Selector estático sem no-thanks (compat / testes sem URL).
57
+ * Preferir `buildUpsellLinkSelector(noThanksUrl)` quando `data-no-thanks` existir no script.
58
+ */
59
+ declare const BEMONY_UPSELL_LINK_SELECTOR = "a[href*=\"pri\"], [data-bemony-offer][href]";
60
+ /**
61
+ * Política de decoração upsell/downsell.
62
+ * - buy: `href` com `pri*`
63
+ * - no-thanks: âncora cujo `href` coincide com `data-no-thanks` do script
64
+ */
65
+ declare function buildUpsellLinkSelector(noThanksUrl?: string): string;
66
+ /**
67
+ * Compara href do link com a URL do script (`data-no-thanks`),
68
+ * resolvendo relativos contra a página atual.
69
+ */
70
+ declare function hrefMatchesNoThanksUrl(href: string | null | undefined, noThanksUrl: string, baseHref?: string): boolean;
71
+ type ApplyUpsellOfferScenarioOptions = {
72
+ allowedDomains?: readonly string[];
73
+ currency?: string;
74
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
75
+ includeOidManagedParam?: boolean;
76
+ /** URL de recusa (`data-no-thanks` no script) — entra no selector de decoração. */
77
+ noThanksUrl?: string;
78
+ };
79
+ /**
80
+ * Preset do cenário `upsell-offer` (domínio do cliente, pós-compra).
81
+ *
82
+ * - target `custom`
83
+ * - commerce mode `upsell` (sem catálogo obrigatório; priceCode via URL)
84
+ * - PAGE_VIEW pelo Core
85
+ * - conversion: ADD_TO_CART automático em links `/pri*` (mesmo source do offer-page)
86
+ * - UrlContext decora buy `/pri*` + no-thanks (href = script data-no-thanks)
87
+ *
88
+ * GAP: sem evento de decline no Core — `declineUpsell` não emite conversion.
89
+ */
90
+ declare function applyUpsellOfferScenario(base: PixelConfig, options?: ApplyUpsellOfferScenarioOptions): PixelConfig;
91
+
92
+ type ApplyOneClickCheckoutScenarioOptions = {
93
+ allowedDomains?: readonly string[];
94
+ currency?: string;
95
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
96
+ };
97
+ /**
98
+ * Preset do cenário `one-click-checkout`.
99
+ *
100
+ * Tracking apenas: PAGE_VIEW + INITIATE_CHECKOUT.
101
+ * Pagamento e PURCHASE ficam no backend/app — o Pixel não é SDK de pagamentos.
102
+ */
103
+ declare function applyOneClickCheckoutScenario(base: PixelConfig, options?: ApplyOneClickCheckoutScenarioOptions): PixelConfig;
104
+
105
+ type ApplyThankYouScenarioOptions = {
106
+ allowedDomains?: readonly string[];
107
+ currency?: string;
108
+ };
109
+ /**
110
+ * Preset do cenário `thank-you`.
111
+ *
112
+ * - target `custom`
113
+ * - PAGE_VIEW no init (Core)
114
+ * - sem PURCHASE browser
115
+ * - sem auto checkout / conversion manual
116
+ * - contexto público mínimo (pageId; publicOrderId só no domínio do app)
117
+ */
118
+ declare function applyThankYouScenario(base: PixelConfig, options?: ApplyThankYouScenarioOptions): PixelConfig;
119
+
120
+ /**
121
+ * Contratos conceituais backend ↔ Pixel (B7).
122
+ *
123
+ * PLACEHOLDER: estes tipos NÃO são o contrato HTTP final da API Bemony.
124
+ * Devem ser alinhados com a API real antes de uso em produção.
125
+ * Endpoint browser confirmado no Core: `{apiEndpoint}/pixels/public/event`
126
+ * (server purchase pode usar canal distinto — confirmar).
127
+ */
128
+ /** Params públicos seguros para Location de redirect 302. */
129
+ type BemonyPublicRedirectParams = {
130
+ sid?: string;
131
+ public_order_id?: string;
132
+ funnel_id?: string;
133
+ offer_id?: string;
134
+ /** UTM / click ids aprovados — não incluir token/PII. */
135
+ attribution?: Record<string, string>;
136
+ };
137
+ /**
138
+ * Payload conceitual de PURCHASE server-side.
139
+ * @deprecated-contract PLACEHOLDER — alinhar com API real.
140
+ */
141
+ type BemonyServerPurchasePayloadPlaceholder = {
142
+ type: 'PURCHASE';
143
+ event_id: string;
144
+ occurred_at: string;
145
+ sid?: string;
146
+ public_order_id?: string;
147
+ transaction_id?: string;
148
+ value?: number;
149
+ currency?: string;
150
+ items?: ReadonlyArray<{
151
+ id: string;
152
+ name?: string;
153
+ price?: number;
154
+ quantity?: number;
155
+ type?: string;
156
+ }>;
157
+ attribution?: Record<string, unknown>;
158
+ page_context?: Record<string, unknown>;
159
+ };
160
+ /** Chave de idempotência one-click (conceitual). */
161
+ type BemonyOneClickIdempotencyKeyPlaceholder = {
162
+ one_click_token: string;
163
+ offer_id: string;
164
+ public_order_id: string;
165
+ };
166
+ type BemonyOneClickBackendResultPlaceholder = {
167
+ status: 'success';
168
+ /** Destino seguro pós-compra (thank-you / próxima etapa). */
169
+ redirectTo: string;
170
+ /** event_id do PURCHASE server, se aplicável. */
171
+ purchaseEventId?: string;
172
+ } | {
173
+ status: 'failure';
174
+ /** Mensagem sanitizada para o app — sem token/PAN. */
175
+ errorCode: string;
176
+ retryable?: boolean;
177
+ };
178
+ /**
179
+ * Dedupe futuro browser+server (fora da V1).
180
+ * PLACEHOLDER: exige evolução contratual compartilhando event_id.
181
+ */
182
+ type BemonyBrowserServerDedupePlaceholder = {
183
+ sharedEventId: string;
184
+ source: 'browser' | 'server';
185
+ };
186
+
187
+ /**
188
+ * Valida o formato conceitual do payload de PURCHASE server-side.
189
+ * PLACEHOLDER — não afirma compatibilidade com a API HTTP final.
190
+ */
191
+ declare function validateBemonyServerPurchasePlaceholder(payload: unknown): BemonyServerPurchasePayloadPlaceholder;
192
+ /**
193
+ * Garante que params de redirect 302 não incluem segredos.
194
+ */
195
+ declare function assertSafePublicRedirectParams(params: BemonyPublicRedirectParams): BemonyPublicRedirectParams;
196
+ /**
197
+ * Monta query string pública para Location (conceitual).
198
+ * Não inventa host/path — só serializa params já aprovados.
199
+ */
200
+ declare function buildPublicRedirectQuery(params: BemonyPublicRedirectParams): string;
201
+
202
+ type ResolveBemonyPageContextSources = {
203
+ /** Precedência 1 — input explícito do app. */
204
+ input?: BemonyPublicPageContext;
205
+ /** Precedência 2 — params públicos já filtrados da URL. */
206
+ urlParams?: Readonly<Record<string, string>>;
207
+ /** Precedência 3 — metadata declarativa da página. */
208
+ pageMetadata?: BemonyPublicPageContext;
209
+ /** Precedência 4 — defaults do cenário. */
210
+ scenarioDefaults?: BemonyPublicPageContext;
211
+ };
212
+ /**
213
+ * Resolve contexto público com precedência:
214
+ * input explícito → URL permitida → metadata da página → default do cenário.
215
+ *
216
+ * Não gerencia sid, attribution, storage nem token efêmero.
217
+ */
218
+ declare function resolveBemonyPageContext(sources?: ResolveBemonyPageContextSources): BemonyPublicPageContext;
219
+
220
+ /** Campos públicos obrigatórios por cenário (contrato B1). */
221
+ declare const REQUIRED_PUBLIC_FIELDS: Record<BemonyScenario, readonly (keyof BemonyPublicPageContext)[]>;
222
+ type ValidateBemonyPageContextOptions = {
223
+ scenario: BemonyScenario;
224
+ publicContext: BemonyPublicPageContext;
225
+ /** Quando true, aplica trim/charset aos IDs públicos. Default: true. */
226
+ sanitize?: boolean;
227
+ };
228
+ /**
229
+ * Valida obrigatoriedade por cenário e rejeita IDs públicos inválidos.
230
+ */
231
+ declare function validateBemonyPageContext(options: ValidateBemonyPageContextOptions): BemonyPublicPageContext;
232
+
233
+ /**
234
+ * Política de decoração de links Bemony.
235
+ * `allowedDomains` filtra destinos; `selector` opcional restringe quais âncoras.
236
+ */
237
+ type BemonyLinkPolicy = {
238
+ /** Domínios aprovados para decoração (`sid`, `afid`, forwards). */
239
+ allowedDomains: string[];
240
+ /**
241
+ * CSS selector de CTAs (ex.: upsell accept/decline).
242
+ * Sem selector, o Core usa `a[href]` e filtra só por domínio.
243
+ */
244
+ selector?: string;
245
+ strategy: NonNullable<UrlLinkDecorationConfig['strategy']>;
246
+ preserveExisting: boolean;
247
+ overwriteExisting: boolean;
248
+ decorateMailto: boolean;
249
+ decorateTel: boolean;
250
+ decorateHashLinks: boolean;
251
+ mergeDefaultExcludedDomains: boolean;
252
+ mergeDefaultExcludeSelectors: boolean;
253
+ excludeSelectors?: string[];
254
+ };
255
+ /** Selector legado de offer-page (export estável). */
256
+ declare const DEFAULT_BEMONY_LINK_SELECTOR = "[data-bemony-offer][href]";
257
+ type CreateBemonyLinkPolicyOptions = {
258
+ allowedDomains?: readonly string[];
259
+ /** Restringe decoração a CTAs (ex.: `BEMONY_UPSELL_LINK_SELECTOR`). */
260
+ selector?: string;
261
+ strategy?: BemonyLinkPolicy['strategy'];
262
+ preserveExisting?: boolean;
263
+ overwriteExisting?: boolean;
264
+ excludeSelectors?: readonly string[];
265
+ };
266
+ /**
267
+ * Normaliza domínio: lowercase, sem protocolo/path/query/hash/porta.
268
+ */
269
+ declare function normalizeAllowedDomain(domain: string): string;
270
+ /**
271
+ * Normaliza, deduplica e remove entradas vazias.
272
+ */
273
+ declare function normalizeAllowedDomains(domains: readonly string[]): string[];
274
+ declare function createBemonyLinkPolicy(options?: CreateBemonyLinkPolicyOptions): BemonyLinkPolicy;
275
+
276
+ /** Managed param oficial do sid público (≠ session_id interno). */
277
+ declare const BEMONY_SID_MANAGED_PARAM: UrlManagedParamConfig;
278
+ /**
279
+ * Managed param oficial do afiliado (`afid`).
280
+ * Nunca possui generator — o Pixel não cria afiliado.
281
+ */
282
+ declare const BEMONY_AFID_MANAGED_PARAM: UrlManagedParamConfig;
283
+ /**
284
+ * Params que nunca devem ser capturados/encaminhados pelo UrlContext.
285
+ */
286
+ declare const BEMONY_FORWARD_DENYLIST: readonly string[];
287
+ type ConfigureBemonyLinksOptions = CreateBemonyLinkPolicyOptions & {
288
+ /** Quando false, não inclui o managed param `sid`. Default: true. */
289
+ includeSidManagedParam?: boolean;
290
+ /** Quando false, não inclui o managed param `afid`. Default: true. */
291
+ includeAfidManagedParam?: boolean;
292
+ /** Quando false, não inclui o managed param `oid`. Default: true (todos os scenarios). */
293
+ includeOidManagedParam?: boolean;
294
+ /** Quando false, não inclui `fid`/`fsid`. Default: true. */
295
+ includeFunnelManagedParams?: boolean;
296
+ };
297
+ /**
298
+ * Produz `PixelConfig.modules.core.urlContext` para cenários Bemony.
299
+ */
300
+ declare function configureBemonyLinks(options?: ConfigureBemonyLinksOptions): UrlContextConfig;
301
+
302
+ /**
303
+ * Cria a `LinkAutoSource` oficial de ofertas Bemony.
304
+ *
305
+ * - Match por hostname permitido + segmento de path `pri*`
306
+ * - Extrai `priceCode` do último segmento do path
307
+ * - Sem catálogo: o Core recebe priceCode via binding; o mapper usa-o como identidade
308
+ */
309
+ declare function createBemonyOfferLinkSource(allowedDomains: readonly string[]): LinkAutoSource;
310
+
311
+ /**
312
+ * Extrai o priceCode público (`pri*`) do pathname de uma URL.
313
+ *
314
+ * - Usa somente pathname (ignora query e hash)
315
+ * - Suporta barra final
316
+ * - Não faz fetch nem consulta catálogo
317
+ */
318
+ declare function extractPriceCodeFromUrl(url: string | URL): string | null;
319
+
320
+ export { BEMONY_AFID_MANAGED_PARAM, BEMONY_FORWARD_DENYLIST, BEMONY_SID_MANAGED_PARAM, BEMONY_UPSELL_BUY_LINK_SELECTOR, BEMONY_UPSELL_LINK_SELECTOR, type BemonyBrowserServerDedupePlaceholder, type BemonyLinkPolicy, type BemonyOneClickBackendResultPlaceholder, type BemonyOneClickIdempotencyKeyPlaceholder, BemonyPublicPageContext, type BemonyPublicRedirectParams, BemonyScenario, type BemonyServerPurchasePayloadPlaceholder, type ConfigureBemonyLinksOptions, DEFAULT_BEMONY_LINK_SELECTOR, type OfferPageCartMode, REQUIRED_PUBLIC_FIELDS, type ResolveBemonyPageContextSources, type ValidateBemonyPageContextOptions, applyCheckoutScenario, applyOfferPageScenario, applyOneClickCheckoutScenario, applyThankYouScenario, applyUpsellOfferScenario, assertSafePublicRedirectParams, buildPublicRedirectQuery, buildUpsellLinkSelector, configureBemonyLinks, createBemonyLinkPolicy, createBemonyOfferLinkSource, extractPriceCodeFromUrl, hrefMatchesNoThanksUrl, normalizeAllowedDomain, normalizeAllowedDomains, resolveBemonyPageContext, validateBemonyPageContext, validateBemonyServerPurchasePlaceholder };
@@ -0,0 +1,320 @@
1
+ import { B as BemonyPublicPageContext, a as BemonyScenario } from './createBemonyPixel-BGRD66p-.js';
2
+ export { J as BEMONY_BROWSER_AUTO_INIT_DEFAULTS, K as BEMONY_DEFAULT_ALLOWED_DOMAINS, L as BEMONY_DEFAULT_API_ENDPOINT, M as BEMONY_DEFAULT_BROWSER_ENVIRONMENT, N as BEMONY_DEFAULT_BROWSER_SCENARIO, O as BEMONY_DEFAULT_NAMESPACE, P as BEMONY_DEFAULT_PIXEL_ID, G as BEMONY_ENVIRONMENTS, A as BEMONY_PAYMENT_METHODS, Q as BEMONY_PLATFORM_DEFAULTS, m as BEMONY_SCENARIOS, S as BEMONY_STORAGE_PREFIX, E as BemonyCheckoutInput, s as BemonyCommerceIdentityInput, T as BemonyCommerceInput, b as BemonyConfigOverrides, i as BemonyCorePixel, n as BemonyDeclineUpsellOptions, F as BemonyEnvironment, u as BemonyLeadInput, g as BemonyLifecycleError, j as BemonyLifecycleErrorCode, p as BemonyOfferInput, o as BemonyOneClickConfirmationInput, U as BemonyPageContextInput, z as BemonyPaymentMethod, y as BemonyPaymentMethodInput, h as BemonyPixel, k as BemonyPixelConstructOptions, e as BemonyPixelOptions, l as BemonyPixelState, I as BemonyPlatformOptions, W as BemonyValidationError, V as BemonyValidationErrorCode, C as CreateBemonyPixelConfigOptions, f as CreateBemonyPixelOptions, R as ResolvePriceCodeResult, d as createBemonyPixel, c as createBemonyPixelConfig, X as isBemonyPageContextInput, q as isCompleteBemonyOffer, v as isValidBemonyLead, D as isValidBemonyPaymentMethod, w as leadFingerprint, Y as normalizeBemonyPageContextInput, H as resolveBemonyEnvironment, t as resolvePriceCode, r as resolvePriceCodeFromAcceptElement, x as sanitizeLeadFields } from './createBemonyPixel-BGRD66p-.js';
3
+ import { PixelConfig } from '@beworke/pixel';
4
+ import { CommerceCartMode, UrlLinkDecorationConfig, UrlManagedParamConfig, UrlContextConfig, LinkAutoSource } from '@beworke/pixel/config';
5
+ import '@beworke/pixel/events';
6
+
7
+ type OfferPageCartMode = Extract<CommerceCartMode, 'landing_page' | 'single_product'>;
8
+ type ApplyOfferPageScenarioOptions = {
9
+ allowedDomains?: readonly string[];
10
+ currency?: string;
11
+ cartMode?: OfferPageCartMode;
12
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
13
+ };
14
+ /**
15
+ * Preset do cenário `offer-page` (domínio do cliente / VSL).
16
+ *
17
+ * - target `landing`
18
+ * - commerce `landing_page` | `single_product`
19
+ * - PAGE_VIEW pelo Core
20
+ * - conversion manual: viewContent + addToCart
21
+ * - UrlContext (sid + afid) por allowedDomains
22
+ * - LinkAutoSource: ADD_TO_CART em segmentos `pri*` sem data attributes
23
+ */
24
+ declare function applyOfferPageScenario(base: PixelConfig, options?: ApplyOfferPageScenarioOptions): PixelConfig;
25
+
26
+ type ApplyCheckoutScenarioOptions = {
27
+ allowedDomains?: readonly string[];
28
+ currency?: string;
29
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
30
+ /**
31
+ * Quando false, não registra o detector lifecycle de INITIATE_CHECKOUT.
32
+ * O wrapper também respeita a mesma flag em `maybeAutoInitiateCheckout`.
33
+ * Default: true.
34
+ */
35
+ autoInitiateCheckout?: boolean;
36
+ /**
37
+ * Quando false, não inclui o managed param `oid`. Default: true.
38
+ */
39
+ includeOidManagedParam?: boolean;
40
+ };
41
+ /**
42
+ * Preset do cenário `checkout` (domínio Bemony).
43
+ *
44
+ * - target `checkout`
45
+ * - commerce mode `checkout`
46
+ * - PAGE_VIEW pelo Core
47
+ * - INITIATE_CHECKOUT via wrapper (auto pós-init, idempotente)
48
+ * - manual: lead, addToCart, removeFromCart, addPaymentInfo
49
+ * - purchase manual desabilitado (browser não emite purchase)
50
+ */
51
+ declare function applyCheckoutScenario(base: PixelConfig, options?: ApplyCheckoutScenarioOptions): PixelConfig;
52
+
53
+ /** Base: buy `/pri*` + offer-page legado. No-thanks entra via `buildUpsellLinkSelector`. */
54
+ declare const BEMONY_UPSELL_BUY_LINK_SELECTOR = "a[href*=\"pri\"], [data-bemony-offer][href]";
55
+ /**
56
+ * Selector estático sem no-thanks (compat / testes sem URL).
57
+ * Preferir `buildUpsellLinkSelector(noThanksUrl)` quando `data-no-thanks` existir no script.
58
+ */
59
+ declare const BEMONY_UPSELL_LINK_SELECTOR = "a[href*=\"pri\"], [data-bemony-offer][href]";
60
+ /**
61
+ * Política de decoração upsell/downsell.
62
+ * - buy: `href` com `pri*`
63
+ * - no-thanks: âncora cujo `href` coincide com `data-no-thanks` do script
64
+ */
65
+ declare function buildUpsellLinkSelector(noThanksUrl?: string): string;
66
+ /**
67
+ * Compara href do link com a URL do script (`data-no-thanks`),
68
+ * resolvendo relativos contra a página atual.
69
+ */
70
+ declare function hrefMatchesNoThanksUrl(href: string | null | undefined, noThanksUrl: string, baseHref?: string): boolean;
71
+ type ApplyUpsellOfferScenarioOptions = {
72
+ allowedDomains?: readonly string[];
73
+ currency?: string;
74
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
75
+ includeOidManagedParam?: boolean;
76
+ /** URL de recusa (`data-no-thanks` no script) — entra no selector de decoração. */
77
+ noThanksUrl?: string;
78
+ };
79
+ /**
80
+ * Preset do cenário `upsell-offer` (domínio do cliente, pós-compra).
81
+ *
82
+ * - target `custom`
83
+ * - commerce mode `upsell` (sem catálogo obrigatório; priceCode via URL)
84
+ * - PAGE_VIEW pelo Core
85
+ * - conversion: ADD_TO_CART automático em links `/pri*` (mesmo source do offer-page)
86
+ * - UrlContext decora buy `/pri*` + no-thanks (href = script data-no-thanks)
87
+ *
88
+ * GAP: sem evento de decline no Core — `declineUpsell` não emite conversion.
89
+ */
90
+ declare function applyUpsellOfferScenario(base: PixelConfig, options?: ApplyUpsellOfferScenarioOptions): PixelConfig;
91
+
92
+ type ApplyOneClickCheckoutScenarioOptions = {
93
+ allowedDomains?: readonly string[];
94
+ currency?: string;
95
+ products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];
96
+ };
97
+ /**
98
+ * Preset do cenário `one-click-checkout`.
99
+ *
100
+ * Tracking apenas: PAGE_VIEW + INITIATE_CHECKOUT.
101
+ * Pagamento e PURCHASE ficam no backend/app — o Pixel não é SDK de pagamentos.
102
+ */
103
+ declare function applyOneClickCheckoutScenario(base: PixelConfig, options?: ApplyOneClickCheckoutScenarioOptions): PixelConfig;
104
+
105
+ type ApplyThankYouScenarioOptions = {
106
+ allowedDomains?: readonly string[];
107
+ currency?: string;
108
+ };
109
+ /**
110
+ * Preset do cenário `thank-you`.
111
+ *
112
+ * - target `custom`
113
+ * - PAGE_VIEW no init (Core)
114
+ * - sem PURCHASE browser
115
+ * - sem auto checkout / conversion manual
116
+ * - contexto público mínimo (pageId; publicOrderId só no domínio do app)
117
+ */
118
+ declare function applyThankYouScenario(base: PixelConfig, options?: ApplyThankYouScenarioOptions): PixelConfig;
119
+
120
+ /**
121
+ * Contratos conceituais backend ↔ Pixel (B7).
122
+ *
123
+ * PLACEHOLDER: estes tipos NÃO são o contrato HTTP final da API Bemony.
124
+ * Devem ser alinhados com a API real antes de uso em produção.
125
+ * Endpoint browser confirmado no Core: `{apiEndpoint}/pixels/public/event`
126
+ * (server purchase pode usar canal distinto — confirmar).
127
+ */
128
+ /** Params públicos seguros para Location de redirect 302. */
129
+ type BemonyPublicRedirectParams = {
130
+ sid?: string;
131
+ public_order_id?: string;
132
+ funnel_id?: string;
133
+ offer_id?: string;
134
+ /** UTM / click ids aprovados — não incluir token/PII. */
135
+ attribution?: Record<string, string>;
136
+ };
137
+ /**
138
+ * Payload conceitual de PURCHASE server-side.
139
+ * @deprecated-contract PLACEHOLDER — alinhar com API real.
140
+ */
141
+ type BemonyServerPurchasePayloadPlaceholder = {
142
+ type: 'PURCHASE';
143
+ event_id: string;
144
+ occurred_at: string;
145
+ sid?: string;
146
+ public_order_id?: string;
147
+ transaction_id?: string;
148
+ value?: number;
149
+ currency?: string;
150
+ items?: ReadonlyArray<{
151
+ id: string;
152
+ name?: string;
153
+ price?: number;
154
+ quantity?: number;
155
+ type?: string;
156
+ }>;
157
+ attribution?: Record<string, unknown>;
158
+ page_context?: Record<string, unknown>;
159
+ };
160
+ /** Chave de idempotência one-click (conceitual). */
161
+ type BemonyOneClickIdempotencyKeyPlaceholder = {
162
+ one_click_token: string;
163
+ offer_id: string;
164
+ public_order_id: string;
165
+ };
166
+ type BemonyOneClickBackendResultPlaceholder = {
167
+ status: 'success';
168
+ /** Destino seguro pós-compra (thank-you / próxima etapa). */
169
+ redirectTo: string;
170
+ /** event_id do PURCHASE server, se aplicável. */
171
+ purchaseEventId?: string;
172
+ } | {
173
+ status: 'failure';
174
+ /** Mensagem sanitizada para o app — sem token/PAN. */
175
+ errorCode: string;
176
+ retryable?: boolean;
177
+ };
178
+ /**
179
+ * Dedupe futuro browser+server (fora da V1).
180
+ * PLACEHOLDER: exige evolução contratual compartilhando event_id.
181
+ */
182
+ type BemonyBrowserServerDedupePlaceholder = {
183
+ sharedEventId: string;
184
+ source: 'browser' | 'server';
185
+ };
186
+
187
+ /**
188
+ * Valida o formato conceitual do payload de PURCHASE server-side.
189
+ * PLACEHOLDER — não afirma compatibilidade com a API HTTP final.
190
+ */
191
+ declare function validateBemonyServerPurchasePlaceholder(payload: unknown): BemonyServerPurchasePayloadPlaceholder;
192
+ /**
193
+ * Garante que params de redirect 302 não incluem segredos.
194
+ */
195
+ declare function assertSafePublicRedirectParams(params: BemonyPublicRedirectParams): BemonyPublicRedirectParams;
196
+ /**
197
+ * Monta query string pública para Location (conceitual).
198
+ * Não inventa host/path — só serializa params já aprovados.
199
+ */
200
+ declare function buildPublicRedirectQuery(params: BemonyPublicRedirectParams): string;
201
+
202
+ type ResolveBemonyPageContextSources = {
203
+ /** Precedência 1 — input explícito do app. */
204
+ input?: BemonyPublicPageContext;
205
+ /** Precedência 2 — params públicos já filtrados da URL. */
206
+ urlParams?: Readonly<Record<string, string>>;
207
+ /** Precedência 3 — metadata declarativa da página. */
208
+ pageMetadata?: BemonyPublicPageContext;
209
+ /** Precedência 4 — defaults do cenário. */
210
+ scenarioDefaults?: BemonyPublicPageContext;
211
+ };
212
+ /**
213
+ * Resolve contexto público com precedência:
214
+ * input explícito → URL permitida → metadata da página → default do cenário.
215
+ *
216
+ * Não gerencia sid, attribution, storage nem token efêmero.
217
+ */
218
+ declare function resolveBemonyPageContext(sources?: ResolveBemonyPageContextSources): BemonyPublicPageContext;
219
+
220
+ /** Campos públicos obrigatórios por cenário (contrato B1). */
221
+ declare const REQUIRED_PUBLIC_FIELDS: Record<BemonyScenario, readonly (keyof BemonyPublicPageContext)[]>;
222
+ type ValidateBemonyPageContextOptions = {
223
+ scenario: BemonyScenario;
224
+ publicContext: BemonyPublicPageContext;
225
+ /** Quando true, aplica trim/charset aos IDs públicos. Default: true. */
226
+ sanitize?: boolean;
227
+ };
228
+ /**
229
+ * Valida obrigatoriedade por cenário e rejeita IDs públicos inválidos.
230
+ */
231
+ declare function validateBemonyPageContext(options: ValidateBemonyPageContextOptions): BemonyPublicPageContext;
232
+
233
+ /**
234
+ * Política de decoração de links Bemony.
235
+ * `allowedDomains` filtra destinos; `selector` opcional restringe quais âncoras.
236
+ */
237
+ type BemonyLinkPolicy = {
238
+ /** Domínios aprovados para decoração (`sid`, `afid`, forwards). */
239
+ allowedDomains: string[];
240
+ /**
241
+ * CSS selector de CTAs (ex.: upsell accept/decline).
242
+ * Sem selector, o Core usa `a[href]` e filtra só por domínio.
243
+ */
244
+ selector?: string;
245
+ strategy: NonNullable<UrlLinkDecorationConfig['strategy']>;
246
+ preserveExisting: boolean;
247
+ overwriteExisting: boolean;
248
+ decorateMailto: boolean;
249
+ decorateTel: boolean;
250
+ decorateHashLinks: boolean;
251
+ mergeDefaultExcludedDomains: boolean;
252
+ mergeDefaultExcludeSelectors: boolean;
253
+ excludeSelectors?: string[];
254
+ };
255
+ /** Selector legado de offer-page (export estável). */
256
+ declare const DEFAULT_BEMONY_LINK_SELECTOR = "[data-bemony-offer][href]";
257
+ type CreateBemonyLinkPolicyOptions = {
258
+ allowedDomains?: readonly string[];
259
+ /** Restringe decoração a CTAs (ex.: `BEMONY_UPSELL_LINK_SELECTOR`). */
260
+ selector?: string;
261
+ strategy?: BemonyLinkPolicy['strategy'];
262
+ preserveExisting?: boolean;
263
+ overwriteExisting?: boolean;
264
+ excludeSelectors?: readonly string[];
265
+ };
266
+ /**
267
+ * Normaliza domínio: lowercase, sem protocolo/path/query/hash/porta.
268
+ */
269
+ declare function normalizeAllowedDomain(domain: string): string;
270
+ /**
271
+ * Normaliza, deduplica e remove entradas vazias.
272
+ */
273
+ declare function normalizeAllowedDomains(domains: readonly string[]): string[];
274
+ declare function createBemonyLinkPolicy(options?: CreateBemonyLinkPolicyOptions): BemonyLinkPolicy;
275
+
276
+ /** Managed param oficial do sid público (≠ session_id interno). */
277
+ declare const BEMONY_SID_MANAGED_PARAM: UrlManagedParamConfig;
278
+ /**
279
+ * Managed param oficial do afiliado (`afid`).
280
+ * Nunca possui generator — o Pixel não cria afiliado.
281
+ */
282
+ declare const BEMONY_AFID_MANAGED_PARAM: UrlManagedParamConfig;
283
+ /**
284
+ * Params que nunca devem ser capturados/encaminhados pelo UrlContext.
285
+ */
286
+ declare const BEMONY_FORWARD_DENYLIST: readonly string[];
287
+ type ConfigureBemonyLinksOptions = CreateBemonyLinkPolicyOptions & {
288
+ /** Quando false, não inclui o managed param `sid`. Default: true. */
289
+ includeSidManagedParam?: boolean;
290
+ /** Quando false, não inclui o managed param `afid`. Default: true. */
291
+ includeAfidManagedParam?: boolean;
292
+ /** Quando false, não inclui o managed param `oid`. Default: true (todos os scenarios). */
293
+ includeOidManagedParam?: boolean;
294
+ /** Quando false, não inclui `fid`/`fsid`. Default: true. */
295
+ includeFunnelManagedParams?: boolean;
296
+ };
297
+ /**
298
+ * Produz `PixelConfig.modules.core.urlContext` para cenários Bemony.
299
+ */
300
+ declare function configureBemonyLinks(options?: ConfigureBemonyLinksOptions): UrlContextConfig;
301
+
302
+ /**
303
+ * Cria a `LinkAutoSource` oficial de ofertas Bemony.
304
+ *
305
+ * - Match por hostname permitido + segmento de path `pri*`
306
+ * - Extrai `priceCode` do último segmento do path
307
+ * - Sem catálogo: o Core recebe priceCode via binding; o mapper usa-o como identidade
308
+ */
309
+ declare function createBemonyOfferLinkSource(allowedDomains: readonly string[]): LinkAutoSource;
310
+
311
+ /**
312
+ * Extrai o priceCode público (`pri*`) do pathname de uma URL.
313
+ *
314
+ * - Usa somente pathname (ignora query e hash)
315
+ * - Suporta barra final
316
+ * - Não faz fetch nem consulta catálogo
317
+ */
318
+ declare function extractPriceCodeFromUrl(url: string | URL): string | null;
319
+
320
+ export { BEMONY_AFID_MANAGED_PARAM, BEMONY_FORWARD_DENYLIST, BEMONY_SID_MANAGED_PARAM, BEMONY_UPSELL_BUY_LINK_SELECTOR, BEMONY_UPSELL_LINK_SELECTOR, type BemonyBrowserServerDedupePlaceholder, type BemonyLinkPolicy, type BemonyOneClickBackendResultPlaceholder, type BemonyOneClickIdempotencyKeyPlaceholder, BemonyPublicPageContext, type BemonyPublicRedirectParams, BemonyScenario, type BemonyServerPurchasePayloadPlaceholder, type ConfigureBemonyLinksOptions, DEFAULT_BEMONY_LINK_SELECTOR, type OfferPageCartMode, REQUIRED_PUBLIC_FIELDS, type ResolveBemonyPageContextSources, type ValidateBemonyPageContextOptions, applyCheckoutScenario, applyOfferPageScenario, applyOneClickCheckoutScenario, applyThankYouScenario, applyUpsellOfferScenario, assertSafePublicRedirectParams, buildPublicRedirectQuery, buildUpsellLinkSelector, configureBemonyLinks, createBemonyLinkPolicy, createBemonyOfferLinkSource, extractPriceCodeFromUrl, hrefMatchesNoThanksUrl, normalizeAllowedDomain, normalizeAllowedDomains, resolveBemonyPageContext, validateBemonyPageContext, validateBemonyServerPurchasePlaceholder };