@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.
- package/CHANGELOG.md +157 -0
- package/README.md +176 -0
- package/RELEASE_CANDIDATE.md +37 -0
- package/dist/browser/index.cjs.js +2598 -0
- package/dist/browser/index.cjs.js.map +1 -0
- package/dist/browser/index.d.mts +184 -0
- package/dist/browser/index.d.ts +184 -0
- package/dist/browser/index.esm.js +2557 -0
- package/dist/browser/index.esm.js.map +1 -0
- package/dist/browser/pixel-bemony.global.js +9848 -0
- package/dist/browser/pixel-bemony.global.js.map +1 -0
- package/dist/createBemonyPixel-BGRD66p-.d.mts +474 -0
- package/dist/createBemonyPixel-BGRD66p-.d.ts +474 -0
- package/dist/index.cjs.js +2154 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.mts +320 -0
- package/dist/index.d.ts +320 -0
- package/dist/index.esm.js +2081 -0
- package/dist/index.esm.js.map +1 -0
- package/docs/BACKEND_PURCHASE_AND_REDIRECTS.md +125 -0
- package/docs/BROWSER_EVENT_ENRICHMENT.md +116 -0
- package/docs/SCENARIOS.md +92 -0
- package/docs/SECURITY_LIMITATIONS.md +45 -0
- package/docs/TEST_MATRIX.md +39 -0
- package/docs/TROUBLESHOOTING.md +81 -0
- package/examples/README.md +73 -0
- package/examples/browser-bootstrap.html +47 -0
- package/examples/checkout-price-code.html +37 -0
- package/examples/funnel/donsell/downsell_1.html +130 -0
- package/examples/funnel/donsell/downsell_2.html +130 -0
- package/examples/funnel/donsell/downsell_3.html +130 -0
- package/examples/funnel/offer-page.html +105 -0
- package/examples/funnel/upsell/upsell_1.html +130 -0
- package/examples/funnel/upsell/upsell_2.html +130 -0
- package/examples/funnel/upsell/upsell_3.html +139 -0
- package/examples/offer-page-price-code.html +22 -0
- package/examples/one-click-price-code.html +38 -0
- package/examples/security/checkout-sim.css +408 -0
- package/examples/security/checkout-sim.js +414 -0
- package/examples/security/one-click/pri_downsell_1.html +85 -0
- package/examples/security/one-click/pri_downsell_1a.html +85 -0
- package/examples/security/one-click/pri_downsell_1b.html +78 -0
- package/examples/security/one-click/pri_downsell_2.html +78 -0
- package/examples/security/one-click/pri_downsell_2a.html +78 -0
- package/examples/security/one-click/pri_downsell_2b.html +78 -0
- package/examples/security/one-click/pri_downsell_3.html +78 -0
- package/examples/security/one-click/pri_downsell_3a.html +78 -0
- package/examples/security/one-click/pri_downsell_3b.html +78 -0
- package/examples/security/one-click/pri_upsell_1.html +78 -0
- package/examples/security/one-click/pri_upsell_1a.html +78 -0
- package/examples/security/one-click/pri_upsell_1b.html +78 -0
- package/examples/security/one-click/pri_upsell_2.html +78 -0
- package/examples/security/one-click/pri_upsell_2a.html +78 -0
- package/examples/security/one-click/pri_upsell_2b.html +78 -0
- package/examples/security/one-click/pri_upsell_3.html +78 -0
- package/examples/security/one-click/pri_upsell_3a.html +78 -0
- package/examples/security/one-click/pri_upsell_3b.html +78 -0
- package/examples/security/one-click/pri_upsell_3c.html +78 -0
- package/examples/security/pri1766322.html +333 -0
- package/examples/security/pri5529930.html +333 -0
- package/examples/security/pri6670988.html +334 -0
- package/examples/security/thank-you.html +65 -0
- package/examples/sim/funnel-flow.js +258 -0
- package/examples/sim/one-click-sim.js +167 -0
- package/examples/upsell-price-code.html +41 -0
- package/examples/url-context-navigation.html +96 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/createBemonyPixel.ts","../../src/BemonyPixel.ts","../../src/domain/BemonyLeadInput.ts","../../src/domain/BemonyPaymentMethodInput.ts","../../src/domain/resolvePriceCode.ts","../../src/createBemonyPixelConfig.ts","../../src/domain/BemonyPageContext.ts","../../src/domain/resolveBemonyPageContext.ts","../../src/domain/validateBemonyPageContext.ts","../../src/platform/defaults.ts","../../src/navigation/BemonyLinkPolicy.ts","../../src/navigation/configureBemonyLinks.ts","../../src/platform/environments.ts","../../src/scenarios/checkout.ts","../../src/scenarios/one-click-checkout.ts","../../src/navigation/createBemonyOfferLinkSource.ts","../../src/scenarios/offer-page.ts","../../src/scenarios/thank-you.ts","../../src/scenarios/upsell-offer.ts","../../src/browser/errors.ts","../../src/browser/events.ts","../../src/browser/bootstrap.ts","../../src/scenarios/types.ts","../../src/browser/resolveExecutingScript.ts","../../src/browser/resolveAutoInitConfig.ts","../../src/browser/autoInit.ts"],"sourcesContent":["import { prepareJourneyUrlContext, type PixelConfig } from '@beworke/pixel';\nimport {\n createStorageAdapter,\n StorageServiceImpl,\n} from '@beworke/pixel/services';\nimport {\n BemonyPixel,\n type BemonyCorePixel,\n type BemonyPixelConstructOptions,\n} from './BemonyPixel';\nimport {\n createBemonyPixelConfig,\n type CreateBemonyPixelConfigOptions,\n} from './createBemonyPixelConfig';\nimport {\n normalizeBemonyPageContextInput,\n type BemonyPublicPageContext,\n} from './domain/BemonyPageContext';\nimport { resolveBemonyPageContext } from './domain/resolveBemonyPageContext';\nimport { validateBemonyPageContext } from './domain/validateBemonyPageContext';\nimport { configureBemonyLinks } from './navigation/configureBemonyLinks';\n\n/**\n * Opções da factory de lifecycle.\n * Sem contextResolver / catálogo remoto.\n */\nexport type BemonyPixelOptions = CreateBemonyPixelConfigOptions & {\n createCorePixel?: (config: PixelConfig) => BemonyCorePixel;\n};\n\nexport type CreateBemonyPixelOptions = BemonyPixelOptions;\n\nfunction createJourneyStorage(): StorageServiceImpl {\n return new StorageServiceImpl(\n createStorageAdapter('localStorage'),\n 'bemony',\n 'urlctx'\n );\n}\n\nfunction seedJourneyManagedParams(\n journey: ReturnType<typeof prepareJourneyUrlContext>,\n publicContext: BemonyPublicPageContext\n): void {\n if (publicContext.funnelId) {\n journey.setManagedParam('fid', publicContext.funnelId);\n }\n if (publicContext.funnelStepId) {\n journey.setManagedParam('fsid', publicContext.funnelStepId);\n }\n if (publicContext.publicOrderId) {\n journey.setManagedParam('oid', publicContext.publicOrderId);\n }\n if (publicContext.affiliateId) {\n journey.setManagedParam('afid', publicContext.affiliateId);\n }\n}\n\n/**\n * Bootstrap local (sem consulta de catálogo):\n * 1. Normalizar cenário e contexto público\n * 2. Journey UrlContext + managed params\n * 3. PixelConfig\n * 4. Core init + detectores\n *\n * O browser captura priceCode observado; o backend enriquece o evento.\n */\nexport async function createBemonyPixel(\n options: CreateBemonyPixelOptions\n): Promise<BemonyPixel> {\n const pageInput = normalizeBemonyPageContextInput(options.page);\n const publicContext = validateBemonyPageContext({\n scenario: options.scenario,\n publicContext: resolveBemonyPageContext({\n input: pageInput.public,\n urlParams: options.urlParams,\n pageMetadata: options.pageMetadata,\n scenarioDefaults: options.scenarioDefaults,\n }),\n });\n\n const allowedDomains =\n options.overrides?.allowedDomains ?? options.platform.allowedDomains;\n const journeyUrlConfig = configureBemonyLinks({\n allowedDomains: allowedDomains ? [...allowedDomains] : [],\n });\n\n const journeyStorage = createJourneyStorage();\n const journey = prepareJourneyUrlContext(journeyUrlConfig, journeyStorage);\n seedJourneyManagedParams(journey, publicContext);\n\n const config = createBemonyPixelConfig({\n ...options,\n page: { public: publicContext },\n });\n\n const construct: BemonyPixelConstructOptions = {\n config,\n scenario: options.scenario,\n publicOrderId: publicContext.publicOrderId,\n publicContext,\n autoInitiateCheckout: options.autoInitiateCheckout,\n ...(options.noThanksUrl ? { noThanksUrl: options.noThanksUrl } : {}),\n ...(options.createCorePixel\n ? { createCorePixel: options.createCorePixel }\n : {}),\n };\n\n try {\n const instance = new BemonyPixel(construct);\n await instance.init();\n return instance;\n } finally {\n journey.destroy();\n }\n}\n","import {\n Pixel,\n type PixelConfig,\n type PixelDebugSnapshot,\n} from '@beworke/pixel';\nimport type {\n AddPaymentInfoData,\n AddToCartData,\n InitiateCheckoutData,\n LeadData,\n RemoveFromCartData,\n ViewContentData,\n} from '@beworke/pixel/events';\nimport type { BemonyCheckoutInput } from './domain/BemonyCheckoutInput';\nimport type { BemonyDeclineUpsellOptions } from './domain/BemonyDeclineUpsellOptions';\nimport type { BemonyOneClickConfirmationInput } from './domain/BemonyOneClickInput';\nimport { type BemonyOfferInput } from './domain/BemonyOfferInput';\nimport {\n isValidBemonyLead,\n leadFingerprint,\n sanitizeLeadFields,\n type BemonyLeadInput,\n} from './domain/BemonyLeadInput';\nimport {\n isValidBemonyPaymentMethod,\n type BemonyPaymentMethodInput,\n} from './domain/BemonyPaymentMethodInput';\nimport type { BemonyPublicPageContext } from './domain/BemonyPageContext';\nimport { resolvePriceCode } from './domain/resolvePriceCode';\nimport { extractPriceCodeFromUrl } from './navigation/extractPriceCodeFromUrl';\nimport type { BemonyScenario } from './scenarios/types';\n\nexport type BemonyPixelState =\n | 'created'\n | 'initializing'\n | 'ready'\n | 'destroying'\n | 'destroyed'\n | 'failed';\n\nconst SAFE_PUBLIC_ORDER_ID = /^[a-zA-Z0-9_.:-]+$/;\nconst MAX_PUBLIC_ORDER_ID_LENGTH = 128;\n\n/**\n * Superfície pública do Core usada pelo wrapper.\n * Não inclui métodos @internal nem purchase (fora do fluxo browser Bemony).\n */\nexport type BemonyCorePixel = {\n init(): Promise<void>;\n destroy(): Promise<void>;\n isInitialized(): boolean;\n getDebugSnapshot(): Readonly<PixelDebugSnapshot>;\n viewContent(data?: ViewContentData): void;\n addToCart(data?: AddToCartData): void;\n removeFromCart(data?: RemoveFromCartData): void;\n lead(data: LeadData): void;\n initiateCheckout(data?: InitiateCheckoutData): void;\n addPaymentInfo(data?: AddPaymentInfoData): void;\n setManagedUrlParam?(param: string, value: string): boolean;\n};\n\nexport type BemonyPixelConstructOptions = {\n config: PixelConfig;\n scenario: BemonyScenario;\n createCorePixel?: (config: PixelConfig) => BemonyCorePixel;\n /** Default true no cenário checkout / one-click. */\n autoInitiateCheckout?: boolean;\n publicOrderId?: string;\n publicContext?: BemonyPublicPageContext;\n /**\n * URL de “No Thanks” (`data-no-thanks` no script).\n * O link de recusa é o `<a href>` que coincide com esta URL.\n */\n noThanksUrl?: string;\n};\n\nexport type BemonyLifecycleErrorCode =\n | 'INIT_FAILED'\n | 'INVALID_STATE'\n | 'DESTROY_FAILED';\n\nexport class BemonyLifecycleError extends Error {\n readonly code: BemonyLifecycleErrorCode;\n readonly state: BemonyPixelState;\n readonly cause?: unknown;\n\n constructor(options: {\n code: BemonyLifecycleErrorCode;\n message: string;\n state: BemonyPixelState;\n cause?: unknown;\n }) {\n super(options.message);\n this.name = 'BemonyLifecycleError';\n this.code = options.code;\n this.state = options.state;\n if (options.cause !== undefined) {\n this.cause = options.cause;\n }\n }\n}\n\nfunction requirePriceCode(\n input: BemonyOfferInput,\n method: string,\n state: BemonyPixelState\n): string {\n const { priceCode, conflict } = resolvePriceCode(input);\n if (!priceCode) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires priceCode.`,\n state,\n });\n }\n if (conflict && typeof console !== 'undefined' && console.debug) {\n console.debug('[BemonyPixel] priceCode/priceId conflict; using priceCode', {\n code: 'BEMONY_PRICE_CODE_CONFLICT',\n method,\n });\n }\n return priceCode;\n}\n\nfunction toViewContentData(input: BemonyOfferInput): ViewContentData {\n const priceCode = resolvePriceCode(input).priceCode!;\n const contentType =\n input.productType === 'downsell'\n ? 'downsell'\n : input.productType === 'upsell'\n ? 'upsell'\n : 'offer';\n const observedValue = input.observedValue ?? input.price;\n const observedCurrency = input.observedCurrency ?? input.currency;\n\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n // O productId real será resolvido pelo backend de ingestão.\n return {\n contentId: priceCode,\n contentType,\n productId: priceCode,\n ...(observedValue !== undefined ? { value: observedValue } : {}),\n ...(observedCurrency !== undefined ? { currency: observedCurrency } : {}),\n };\n}\n\nfunction toAddToCartData(input: BemonyOfferInput): AddToCartData {\n const priceCode = resolvePriceCode(input).priceCode!;\n const observedValue = input.observedValue ?? input.price;\n const observedCurrency = input.observedCurrency ?? input.currency;\n\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n // O productId real será resolvido pelo backend de ingestão.\n return {\n productId: priceCode,\n quantity: input.quantity ?? 1,\n ...(observedValue !== undefined ? { price: observedValue } : {}),\n ...(observedCurrency !== undefined ? { currency: observedCurrency } : {}),\n };\n}\n\nfunction toLeadData(input: BemonyLeadInput): LeadData {\n const fields = sanitizeLeadFields(input.fields);\n return {\n ...(input.email !== undefined ? { email: input.email.trim() } : {}),\n ...(input.phone !== undefined ? { phone: input.phone.trim() } : {}),\n ...(input.name !== undefined ? { name: input.name.trim() } : {}),\n ...(fields !== undefined ? { fields } : {}),\n };\n}\n\n/**\n * Identidade comercial do CTA de aceite: pathname do href (`/pri*`).\n * Útil para hosts que resolvem o CTA manualmente; o cenário upsell usa LinkAuto.\n */\nexport function resolvePriceCodeFromAcceptElement(el: Element): string | null {\n if (el instanceof HTMLAnchorElement && el.href) {\n const fromHref = extractPriceCodeFromUrl(el.href);\n if (fromHref) {\n return fromHref;\n }\n }\n const href = el.getAttribute('href');\n if (!href) {\n return null;\n }\n try {\n const base =\n typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/';\n return extractPriceCodeFromUrl(new URL(href, base));\n } catch {\n return null;\n }\n}\n\n/**\n * Wrapper de lifecycle e domínio Bemony sobre `Pixel`.\n *\n * Sem consulta de catálogo. Sem auto VIEW_CONTENT.\n * Identidade comercial no browser: priceCode observado.\n */\nexport class BemonyPixel {\n private state: BemonyPixelState = 'created';\n private readonly scenario: BemonyScenario;\n private readonly config: PixelConfig;\n private readonly core: BemonyCorePixel;\n private initPromise: Promise<void> | null = null;\n private destroyPromise: Promise<void> | null = null;\n private readonly wrapperListeners = new Set<() => void>();\n private readonly autoInitiateCheckoutEnabled: boolean;\n private publicOrderId: string | undefined;\n private readonly publicContext: BemonyPublicPageContext;\n private readonly noThanksUrl: string | undefined;\n private checkoutStarted = false;\n private lastLeadFingerprint: string | null = null;\n private readonly selectedBumpIds = new Set<string>();\n\n constructor(options: BemonyPixelConstructOptions) {\n this.config = options.config;\n this.scenario = options.scenario;\n this.publicOrderId = options.publicOrderId?.trim() || undefined;\n this.publicContext = options.publicContext\n ? { ...options.publicContext }\n : {};\n this.autoInitiateCheckoutEnabled = options.autoInitiateCheckout !== false;\n this.noThanksUrl = options.noThanksUrl?.trim() || undefined;\n\n const createCore =\n options.createCorePixel ??\n ((config: PixelConfig) => new Pixel(config) as BemonyCorePixel);\n this.core = createCore(options.config);\n }\n\n getScenario(): BemonyScenario {\n return this.scenario;\n }\n\n getConfig(): Readonly<PixelConfig> {\n return this.config;\n }\n\n getState(): BemonyPixelState {\n return this.state;\n }\n\n isInitialized(): boolean {\n return this.state === 'ready' && this.core.isInitialized();\n }\n\n getDebugSnapshot(): Readonly<PixelDebugSnapshot> {\n return this.core.getDebugSnapshot();\n }\n\n /**\n * `publicOrderId` do domínio do app (não mapeado para identity do Core).\n * Fallback opcional: param `oid` da URL atual.\n */\n getPublicOrderId(): string | null {\n if (this.publicOrderId) {\n return this.publicOrderId;\n }\n if (\n typeof window === 'undefined' ||\n typeof window.location === 'undefined'\n ) {\n return null;\n }\n try {\n return new URL(window.location.href).searchParams.get('oid');\n } catch {\n return null;\n }\n }\n\n /**\n * Define `publicOrderId` e propaga para managed param `oid` quando suportado.\n */\n setPublicOrderId(orderId: string): void {\n const trimmed = orderId.trim();\n if (!trimmed || trimmed.length > MAX_PUBLIC_ORDER_ID_LENGTH) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message:\n 'setPublicOrderId requires a non-empty orderId within max length.',\n state: this.state,\n });\n }\n if (!SAFE_PUBLIC_ORDER_ID.test(trimmed)) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: 'setPublicOrderId orderId contains invalid characters.',\n state: this.state,\n });\n }\n if (this.publicOrderId === trimmed) {\n return;\n }\n this.publicOrderId = trimmed;\n this.applyPublicOrderIdToManagedParam();\n }\n\n getPublicSessionId(): string | null {\n if (\n typeof window === 'undefined' ||\n typeof window.location === 'undefined'\n ) {\n return null;\n }\n try {\n return new URL(window.location.href).searchParams.get('sid');\n } catch {\n return null;\n }\n }\n\n selectOffer(input: BemonyOfferInput): void {\n this.assertReady('selectOffer');\n requirePriceCode(input, 'selectOffer', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n /**\n * Inicia checkout → `Pixel.initiateCheckout()`.\n * Idempotente: no máximo uma vez por lifecycle da instância.\n */\n startCheckout(input?: BemonyCheckoutInput): void {\n this.assertReady('startCheckout');\n if (this.checkoutStarted) {\n return;\n }\n const data: InitiateCheckoutData | undefined = input\n ? {\n ...(input.value !== undefined ? { value: input.value } : {}),\n ...(input.currency !== undefined ? { currency: input.currency } : {}),\n }\n : undefined;\n this.core.initiateCheckout(data);\n this.checkoutStarted = true;\n }\n\n /**\n * Captura lead → `Pixel.lead()`.\n * Campos incompletos não disparam. Mesmo fingerprint não reenvia (debounce).\n */\n captureLead(input: BemonyLeadInput): boolean {\n this.assertReady('captureLead');\n if (!isValidBemonyLead(input)) {\n return false;\n }\n const fingerprint = leadFingerprint(input);\n if (this.lastLeadFingerprint === fingerprint) {\n return false;\n }\n this.core.lead(toLeadData(input));\n this.lastLeadFingerprint = fingerprint;\n return true;\n }\n\n selectOrderBump(input: BemonyOfferInput): void {\n this.assertReady('selectOrderBump');\n const priceCode = requirePriceCode(input, 'selectOrderBump', this.state);\n this.core.addToCart(toAddToCartData(input));\n this.selectedBumpIds.add(priceCode);\n }\n\n removeOrderBump(input: BemonyOfferInput): void {\n this.assertReady('removeOrderBump');\n const priceCode = requirePriceCode(input, 'removeOrderBump', this.state);\n if (!this.selectedBumpIds.has(priceCode)) {\n return;\n }\n this.core.removeFromCart({\n // No adaptador Bemony, o campo genérico productId transporta o priceCode.\n productId: priceCode,\n ...(input.quantity !== undefined ? { quantity: input.quantity } : {}),\n });\n this.selectedBumpIds.delete(priceCode);\n }\n\n trackPaymentMethod(input: BemonyPaymentMethodInput): void {\n this.assertReady('trackPaymentMethod');\n if (!isValidBemonyPaymentMethod(input)) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: 'trackPaymentMethod requires a valid paymentMethod enum.',\n state: this.state,\n });\n }\n this.core.addPaymentInfo({ paymentMethod: input.paymentMethod });\n }\n\n viewUpsell(input: BemonyOfferInput): void {\n this.assertReady('viewUpsell');\n requirePriceCode(input, 'viewUpsell', this.state);\n this.core.viewContent(toViewContentData(input));\n }\n\n acceptUpsell(input: BemonyOfferInput): void {\n this.assertReady('acceptUpsell');\n requirePriceCode(input, 'acceptUpsell', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n /**\n * Recusa de upsell/downsell — callback/navegação apenas.\n * Destino: `navigateTo` explícito, senão `noThanksUrl` (data-no-thanks).\n */\n declineUpsell(options?: BemonyDeclineUpsellOptions): void {\n this.assertReady('declineUpsell');\n try {\n options?.onDecline?.();\n } finally {\n const explicitTarget =\n options?.navigateTo?.trim() || this.noThanksUrl || undefined;\n const target = explicitTarget\n ? this.decorateNavigateUrl(explicitTarget)\n : undefined;\n if (\n target &&\n typeof window !== 'undefined' &&\n typeof window.location?.assign === 'function'\n ) {\n window.location.assign(target);\n }\n }\n }\n\n /**\n * Intenção de confirmação one-click → `Pixel.addToCart()`.\n * Não processa pagamento e **não** emite PURCHASE.\n */\n trackOneClickConfirmation(input: BemonyOneClickConfirmationInput): void {\n this.assertReady('trackOneClickConfirmation');\n this.assertOneClickReady('trackOneClickConfirmation');\n requirePriceCode(input, 'trackOneClickConfirmation', this.state);\n this.core.addToCart(toAddToCartData(input));\n }\n\n init(): Promise<void> {\n if (this.state === 'ready') {\n return Promise.resolve();\n }\n\n if (this.state === 'initializing' && this.initPromise) {\n return this.initPromise;\n }\n\n if (this.state === 'destroying' && this.destroyPromise) {\n this.initPromise = this.destroyPromise\n .catch(() => undefined)\n .then(() => this.startInit());\n return this.initPromise;\n }\n\n this.initPromise = this.startInit();\n return this.initPromise;\n }\n\n destroy(): Promise<void> {\n if (this.state === 'destroyed') {\n return Promise.resolve();\n }\n\n if (this.state === 'destroying' && this.destroyPromise) {\n return this.destroyPromise;\n }\n\n if (this.state === 'initializing' && this.initPromise) {\n this.destroyPromise = this.initPromise\n .catch(() => undefined)\n .then(() => this.startDestroy());\n return this.destroyPromise;\n }\n\n this.destroyPromise = this.startDestroy();\n return this.destroyPromise;\n }\n\n addWrapperListener(cleanup: () => void): () => void {\n this.wrapperListeners.add(cleanup);\n return () => {\n this.wrapperListeners.delete(cleanup);\n };\n }\n\n private assertReady(method: string): void {\n if (this.state !== 'ready') {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires state \"ready\" (current: \"${this.state}\").`,\n state: this.state,\n });\n }\n }\n\n private assertOneClickReady(method: string): void {\n if (!this.getPublicOrderId()) {\n throw new BemonyLifecycleError({\n code: 'INVALID_STATE',\n message: `BemonyPixel.${method} requires publicOrderId.`,\n state: this.state,\n });\n }\n }\n\n private applyPublicOrderIdToManagedParam(): void {\n if (!this.publicOrderId || !this.core.setManagedUrlParam) {\n return;\n }\n this.core.setManagedUrlParam('oid', this.publicOrderId);\n }\n\n private decorateNavigateUrl(rawUrl: string): string {\n try {\n const base =\n typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/';\n const url = new URL(rawUrl, base);\n const sid = this.getPublicSessionId();\n const oid = this.getPublicOrderId();\n const fid = this.publicContext.funnelId;\n const fsid = this.publicContext.funnelStepId;\n const afid = this.publicContext.affiliateId;\n if (sid && !url.searchParams.has('sid')) {\n url.searchParams.set('sid', sid);\n }\n if (oid && !url.searchParams.has('oid')) {\n url.searchParams.set('oid', oid);\n }\n if (fid && !url.searchParams.has('fid')) {\n url.searchParams.set('fid', fid);\n }\n if (fsid && !url.searchParams.has('fsid')) {\n url.searchParams.set('fsid', fsid);\n }\n if (afid && !url.searchParams.has('afid')) {\n url.searchParams.set('afid', afid);\n }\n return url.toString();\n } catch {\n return rawUrl;\n }\n }\n\n private maybeAutoInitiateCheckout(): void {\n if (\n this.scenario !== 'checkout' &&\n this.scenario !== 'one-click-checkout'\n ) {\n return;\n }\n if (!this.autoInitiateCheckoutEnabled || this.checkoutStarted) {\n return;\n }\n this.core.initiateCheckout();\n this.checkoutStarted = true;\n }\n\n private resetDomainState(): void {\n this.checkoutStarted = false;\n this.lastLeadFingerprint = null;\n this.selectedBumpIds.clear();\n this.publicOrderId = undefined;\n }\n\n private startInit(): Promise<void> {\n this.state = 'initializing';\n\n return this.core\n .init()\n .then(() => {\n if (this.publicOrderId) {\n this.applyPublicOrderIdToManagedParam();\n }\n })\n .then(() => {\n this.state = 'ready';\n this.maybeAutoInitiateCheckout();\n })\n .catch((error: unknown) => {\n this.state = 'failed';\n return this.safeCoreDestroy().then(() => {\n throw new BemonyLifecycleError({\n code: 'INIT_FAILED',\n message: 'BemonyPixel init failed.',\n state: this.state,\n cause: error,\n });\n });\n })\n .finally(() => {\n this.initPromise = null;\n });\n }\n\n private startDestroy(): Promise<void> {\n this.state = 'destroying';\n\n return this.safeCoreDestroy()\n .then(() => {\n this.clearWrapperListeners();\n this.resetDomainState();\n this.state = 'destroyed';\n })\n .catch((error: unknown) => {\n this.clearWrapperListeners();\n this.resetDomainState();\n this.state = 'destroyed';\n throw new BemonyLifecycleError({\n code: 'DESTROY_FAILED',\n message: 'BemonyPixel destroy failed.',\n state: this.state,\n cause: error,\n });\n })\n .finally(() => {\n this.destroyPromise = null;\n });\n }\n\n private async safeCoreDestroy(): Promise<void> {\n await this.core.destroy();\n }\n\n private clearWrapperListeners(): void {\n for (const cleanup of this.wrapperListeners) {\n try {\n cleanup();\n } catch {\n // cleanup isolado\n }\n }\n this.wrapperListeners.clear();\n }\n}\n","/**\n * Input de lead para `captureLead` → `Pixel.lead()`.\n * Não dispara ADD_TO_CART.\n */\nexport interface BemonyLeadInput {\n email?: string;\n phone?: string;\n name?: string;\n fields?: Record<string, unknown>;\n}\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst BLOCKED_FIELD_KEY =\n /^(card|cvv|cvc|pan|number|expiry|expiration|password|token|cvv2)/i;\n\n/**\n * Validação mínima: email válido e/ou telefone com ao menos 8 dígitos.\n */\nexport function isValidBemonyLead(input: BemonyLeadInput): boolean {\n const email = input.email?.trim();\n const phone = input.phone?.trim();\n const emailOk = Boolean(email && EMAIL_PATTERN.test(email));\n const phoneDigits = phone ? phone.replace(/\\D/g, '') : '';\n const phoneOk = phoneDigits.length >= 8;\n return emailOk || phoneOk;\n}\n\nexport function leadFingerprint(input: BemonyLeadInput): string {\n const email = input.email?.trim().toLowerCase() ?? '';\n const phone = input.phone?.replace(/\\D/g, '') ?? '';\n const name = input.name?.trim().toLowerCase() ?? '';\n return `${email}|${phone}|${name}`;\n}\n\n/**\n * Remove campos sensíveis (cartão etc.) de `fields` antes de enviar ao Core.\n */\nexport function sanitizeLeadFields(\n fields: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!fields) {\n return undefined;\n }\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n if (BLOCKED_FIELD_KEY.test(key)) {\n continue;\n }\n result[key] = value;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Métodos de pagamento alinhados ao Core (`AddPaymentInfoData.paymentMethod`).\n * `PaymentMethod` não é reexportado por `@beworke/pixel/events` — espelhamos o union.\n */\nexport type BemonyPaymentMethod =\n | 'CREDIT_CARD'\n | 'PIX'\n | 'BOLETO'\n | 'PAYPAL'\n // TODO : Add Google Pay and Apple Pay in pixel core\n // | 'GOOGLE_PAY'\n // | 'APPLE_PAY'\n | 'OTHER';\n\n/**\n * Input de método de pagamento — somente enum, sem dados de cartão.\n */\nexport interface BemonyPaymentMethodInput {\n paymentMethod: BemonyPaymentMethod;\n}\n\nexport const BEMONY_PAYMENT_METHODS: readonly BemonyPaymentMethod[] = [\n 'CREDIT_CARD',\n 'PIX',\n 'BOLETO',\n 'PAYPAL',\n // 'GOOGLE_PAY',\n // 'APPLE_PAY',\n 'OTHER',\n] as const;\n\nexport function isValidBemonyPaymentMethod(\n input: BemonyPaymentMethodInput | null | undefined\n): input is BemonyPaymentMethodInput {\n if (!input) {\n return false;\n }\n return (BEMONY_PAYMENT_METHODS as readonly string[]).includes(\n input.paymentMethod\n );\n}\n","/**\n * Normaliza a identidade comercial pública Bemony (`priceCode`).\n *\n * `priceId` permanece como alias deprecated de compatibilidade.\n * Não inventa valor a partir de offerId/productId.\n */\nexport type BemonyCommerceIdentityInput = {\n priceCode?: string;\n /** @deprecated Use priceCode. */\n priceId?: string;\n};\n\nexport type ResolvePriceCodeResult = {\n priceCode: string | null;\n /** True quando priceCode e priceId divergem (usa priceCode). */\n conflict: boolean;\n};\n\n/**\n * Resolve o priceCode canônico.\n *\n * 1. `priceCode` tem prioridade\n * 2. `priceId` é fallback de compatibilidade\n * 3. trim; vazio → null\n * 4. conflito → preferir priceCode e sinalizar `conflict`\n */\nexport function resolvePriceCode(\n input: BemonyCommerceIdentityInput | null | undefined\n): ResolvePriceCodeResult {\n if (!input) {\n return { priceCode: null, conflict: false };\n }\n\n const fromCode = input.priceCode?.trim() || null;\n const fromLegacy = input.priceId?.trim() || null;\n\n if (fromCode && fromLegacy && fromCode !== fromLegacy) {\n return { priceCode: fromCode, conflict: true };\n }\n\n return {\n priceCode: fromCode ?? fromLegacy,\n conflict: false,\n };\n}\n","import { DEFAULT_PIXEL_CONFIG, type PixelConfig } from '@beworke/pixel';\nimport type {\n CommerceCartMode,\n CommerceProduct,\n PixelTarget,\n ProductType,\n} from '@beworke/pixel/config';\nimport {\n normalizeBemonyPageContextInput,\n type BemonyCommerceInput,\n type BemonyPageContextInput,\n type BemonyPublicPageContext,\n} from './domain/BemonyPageContext';\nimport { resolveBemonyPageContext } from './domain/resolveBemonyPageContext';\nimport { validateBemonyPageContext } from './domain/validateBemonyPageContext';\nimport { configureBemonyLinks } from './navigation/configureBemonyLinks';\nimport {\n applyBemonyPlatformDefaults,\n type BemonyPlatformOptions,\n} from './platform/defaults';\nimport {\n applyBemonyEnvironment,\n resolveBemonyEnvironment,\n type BemonyEnvironment,\n} from './platform/environments';\nimport { applyCheckoutScenario } from './scenarios/checkout';\nimport { applyOneClickCheckoutScenario } from './scenarios/one-click-checkout';\nimport {\n applyOfferPageScenario,\n type OfferPageCartMode,\n} from './scenarios/offer-page';\nimport { applyThankYouScenario } from './scenarios/thank-you';\nimport { applyUpsellOfferScenario } from './scenarios/upsell-offer';\nimport type { BemonyScenario } from './scenarios/types';\n\n/**\n * Overrides restritos e tipados (não expor Partial<PixelConfig>).\n */\nexport type BemonyConfigOverrides = {\n debug?: boolean;\n apiEndpoint?: string;\n allowedDomains?: readonly string[];\n};\n\nexport type CreateBemonyPixelConfigOptions = {\n environment: BemonyEnvironment;\n scenario: BemonyScenario;\n platform: BemonyPlatformOptions;\n page?: BemonyPageContextInput | BemonyPublicPageContext;\n commerce?: BemonyCommerceInput;\n /** Params públicos já filtrados da URL (sem token). */\n urlParams?: Readonly<Record<string, string>>;\n pageMetadata?: BemonyPublicPageContext;\n scenarioDefaults?: BemonyPublicPageContext;\n overrides?: BemonyConfigOverrides;\n /**\n * Quando false, desativa auto `startCheckout` no init (checkout).\n * Default: true no cenário checkout.\n */\n autoInitiateCheckout?: boolean;\n /**\n * URL de “No Thanks” para upsell/downsell (`data-no-thanks` no script).\n */\n noThanksUrl?: string;\n};\n\nconst SCENARIO_TARGET: Record<BemonyScenario, PixelTarget> = {\n 'offer-page': 'landing',\n checkout: 'checkout',\n 'upsell-offer': 'custom',\n 'one-click-checkout': 'checkout',\n 'thank-you': 'custom',\n};\n\nconst SCENARIO_CART_MODE: Record<BemonyScenario, CommerceCartMode> = {\n 'offer-page': 'landing_page',\n checkout: 'checkout',\n 'upsell-offer': 'upsell',\n 'one-click-checkout': 'checkout',\n 'thank-you': 'custom',\n};\n\nconst PRODUCT_TYPES: ReadonlySet<string> = new Set([\n 'main',\n 'order_bump',\n 'upsell',\n 'downsell',\n 'cross_sell',\n 'addon',\n 'subscription',\n 'custom',\n 'other',\n]);\n\nfunction cloneProducts(\n products: BemonyCommerceInput['products']\n): CommerceProduct[] {\n if (!products) {\n return [];\n }\n return products.map(product => {\n const type =\n product.type && PRODUCT_TYPES.has(product.type)\n ? (product.type as ProductType)\n : undefined;\n return {\n id: product.id,\n ...(product.name !== undefined ? { name: product.name } : {}),\n ...(type !== undefined ? { type } : {}),\n ...(product.price !== undefined ? { price: product.price } : {}),\n ...(product.currency !== undefined ? { currency: product.currency } : {}),\n ...(product.quantity !== undefined ? { quantity: product.quantity } : {}),\n };\n });\n}\n\nfunction resolveOfferPageCartMode(\n commerce: BemonyCommerceInput | undefined\n): OfferPageCartMode {\n if (commerce?.cartMode === 'single_product') {\n return 'single_product';\n }\n return 'landing_page';\n}\n\nfunction mapPublicContextToIdentity(\n base: PixelConfig['identity'],\n publicContext: BemonyPublicPageContext\n): PixelConfig['identity'] {\n return {\n ...base,\n ...(publicContext.pageId !== undefined\n ? { pageId: publicContext.pageId }\n : {}),\n ...(publicContext.funnelId !== undefined\n ? { funnelId: publicContext.funnelId }\n : {}),\n ...(publicContext.funnelStepId !== undefined\n ? { funnelStepId: publicContext.funnelStepId }\n : {}),\n ...(publicContext.offerId !== undefined\n ? { offerId: publicContext.offerId }\n : {}),\n ...(publicContext.affiliateId !== undefined\n ? { affiliateId: publicContext.affiliateId }\n : {}),\n ...(publicContext.checkoutId !== undefined\n ? { checkoutId: publicContext.checkoutId }\n : {}),\n };\n}\n\n/**\n * Preset mínimo para cenários ainda sem implementação dedicada (B4+).\n */\nfunction applyMinimalScenarioPreset(\n base: PixelConfig,\n scenario: BemonyScenario,\n commerce: BemonyCommerceInput | undefined,\n allowedDomains: readonly string[] | undefined\n): PixelConfig {\n const products = cloneProducts(commerce?.products);\n const currency = commerce?.currency ?? base.commerce.currency ?? 'BRL';\n const urlContext = configureBemonyLinks({\n allowedDomains: allowedDomains ? [...allowedDomains] : [],\n });\n\n return {\n ...base,\n app: {\n ...base.app,\n target: SCENARIO_TARGET[scenario],\n debug: true,\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: {\n products,\n },\n cart: {\n ...base.commerce.cart,\n mode: SCENARIO_CART_MODE[scenario],\n initialItems: base.commerce.cart?.initialItems\n ? base.commerce.cart.initialItems.map(item => ({ ...item }))\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: false,\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n\nfunction applyScenarioPreset(\n base: PixelConfig,\n scenario: BemonyScenario,\n commerce: BemonyCommerceInput | undefined,\n allowedDomains: readonly string[] | undefined,\n autoInitiateCheckout?: boolean,\n noThanksUrl?: string\n): PixelConfig {\n if (scenario === 'offer-page') {\n return applyOfferPageScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n cartMode: resolveOfferPageCartMode(commerce),\n products: cloneProducts(commerce?.products),\n });\n }\n\n if (scenario === 'checkout') {\n return applyCheckoutScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n autoInitiateCheckout,\n });\n }\n\n if (scenario === 'upsell-offer') {\n return applyUpsellOfferScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n ...(noThanksUrl ? { noThanksUrl } : {}),\n });\n }\n\n if (scenario === 'one-click-checkout') {\n return applyOneClickCheckoutScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n products: cloneProducts(commerce?.products),\n });\n }\n\n if (scenario === 'thank-you') {\n return applyThankYouScenario(base, {\n allowedDomains,\n currency: commerce?.currency,\n });\n }\n\n return applyMinimalScenarioPreset(base, scenario, commerce, allowedDomains);\n}\n\n/**\n * Compõe um PixelConfig válido para Bemony.\n *\n * Ordem: DEFAULT_PIXEL_CONFIG → platform → environment → scenario → page → overrides.\n * Nunca inclui token efêmero. Não muta o input. Clona arrays.\n */\nexport function createBemonyPixelConfig(\n options: CreateBemonyPixelConfigOptions\n): PixelConfig {\n const pageInput = normalizeBemonyPageContextInput(options.page);\n const resolvedPublic = resolveBemonyPageContext({\n input: pageInput.public,\n urlParams: options.urlParams,\n pageMetadata: options.pageMetadata,\n scenarioDefaults: options.scenarioDefaults,\n });\n\n const validatedPublic = validateBemonyPageContext({\n scenario: options.scenario,\n publicContext: resolvedPublic,\n });\n\n const apiEndpoint =\n options.overrides?.apiEndpoint ?? options.platform.apiEndpoint;\n const debugOverride = options.overrides?.debug ?? options.platform.debug;\n const allowedDomains =\n options.overrides?.allowedDomains ?? options.platform.allowedDomains;\n\n const envResolution = resolveBemonyEnvironment({\n environment: options.environment,\n apiEndpoint,\n debugOverride,\n });\n\n let config: PixelConfig = {\n ...DEFAULT_PIXEL_CONFIG,\n app: { ...DEFAULT_PIXEL_CONFIG.app },\n identity: { ...DEFAULT_PIXEL_CONFIG.identity },\n transport: { ...DEFAULT_PIXEL_CONFIG.transport },\n storage: {\n ...DEFAULT_PIXEL_CONFIG.storage,\n queue: DEFAULT_PIXEL_CONFIG.storage.queue\n ? { ...DEFAULT_PIXEL_CONFIG.storage.queue }\n : undefined,\n keys: DEFAULT_PIXEL_CONFIG.storage.keys\n ? { ...DEFAULT_PIXEL_CONFIG.storage.keys }\n : undefined,\n persistence: DEFAULT_PIXEL_CONFIG.storage.persistence\n ? { ...DEFAULT_PIXEL_CONFIG.storage.persistence }\n : undefined,\n },\n attribution: {\n ...DEFAULT_PIXEL_CONFIG.attribution,\n customClickIdParams: DEFAULT_PIXEL_CONFIG.attribution.customClickIdParams\n ? [...DEFAULT_PIXEL_CONFIG.attribution.customClickIdParams]\n : [],\n },\n commerce: {\n ...DEFAULT_PIXEL_CONFIG.commerce,\n catalog: {\n products: DEFAULT_PIXEL_CONFIG.commerce.catalog?.products\n ? DEFAULT_PIXEL_CONFIG.commerce.catalog.products.map(p => ({\n ...p,\n }))\n : [],\n },\n cart: {\n ...DEFAULT_PIXEL_CONFIG.commerce.cart,\n initialItems: DEFAULT_PIXEL_CONFIG.commerce.cart?.initialItems\n ? DEFAULT_PIXEL_CONFIG.commerce.cart.initialItems.map(i => ({\n ...i,\n }))\n : [],\n },\n mappings: {\n attributes: {\n ...(DEFAULT_PIXEL_CONFIG.commerce.mappings?.attributes ?? {}),\n },\n fields: { ...(DEFAULT_PIXEL_CONFIG.commerce.mappings?.fields ?? {}) },\n },\n enrichment: { ...(DEFAULT_PIXEL_CONFIG.commerce.enrichment ?? {}) },\n },\n modules: {\n core: { ...DEFAULT_PIXEL_CONFIG.modules.core },\n behavior: { ...DEFAULT_PIXEL_CONFIG.modules.behavior },\n conversion: { ...DEFAULT_PIXEL_CONFIG.modules.conversion },\n transport: {\n ...DEFAULT_PIXEL_CONFIG.modules.transport,\n sender: { ...DEFAULT_PIXEL_CONFIG.modules.transport.sender },\n mockSender: { ...DEFAULT_PIXEL_CONFIG.modules.transport.mockSender },\n },\n integrations: { ...DEFAULT_PIXEL_CONFIG.modules.integrations },\n privacy: { ...DEFAULT_PIXEL_CONFIG.modules.privacy },\n },\n };\n\n config = applyBemonyPlatformDefaults(config, options.platform);\n config = applyBemonyEnvironment(config, envResolution);\n config = applyScenarioPreset(\n config,\n options.scenario,\n options.commerce,\n allowedDomains,\n options.autoInitiateCheckout,\n options.noThanksUrl\n );\n\n config = {\n ...config,\n identity: mapPublicContextToIdentity(config.identity, validatedPublic),\n };\n\n return config;\n}\n","/**\n * Contexto público da página — pode ir para identity/navigation.\n * Nunca inclui segredos (token one-click, cartão, etc.).\n */\nexport interface BemonyPublicPageContext {\n pageId?: string;\n funnelId?: string;\n funnelStepId?: string;\n offerId?: string;\n productId?: string;\n /** Código público do price (`pri*`). Identidade comercial canônica. */\n priceCode?: string;\n /**\n * @deprecated Use priceCode.\n */\n priceId?: string;\n checkoutId?: string;\n affiliateId?: string;\n /** Correlação app/backend; sem campo dedicado no Core identity. */\n publicOrderId?: string;\n}\n\n/**\n * Input completo de contexto público da página.\n */\nexport interface BemonyPageContextInput {\n public: BemonyPublicPageContext;\n}\n\n/**\n * Commerce mínimo para a factory de config (sem checkout completo).\n * Opcional — Bemony não exige catálogo para emitir eventos com priceCode.\n */\nexport interface BemonyCommerceInput {\n currency?: string;\n cartMode?:\n | 'landing_page'\n | 'single_product'\n | 'checkout'\n | 'upsell'\n | 'custom';\n products?: ReadonlyArray<{\n id: string;\n name?: string;\n type?: string;\n price?: number;\n currency?: string;\n quantity?: number;\n }>;\n}\n\nexport type BemonyValidationErrorCode =\n | 'MISSING_REQUIRED_FIELD'\n | 'MISSING_ENDPOINT'\n | 'INVALID_FIELD'\n | 'INVALID_ENVIRONMENT';\n\nexport type BemonyValidationErrorOptions = {\n code: BemonyValidationErrorCode;\n message: string;\n field?: string;\n scenario?: string;\n};\n\n/**\n * Erro tipado de validação. Mensagens nunca devem incluir valores sensíveis.\n */\nexport class BemonyValidationError extends Error {\n readonly code: BemonyValidationErrorCode;\n readonly field?: string;\n readonly scenario?: string;\n\n constructor(options: BemonyValidationErrorOptions) {\n super(options.message);\n this.name = 'BemonyValidationError';\n this.code = options.code;\n this.field = options.field;\n this.scenario = options.scenario;\n }\n}\n\nexport function isBemonyPageContextInput(\n value: unknown\n): value is BemonyPageContextInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'public' in value &&\n typeof (value as BemonyPageContextInput).public === 'object' &&\n (value as BemonyPageContextInput).public !== null\n );\n}\n\n/**\n * Normaliza aliases: `priceId` legado → `priceCode` canônico.\n */\nfunction normalizePublicPriceFields(\n publicContext: BemonyPublicPageContext\n): BemonyPublicPageContext {\n const priceCode = publicContext.priceCode?.trim() || undefined;\n const priceId = publicContext.priceId?.trim() || undefined;\n const { priceId: _legacy, ...rest } = publicContext;\n if (priceCode) {\n return { ...rest, priceCode };\n }\n if (priceId) {\n return { ...rest, priceCode: priceId };\n }\n return { ...rest };\n}\n\nexport function normalizeBemonyPageContextInput(\n page?: BemonyPageContextInput | BemonyPublicPageContext\n): BemonyPageContextInput {\n if (!page) {\n return { public: {} };\n }\n if (isBemonyPageContextInput(page)) {\n return {\n public: normalizePublicPriceFields({ ...page.public }),\n };\n }\n return {\n public: normalizePublicPriceFields({ ...page }),\n };\n}\n","import type { BemonyPublicPageContext } from './BemonyPageContext';\n\n/**\n * Mapeamento de query params públicos permitidos → campos do contexto.\n * Token one-click e demais segredos não entram neste mapa.\n */\nconst PUBLIC_URL_PARAM_TO_FIELD: Record<string, keyof BemonyPublicPageContext> =\n {\n page_id: 'pageId',\n funnel_id: 'funnelId',\n funnel_step_id: 'funnelStepId',\n offer_id: 'offerId',\n product_id: 'productId',\n price_code: 'priceCode',\n price_id: 'priceCode',\n checkout_id: 'checkoutId',\n afid: 'affiliateId',\n fid: 'funnelId',\n fsid: 'funnelStepId',\n oid: 'publicOrderId',\n };\n\nexport type ResolveBemonyPageContextSources = {\n /** Precedência 1 — input explícito do app. */\n input?: BemonyPublicPageContext;\n /** Precedência 2 — params públicos já filtrados da URL. */\n urlParams?: Readonly<Record<string, string>>;\n /** Precedência 3 — metadata declarativa da página. */\n pageMetadata?: BemonyPublicPageContext;\n /** Precedência 4 — defaults do cenário. */\n scenarioDefaults?: BemonyPublicPageContext;\n};\n\nfunction pickDefined(\n source: BemonyPublicPageContext | undefined\n): BemonyPublicPageContext {\n if (!source) {\n return {};\n }\n const result: BemonyPublicPageContext = {};\n for (const key of Object.keys(source) as (keyof BemonyPublicPageContext)[]) {\n const value = source[key];\n if (value !== undefined && value !== '') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction publicContextFromUrlParams(\n urlParams: Readonly<Record<string, string>> | undefined\n): BemonyPublicPageContext {\n if (!urlParams) {\n return {};\n }\n const result: BemonyPublicPageContext = {};\n for (const [rawKey, rawValue] of Object.entries(urlParams)) {\n const field = PUBLIC_URL_PARAM_TO_FIELD[rawKey];\n if (!field) {\n continue;\n }\n if (rawValue === undefined || rawValue === '') {\n continue;\n }\n result[field] = rawValue;\n }\n return result;\n}\n\n/**\n * Resolve contexto público com precedência:\n * input explícito → URL permitida → metadata da página → default do cenário.\n *\n * Não gerencia sid, attribution, storage nem token efêmero.\n */\nexport function resolveBemonyPageContext(\n sources: ResolveBemonyPageContextSources = {}\n): BemonyPublicPageContext {\n const fromScenario = pickDefined(sources.scenarioDefaults);\n const fromMetadata = pickDefined(sources.pageMetadata);\n const fromUrl = publicContextFromUrlParams(sources.urlParams);\n const fromInput = pickDefined(sources.input);\n\n return {\n ...fromScenario,\n ...fromMetadata,\n ...fromUrl,\n ...fromInput,\n };\n}\n","import type { BemonyScenario } from '../scenarios/types';\nimport {\n BemonyValidationError,\n type BemonyPublicPageContext,\n} from './BemonyPageContext';\n\nconst MAX_ID_LENGTH = 128;\nconst SAFE_ID_PATTERN = /^[a-zA-Z0-9_.:-]+$/;\n\n/** Campos públicos obrigatórios por cenário (contrato B1). */\nexport const REQUIRED_PUBLIC_FIELDS: Record<\n BemonyScenario,\n readonly (keyof BemonyPublicPageContext)[]\n> = {\n 'offer-page': [],\n checkout: [],\n 'upsell-offer': [],\n 'one-click-checkout': [\n 'publicOrderId',\n 'funnelId',\n 'funnelStepId',\n 'priceCode',\n ],\n 'thank-you': [],\n};\n\nexport type ValidateBemonyPageContextOptions = {\n scenario: BemonyScenario;\n publicContext: BemonyPublicPageContext;\n /** Quando true, aplica trim/charset aos IDs públicos. Default: true. */\n sanitize?: boolean;\n};\n\nfunction assertSafePublicId(\n field: keyof BemonyPublicPageContext,\n value: string,\n scenario: BemonyScenario\n): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" cannot be empty for scenario \"${scenario}\".`,\n });\n }\n if (trimmed.length > MAX_ID_LENGTH) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" exceeds maximum length of ${MAX_ID_LENGTH}.`,\n });\n }\n if (!SAFE_ID_PATTERN.test(trimmed)) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" contains invalid characters.`,\n });\n }\n return trimmed;\n}\n\n/**\n * Valida obrigatoriedade por cenário e rejeita IDs públicos inválidos.\n */\nexport function validateBemonyPageContext(\n options: ValidateBemonyPageContextOptions\n): BemonyPublicPageContext {\n const { scenario } = options;\n const sanitize = options.sanitize !== false;\n const required = REQUIRED_PUBLIC_FIELDS[scenario];\n const source = options.publicContext;\n const result: BemonyPublicPageContext = {};\n\n for (const field of Object.keys(\n source\n ) as (keyof BemonyPublicPageContext)[]) {\n const value = source[field];\n if (value === undefined) {\n continue;\n }\n result[field] = sanitize\n ? assertSafePublicId(field, value, scenario)\n : value;\n }\n\n for (const field of required) {\n if (!result[field]) {\n throw new BemonyValidationError({\n code: 'MISSING_REQUIRED_FIELD',\n field,\n scenario,\n message: `Field \"${field}\" is required for scenario \"${scenario}\".`,\n });\n }\n }\n\n return result;\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { BemonyEnvironment } from './environments';\nimport type { BemonyScenario } from '../scenarios/types';\n\n/**\n * Defaults estáveis da plataforma Bemony (sem dados dinâmicos de página).\n * Composição: DEFAULT_PIXEL_CONFIG → estes defaults → environment → scenario → page.\n */\nexport const BEMONY_STORAGE_PREFIX = '__bemony_pixel';\nexport const BEMONY_DEFAULT_NAMESPACE = 'bemony-web' as const;\n\n/**\n * Endpoint público padrão da API Pixel Bemony (infraestrutura, não credencial).\n * O Core acrescenta `/pixels/public/event` e `/pixels/public/event/batch`.\n */\nexport const BEMONY_DEFAULT_API_ENDPOINT =\n 'https://micro-service-pixel-production-4826.up.railway.app' as const;\n\nexport const BEMONY_DEFAULT_PIXEL_ID = 'pix_7704308' as const;\n\n/** Domínios Bemony permitidos por default para decoração de links. */\nexport const BEMONY_DEFAULT_ALLOWED_DOMAINS = [\n 'security.bemony.com',\n /** Serve HTTP local (`pnpm dlx serve`). */\n 'localhost',\n '127.0.0.1',\n /**\n * Sentinel interno: permite links relativos / `file://` (hostname vazio)\n * no LinkDecorator — só para simulação local dos examples.\n */\n 'local',\n] as const;\n\n/** Ambiente padrão do auto-init do bundle global IIFE (não da factory programática). */\nexport const BEMONY_DEFAULT_BROWSER_ENVIRONMENT =\n 'production' as const satisfies BemonyEnvironment;\n\n/** Cenário padrão do auto-init do bundle global IIFE. */\nexport const BEMONY_DEFAULT_BROWSER_SCENARIO =\n 'offer-page' as const satisfies BemonyScenario;\n\n/**\n * Defaults oficiais do auto-init browser (IIFE global).\n * Imutável — merge deve clonar, nunca mutar.\n */\nexport const BEMONY_BROWSER_AUTO_INIT_DEFAULTS = Object.freeze({\n environment: BEMONY_DEFAULT_BROWSER_ENVIRONMENT,\n scenario: BEMONY_DEFAULT_BROWSER_SCENARIO,\n platform: Object.freeze({\n pixelId: BEMONY_DEFAULT_PIXEL_ID,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n allowedDomains: Object.freeze([...BEMONY_DEFAULT_ALLOWED_DOMAINS]),\n }),\n});\n\nexport type BemonyPlatformDefaults = {\n app: {\n source: 'bemony';\n };\n storage: {\n prefix: typeof BEMONY_STORAGE_PREFIX;\n namespace: typeof BEMONY_DEFAULT_NAMESPACE;\n persistence: {\n visitor: 'localStorage';\n session: 'sessionStorage';\n attribution: 'localStorage';\n };\n };\n attribution: {\n enabled: true;\n persist: true;\n captureUrlParams: true;\n captureCookies: true;\n };\n};\n\nexport const BEMONY_PLATFORM_DEFAULTS: BemonyPlatformDefaults = {\n app: {\n source: 'bemony',\n },\n storage: {\n prefix: BEMONY_STORAGE_PREFIX,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n persistence: {\n visitor: 'localStorage',\n session: 'sessionStorage',\n attribution: 'localStorage',\n },\n },\n attribution: {\n enabled: true,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n },\n};\n\n/**\n * Opções de plataforma injetadas pelo app (sem hardcode de credenciais/endpoints).\n */\nexport type BemonyPlatformOptions = {\n /** Identidade obrigatória do pixel. */\n pixelId: string;\n /**\n * Endpoint base da API Pixel.\n * Obrigatório em staging/production; opcional em development (mock).\n * Não inventar URL — injetar valor aprovado (env/provider).\n */\n apiEndpoint?: string;\n /** Namespace estável por aplicação (não por página/oferta). */\n namespace?: string;\n /** Domínios aprovados para link decoration. */\n allowedDomains?: readonly string[];\n /** Override explícito de debug (senão segue o ambiente). */\n debug?: boolean;\n};\n\n/**\n * Aplica defaults de plataforma sobre um PixelConfig base (mutação controlada via retorno novo).\n */\nexport function applyBemonyPlatformDefaults(\n base: PixelConfig,\n platform: BemonyPlatformOptions\n): PixelConfig {\n const namespace = platform.namespace ?? BEMONY_DEFAULT_NAMESPACE;\n\n return {\n ...base,\n app: {\n ...base.app,\n source: BEMONY_PLATFORM_DEFAULTS.app.source,\n },\n identity: {\n ...base.identity,\n pixelId: platform.pixelId,\n },\n storage: {\n ...base.storage,\n prefix: BEMONY_PLATFORM_DEFAULTS.storage.prefix,\n namespace,\n persistence: {\n ...base.storage.persistence,\n ...BEMONY_PLATFORM_DEFAULTS.storage.persistence,\n },\n },\n attribution: {\n ...base.attribution,\n ...BEMONY_PLATFORM_DEFAULTS.attribution,\n customClickIdParams: base.attribution.customClickIdParams\n ? [...base.attribution.customClickIdParams]\n : [],\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { UrlLinkDecorationConfig } from '@beworke/pixel/config';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\n/**\n * Política de decoração de links Bemony.\n * `allowedDomains` filtra destinos; `selector` opcional restringe quais âncoras.\n */\nexport type BemonyLinkPolicy = {\n /** Domínios aprovados para decoração (`sid`, `afid`, forwards). */\n allowedDomains: string[];\n /**\n * CSS selector de CTAs (ex.: upsell accept/decline).\n * Sem selector, o Core usa `a[href]` e filtra só por domínio.\n */\n selector?: string;\n strategy: NonNullable<UrlLinkDecorationConfig['strategy']>;\n preserveExisting: boolean;\n overwriteExisting: boolean;\n decorateMailto: boolean;\n decorateTel: boolean;\n decorateHashLinks: boolean;\n mergeDefaultExcludedDomains: boolean;\n mergeDefaultExcludeSelectors: boolean;\n excludeSelectors?: string[];\n};\n\n/** Selector legado de offer-page (export estável). */\nexport const DEFAULT_BEMONY_LINK_SELECTOR = '[data-bemony-offer][href]';\n\nexport type CreateBemonyLinkPolicyOptions = {\n allowedDomains?: readonly string[];\n /** Restringe decoração a CTAs (ex.: `BEMONY_UPSELL_LINK_SELECTOR`). */\n selector?: string;\n strategy?: BemonyLinkPolicy['strategy'];\n preserveExisting?: boolean;\n overwriteExisting?: boolean;\n excludeSelectors?: readonly string[];\n};\n\n/**\n * Normaliza domínio: lowercase, sem protocolo/path/query/hash/porta.\n */\nexport function normalizeAllowedDomain(domain: string): string {\n let value = domain.trim().toLowerCase();\n value = value.replace(/^https?:\\/\\//, '');\n value = value.split('/')[0] ?? value;\n value = value.split('?')[0] ?? value;\n value = value.split('#')[0] ?? value;\n // remove porta explícita se presente (ex.: host:443)\n const withoutPort = value.replace(/:\\d+$/, '');\n return withoutPort;\n}\n\n/**\n * Normaliza, deduplica e remove entradas vazias.\n */\nexport function normalizeAllowedDomains(domains: readonly string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const raw of domains) {\n const normalized = normalizeAllowedDomain(raw);\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nexport function createBemonyLinkPolicy(\n options: CreateBemonyLinkPolicyOptions = {}\n): BemonyLinkPolicy {\n const sourceDomains =\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? options.allowedDomains\n : BEMONY_DEFAULT_ALLOWED_DOMAINS;\n\n const allowedDomains = normalizeAllowedDomains([...sourceDomains]);\n\n const selector = options.selector?.trim();\n\n return {\n allowedDomains,\n ...(selector ? { selector } : {}),\n strategy: options.strategy ?? 'both',\n preserveExisting: options.preserveExisting ?? true,\n overwriteExisting: options.overwriteExisting ?? false,\n decorateMailto: false,\n decorateTel: false,\n decorateHashLinks: false,\n mergeDefaultExcludedDomains: true,\n mergeDefaultExcludeSelectors: true,\n excludeSelectors: options.excludeSelectors\n ? [...options.excludeSelectors]\n : undefined,\n };\n}\n\n/**\n * Converte política em config do Core (`selector` só se definido na policy).\n */\nexport function linkPolicyToDecorationConfig(\n policy: BemonyLinkPolicy\n): UrlLinkDecorationConfig {\n return {\n enabled: true,\n strategy: policy.strategy,\n allowedDomains: [...policy.allowedDomains],\n ...(policy.selector ? { selector: policy.selector } : {}),\n preserveExisting: policy.preserveExisting,\n overwriteExisting: policy.overwriteExisting,\n decorateMailto: policy.decorateMailto,\n decorateTel: policy.decorateTel,\n decorateHashLinks: policy.decorateHashLinks,\n mergeDefaultExcludedDomains: policy.mergeDefaultExcludedDomains,\n mergeDefaultExcludeSelectors: policy.mergeDefaultExcludeSelectors,\n ...(policy.excludeSelectors\n ? { excludeSelectors: [...policy.excludeSelectors] }\n : {}),\n };\n}\n\n/**\n * Extrai a política efetiva a partir de um PixelConfig já composto.\n */\nexport function readLinkPolicyFromConfig(\n config: PixelConfig\n): UrlLinkDecorationConfig | undefined {\n return config.modules.core.urlContext?.linkDecoration;\n}\n","import type {\n UrlContextConfig,\n UrlManagedParamConfig,\n} from '@beworke/pixel/config';\nimport {\n createBemonyLinkPolicy,\n linkPolicyToDecorationConfig,\n type CreateBemonyLinkPolicyOptions,\n} from './BemonyLinkPolicy';\n\n/** Managed param oficial do sid público (≠ session_id interno). */\nexport const BEMONY_SID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'public_session',\n param: 'sid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n generator: { type: 'public_id', prefix: 'sid' },\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'sid',\n },\n decorateLinks: true,\n};\n\n/**\n * Managed param oficial do afiliado (`afid`).\n * Nunca possui generator — o Pixel não cria afiliado.\n */\nexport const BEMONY_AFID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'affiliate',\n param: 'afid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'afid',\n },\n decorateLinks: true,\n};\n\n/**\n * Managed param oficial da Order pública (`oid`).\n * Sem generator — Order é criada pelo checkout/backend; Pixel só persiste/propaga\n * via setPublicOrderId ou params públicos já presentes na URL.\n */\nexport const BEMONY_OID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'order_id',\n param: 'oid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'oid',\n },\n decorateLinks: true,\n};\n\n/** Funnel id público (`fid`). Sem generator. */\nexport const BEMONY_FID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'funnel_id',\n param: 'fid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'fid',\n },\n decorateLinks: true,\n};\n\n/** Funnel step id público (`fsid`). Sem generator. */\nexport const BEMONY_FSID_MANAGED_PARAM: UrlManagedParamConfig = {\n key: 'funnel_step_id',\n param: 'fsid',\n mode: 'read_write',\n writeStrategy: 'replaceState',\n persistence: {\n enabled: true,\n strategy: 'localStorage_cookie',\n storageKey: 'fsid',\n },\n decorateLinks: true,\n};\n\n/**\n * Params que nunca devem ser capturados/encaminhados pelo UrlContext.\n */\nexport const BEMONY_FORWARD_DENYLIST: readonly string[] = [\n 'token',\n 'one_click_token',\n 'oneclicktoken',\n 'oneClickToken',\n 'ephemeral_token',\n 'payment_token',\n 'access_token',\n 'refresh_token',\n 'id_token',\n 'auth_token',\n 'secret',\n 'password',\n 'pass',\n 'pwd',\n 'email',\n 'phone',\n 'cpf',\n 'cnpj',\n 'document',\n 'card',\n 'cc',\n 'credit_card',\n 'pan',\n 'cvv',\n 'cvc',\n 'auth',\n 'code',\n 'sessionid',\n 'internalsessionid',\n 'pixelsessionid',\n] as const;\n\nexport type ConfigureBemonyLinksOptions = CreateBemonyLinkPolicyOptions & {\n /** Quando false, não inclui o managed param `sid`. Default: true. */\n includeSidManagedParam?: boolean;\n /** Quando false, não inclui o managed param `afid`. Default: true. */\n includeAfidManagedParam?: boolean;\n /** Quando false, não inclui o managed param `oid`. Default: true (todos os scenarios). */\n includeOidManagedParam?: boolean;\n /** Quando false, não inclui `fid`/`fsid`. Default: true. */\n includeFunnelManagedParams?: boolean;\n};\n\nfunction cloneManagedParam(\n param: UrlManagedParamConfig\n): UrlManagedParamConfig {\n return {\n ...param,\n ...(param.generator ? { generator: { ...param.generator } } : {}),\n ...(param.persistence\n ? {\n persistence: {\n ...param.persistence,\n ...(param.persistence.cookie\n ? { cookie: { ...param.persistence.cookie } }\n : {}),\n },\n }\n : {}),\n };\n}\n\n/**\n * Produz `PixelConfig.modules.core.urlContext` para cenários Bemony.\n */\nexport function configureBemonyLinks(\n options: ConfigureBemonyLinksOptions = {}\n): UrlContextConfig {\n const policy = createBemonyLinkPolicy(options);\n const includeSid = options.includeSidManagedParam !== false;\n const includeAfid = options.includeAfidManagedParam !== false;\n const includeOid = options.includeOidManagedParam !== false;\n const includeFunnel = options.includeFunnelManagedParams !== false;\n const managedParams: UrlManagedParamConfig[] = [];\n if (includeSid) {\n managedParams.push(cloneManagedParam(BEMONY_SID_MANAGED_PARAM));\n }\n if (includeAfid) {\n managedParams.push(cloneManagedParam(BEMONY_AFID_MANAGED_PARAM));\n }\n if (includeOid) {\n managedParams.push(cloneManagedParam(BEMONY_OID_MANAGED_PARAM));\n }\n if (includeFunnel) {\n managedParams.push(cloneManagedParam(BEMONY_FID_MANAGED_PARAM));\n managedParams.push(cloneManagedParam(BEMONY_FSID_MANAGED_PARAM));\n }\n\n const denylist = [...BEMONY_FORWARD_DENYLIST];\n\n return {\n enabled: true,\n queryParams: {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n denylist: [...denylist],\n },\n managedParams,\n forwardParams: {\n enabled: true,\n mode: 'all_except',\n mergeDefaultDenylist: true,\n denylist: [...denylist],\n },\n linkDecoration: linkPolicyToDecorationConfig(policy),\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { BemonyValidationError } from '../domain/BemonyPageContext';\n\nexport type BemonyEnvironment = 'development' | 'staging' | 'production';\n\nexport const BEMONY_ENVIRONMENTS: readonly BemonyEnvironment[] = [\n 'development',\n 'staging',\n 'production',\n] as const;\n\nexport type BemonyEnvironmentResolution = {\n environment: BemonyEnvironment;\n debug: boolean;\n /** Endpoint efetivo (pode ser '' em development com mock). */\n apiEndpoint: string;\n transportEnabled: boolean;\n senderMode: 'mock' | 'http';\n};\n\nexport type ResolveBemonyEnvironmentOptions = {\n environment: BemonyEnvironment;\n apiEndpoint?: string;\n debugOverride?: boolean;\n};\n\nfunction isNonEmptyEndpoint(value: string | undefined): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Resolve comportamento por ambiente.\n * Staging/production exigem endpoint injetado — nenhum URL inventado.\n */\nexport function resolveBemonyEnvironment(\n options: ResolveBemonyEnvironmentOptions\n): BemonyEnvironmentResolution {\n const { environment } = options;\n\n if (environment === 'development') {\n return {\n environment,\n debug: options.debugOverride ?? true,\n apiEndpoint: isNonEmptyEndpoint(options.apiEndpoint)\n ? options.apiEndpoint.trim()\n : '',\n transportEnabled: false,\n senderMode: 'mock',\n };\n }\n\n if (environment === 'staging' || environment === 'production') {\n if (!isNonEmptyEndpoint(options.apiEndpoint)) {\n throw new BemonyValidationError({\n code: 'MISSING_ENDPOINT',\n field: 'apiEndpoint',\n message: `apiEndpoint is required for environment \"${environment}\". Inject an approved endpoint; do not hardcode credentials.`,\n });\n }\n\n return {\n environment,\n debug: options.debugOverride ?? false,\n apiEndpoint: options.apiEndpoint.trim(),\n transportEnabled: true,\n senderMode: 'http',\n };\n }\n\n throw new BemonyValidationError({\n code: 'INVALID_ENVIRONMENT',\n field: 'environment',\n message: 'Unsupported Bemony environment.',\n });\n}\n\n/**\n * Aplica resolução de ambiente sobre um PixelConfig (retorno novo).\n */\nexport function applyBemonyEnvironment(\n base: PixelConfig,\n resolution: BemonyEnvironmentResolution\n): PixelConfig {\n return {\n ...base,\n app: {\n ...base.app,\n environment: resolution.environment,\n debug: resolution.debug,\n },\n transport: {\n ...base.transport,\n apiEndpoint: resolution.apiEndpoint,\n },\n modules: {\n ...base.modules,\n transport: {\n ...base.modules.transport,\n enabled: resolution.transportEnabled,\n sender: {\n ...base.modules.transport.sender,\n mode: resolution.senderMode,\n },\n mockSender: {\n ...base.modules.transport.mockSender,\n enabled: resolution.senderMode === 'mock',\n },\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\nexport type ApplyCheckoutScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n /**\n * Quando false, não registra o detector lifecycle de INITIATE_CHECKOUT.\n * O wrapper também respeita a mesma flag em `maybeAutoInitiateCheckout`.\n * Default: true.\n */\n autoInitiateCheckout?: boolean;\n /**\n * Quando false, não inclui o managed param `oid`. Default: true.\n */\n includeOidManagedParam?: boolean;\n};\n\nfunction resolveMainProductId(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): string | undefined {\n if (!products || products.length === 0) {\n return undefined;\n }\n const main = products.find(product => product.type === 'main');\n return (main ?? products[0])?.id;\n}\n\n/**\n * Preset do cenário `checkout` (domínio Bemony).\n *\n * - target `checkout`\n * - commerce mode `checkout`\n * - PAGE_VIEW pelo Core\n * - INITIATE_CHECKOUT via wrapper (auto pós-init, idempotente)\n * - manual: lead, addToCart, removeFromCart, addPaymentInfo\n * - purchase manual desabilitado (browser não emite purchase)\n */\nexport function applyCheckoutScenario(\n base: PixelConfig,\n options: ApplyCheckoutScenarioOptions = {\n autoInitiateCheckout: true,\n includeOidManagedParam: true,\n }\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const mainProductId = resolveMainProductId(products);\n const autoInitiateCheckout = options.autoInitiateCheckout !== false;\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({\n allowedDomains,\n includeOidManagedParam: options.includeOidManagedParam ?? true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n lead: { enabled: true },\n addToCart: { enabled: true },\n removeFromCart: { enabled: true },\n initiateCheckout: { enabled: true },\n addPaymentInfo: { enabled: true },\n viewContent: { enabled: false },\n pageView: { enabled: false },\n purchase: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'checkout',\n source: 'bemony',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: 'checkout',\n initialItems: mainProductId\n ? [{ productId: mainProductId, quantity: 1 }]\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n initiateCheckout: { enabled: true, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n removeFromCart: { enabled: true, source: 'event_or_cart' },\n addPaymentInfo: { enabled: true, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n viewContent: { enabled: false, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [\n {\n name: 'main-product-after-contact',\n type: 'form',\n selectorForm: {\n fields: ['email', 'phone'],\n mode: 'all',\n formSelector: '#checkout-form',\n trigger: 'input',\n debounceMs: 300,\n fireOnce: true,\n },\n },\n {\n name: 'product-or-bump-click',\n type: 'selector',\n selector: 'add_to_cart',\n selectorType: 'attribute',\n trigger: 'click',\n fireOnce: false,\n },\n ],\n },\n removeFromCart: {\n enabled: true,\n sources: [\n {\n name: 'remove-product-click',\n type: 'selector',\n selector: 'remove_from_cart',\n selectorType: 'attribute',\n trigger: 'click',\n },\n ],\n },\n initiateCheckout: {\n enabled: autoInitiateCheckout,\n sources: autoInitiateCheckout\n ? [\n {\n name: 'checkout-loaded',\n type: 'lifecycle',\n trigger: 'ready',\n fireOnce: true,\n },\n ]\n : [],\n },\n addPaymentInfo: {\n enabled: true,\n sources: [\n {\n name: 'credit-card-detection',\n type: 'payment',\n paymentMethod: 'CREDIT_CARD',\n cardDetection: true,\n autoDispatch: true,\n formSelector: '#checkout-form',\n fireOnce: true,\n },\n {\n name: 'payment-button-click',\n type: 'selector',\n selector: '[data-track=\"add_payment_info\"]',\n selectorType: 'css',\n trigger: 'click',\n fireOnce: false,\n },\n ],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\n\nexport type ApplyOneClickCheckoutScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n};\n\nfunction resolveCartMode(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): 'checkout' | 'upsell' {\n const list = products ?? [];\n const isUpsellLike = list.some(\n product => product.type === 'upsell' || product.type === 'downsell'\n );\n return isUpsellLike ? 'upsell' : 'checkout';\n}\n\nfunction resolvePrimaryProductId(\n products: NonNullable<PixelConfig['commerce']['catalog']>['products']\n): string | undefined {\n if (!products || products.length === 0) {\n return undefined;\n }\n const preferred = products.find(\n product =>\n product.type === 'upsell' ||\n product.type === 'downsell' ||\n product.type === 'main'\n );\n return (preferred ?? products[0])?.id;\n}\n\n/**\n * Preset do cenário `one-click-checkout`.\n *\n * Tracking apenas: PAGE_VIEW + INITIATE_CHECKOUT.\n * Pagamento e PURCHASE ficam no backend/app — o Pixel não é SDK de pagamentos.\n */\nexport function applyOneClickCheckoutScenario(\n base: PixelConfig,\n options: ApplyOneClickCheckoutScenarioOptions = {}\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const cartMode = resolveCartMode(products);\n const primaryId = resolvePrimaryProductId(products);\n const urlContext = configureBemonyLinks({\n allowedDomains: options.allowedDomains ? [...options.allowedDomains] : [],\n includeOidManagedParam: true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n initiateCheckout: { enabled: true },\n addToCart: { enabled: true },\n viewContent: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n addPaymentInfo: { enabled: false },\n pageView: { enabled: false },\n purchase: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'checkout',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: cartMode,\n initialItems: primaryId ? [{ productId: primaryId, quantity: 1 }] : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n initiateCheckout: { enabled: true, source: 'cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n viewContent: { enabled: false, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: false,\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { LinkAutoSource } from '@beworke/pixel/config';\nimport { normalizeAllowedDomains } from './BemonyLinkPolicy';\n\n/**\n * Cria a `LinkAutoSource` oficial de ofertas Bemony.\n *\n * - Match por hostname permitido + segmento de path `pri*`\n * - Extrai `priceCode` do último segmento do path\n * - Sem catálogo: o Core recebe priceCode via binding; o mapper usa-o como identidade\n */\nexport function createBemonyOfferLinkSource(\n allowedDomains: readonly string[]\n): LinkAutoSource {\n const hostnames = normalizeAllowedDomains([...allowedDomains]).filter(\n host => host !== 'local'\n );\n\n return {\n name: 'bemony-offer-link',\n type: 'link',\n enabled: true,\n trigger: 'click',\n fireOnce: false,\n match: {\n protocols: ['https:', 'http:'],\n hostnames,\n path: {\n segmentPrefixes: ['pri'],\n },\n },\n bindings: {\n // Core LinkAuto reconhece priceCode; productId no evento = priceCode observado.\n priceCode: {\n from: {\n source: 'pathSegment',\n index: -1,\n },\n required: true,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport type { CommerceCartMode } from '@beworke/pixel/config';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { createBemonyOfferLinkSource } from '../navigation/createBemonyOfferLinkSource';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\n\nexport type OfferPageCartMode = Extract<\n CommerceCartMode,\n 'landing_page' | 'single_product'\n>;\n\nexport type ApplyOfferPageScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n cartMode?: OfferPageCartMode;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n};\n\n/**\n * Preset do cenário `offer-page` (domínio do cliente / VSL).\n *\n * - target `landing`\n * - commerce `landing_page` | `single_product`\n * - PAGE_VIEW pelo Core\n * - conversion manual: viewContent + addToCart\n * - UrlContext (sid + afid) por allowedDomains\n * - LinkAutoSource: ADD_TO_CART em segmentos `pri*` sem data attributes\n */\nexport function applyOfferPageScenario(\n base: PixelConfig,\n options: ApplyOfferPageScenarioOptions = {}\n): PixelConfig {\n const cartMode: OfferPageCartMode = options.cartMode ?? 'landing_page';\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({ allowedDomains });\n const offerLinkSource = createBemonyOfferLinkSource(allowedDomains);\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n viewContent: { enabled: true },\n addToCart: { enabled: true },\n // Offer page não emite estes manualmente nesta etapa.\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'landing',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: cartMode,\n initialItems: base.commerce.cart?.initialItems\n ? base.commerce.cart.initialItems.map(item => ({ ...item }))\n : [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n viewContent: { enabled: true, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [offerLinkSource],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\n\nexport type ApplyThankYouScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n};\n\n/**\n * Preset do cenário `thank-you`.\n *\n * - target `custom`\n * - PAGE_VIEW no init (Core)\n * - sem PURCHASE browser\n * - sem auto checkout / conversion manual\n * - contexto público mínimo (pageId; publicOrderId só no domínio do app)\n */\nexport function applyThankYouScenario(\n base: PixelConfig,\n options: ApplyThankYouScenarioOptions = {}\n): PixelConfig {\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n const urlContext = configureBemonyLinks({\n allowedDomains: options.allowedDomains ? [...options.allowedDomains] : [],\n includeOidManagedParam: true,\n });\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n addToCart: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n viewContent: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'custom',\n },\n commerce: {\n ...base.commerce,\n enabled: false,\n currency,\n catalog: { products: [] },\n cart: {\n ...base.commerce.cart,\n mode: 'custom',\n initialItems: [],\n allowDynamicItems: false,\n calculateValueFrom: 'cart',\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n purchase: { enabled: false, source: 'cart' },\n pageView: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: false,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: false,\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","import type { PixelConfig } from '@beworke/pixel';\nimport { configureBemonyLinks } from '../navigation/configureBemonyLinks';\nimport { createBemonyOfferLinkSource } from '../navigation/createBemonyOfferLinkSource';\nimport { normalizeAllowedDomains } from '../navigation/BemonyLinkPolicy';\nimport { BEMONY_DEFAULT_ALLOWED_DOMAINS } from '../platform/defaults';\n\n/** Base: buy `/pri*` + offer-page legado. No-thanks entra via `buildUpsellLinkSelector`. */\nexport const BEMONY_UPSELL_BUY_LINK_SELECTOR =\n 'a[href*=\"pri\"], [data-bemony-offer][href]';\n\n/**\n * Selector estático sem no-thanks (compat / testes sem URL).\n * Preferir `buildUpsellLinkSelector(noThanksUrl)` quando `data-no-thanks` existir no script.\n */\nexport const BEMONY_UPSELL_LINK_SELECTOR = BEMONY_UPSELL_BUY_LINK_SELECTOR;\n\n/** Escapa valor para uso em seletor CSS `attr=\"…\"`. */\nexport function escapeCssAttributeValue(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Política de decoração upsell/downsell.\n * - buy: `href` com `pri*`\n * - no-thanks: âncora cujo `href` coincide com `data-no-thanks` do script\n */\nexport function buildUpsellLinkSelector(noThanksUrl?: string): string {\n const raw = noThanksUrl?.trim();\n if (!raw) {\n return BEMONY_UPSELL_BUY_LINK_SELECTOR;\n }\n return `${BEMONY_UPSELL_BUY_LINK_SELECTOR}, a[href=\"${escapeCssAttributeValue(raw)}\"]`;\n}\n\n/**\n * Compara href do link com a URL do script (`data-no-thanks`),\n * resolvendo relativos contra a página atual.\n */\nexport function hrefMatchesNoThanksUrl(\n href: string | null | undefined,\n noThanksUrl: string,\n baseHref?: string\n): boolean {\n const linkHref = href?.trim();\n const targetRaw = noThanksUrl.trim();\n if (!linkHref || linkHref === '#' || !targetRaw) {\n return false;\n }\n if (linkHref === targetRaw) {\n return true;\n }\n try {\n const base =\n baseHref ??\n (typeof window !== 'undefined' && window.location?.href\n ? window.location.href\n : 'https://localhost/');\n const left = new URL(linkHref, base);\n const right = new URL(targetRaw, base);\n left.hash = '';\n right.hash = '';\n return left.href === right.href;\n } catch {\n return false;\n }\n}\n\nexport type ApplyUpsellOfferScenarioOptions = {\n allowedDomains?: readonly string[];\n currency?: string;\n products?: NonNullable<PixelConfig['commerce']['catalog']>['products'];\n includeOidManagedParam?: boolean;\n /** URL de recusa (`data-no-thanks` no script) — entra no selector de decoração. */\n noThanksUrl?: string;\n};\n\n/**\n * Preset do cenário `upsell-offer` (domínio do cliente, pós-compra).\n *\n * - target `custom`\n * - commerce mode `upsell` (sem catálogo obrigatório; priceCode via URL)\n * - PAGE_VIEW pelo Core\n * - conversion: ADD_TO_CART automático em links `/pri*` (mesmo source do offer-page)\n * - UrlContext decora buy `/pri*` + no-thanks (href = script data-no-thanks)\n *\n * GAP: sem evento de decline no Core — `declineUpsell` não emite conversion.\n */\nexport function applyUpsellOfferScenario(\n base: PixelConfig,\n options: ApplyUpsellOfferScenarioOptions = {}\n): PixelConfig {\n const products = (options.products ?? []).map(product => ({ ...product }));\n const currency = options.currency ?? base.commerce.currency ?? 'BRL';\n\n const allowedDomains = normalizeAllowedDomains(\n options.allowedDomains !== undefined && options.allowedDomains.length > 0\n ? [...options.allowedDomains]\n : [...BEMONY_DEFAULT_ALLOWED_DOMAINS]\n );\n\n const urlContext = configureBemonyLinks({\n allowedDomains,\n selector: buildUpsellLinkSelector(options.noThanksUrl),\n includeOidManagedParam: options.includeOidManagedParam ?? true,\n });\n const offerLinkSource = createBemonyOfferLinkSource(allowedDomains);\n\n const conversionManual = {\n ...base.modules.conversion.manual,\n viewContent: { enabled: true },\n addToCart: { enabled: true },\n pageView: { enabled: false },\n purchase: { enabled: false },\n lead: { enabled: false },\n removeFromCart: { enabled: false },\n initiateCheckout: { enabled: false },\n addPaymentInfo: { enabled: false },\n search: { enabled: false },\n };\n\n return {\n ...base,\n app: {\n ...base.app,\n target: 'custom',\n },\n commerce: {\n ...base.commerce,\n enabled: true,\n currency,\n catalog: { products },\n cart: {\n ...base.commerce.cart,\n mode: 'upsell',\n initialItems: [],\n allowDynamicItems: true,\n calculateValueFrom: 'cart',\n },\n mappings: {\n attributes: { ...(base.commerce.mappings?.attributes ?? {}) },\n fields: { ...(base.commerce.mappings?.fields ?? {}) },\n },\n enrichment: {\n ...(base.commerce.enrichment ?? {}),\n viewContent: { enabled: true, source: 'event_or_cart' },\n addToCart: { enabled: true, source: 'event_or_cart' },\n pageView: { enabled: false, source: 'cart' },\n purchase: { enabled: false, source: 'cart' },\n lead: { enabled: false, source: 'event_or_cart' },\n initiateCheckout: { enabled: false, source: 'cart' },\n },\n },\n modules: {\n ...base.modules,\n core: {\n ...base.modules.core,\n enabled: true,\n pageView: {\n ...base.modules.core.pageView,\n enabled: true,\n trackInitialPageView: true,\n },\n urlContext,\n },\n conversion: {\n ...base.modules.conversion,\n enabled: true,\n manual: conversionManual,\n auto: {\n ...base.modules.conversion.auto,\n enabled: true,\n detectors: {\n ...base.modules.conversion.auto.detectors,\n addToCart: {\n enabled: true,\n sources: [offerLinkSource],\n },\n },\n },\n },\n behavior: {\n ...base.modules.behavior,\n enabled: false,\n },\n },\n };\n}\n","export type BemonyBootstrapErrorCode =\n | 'NOT_BROWSER'\n | 'CONSENT_DENIED'\n | 'INVALID_ATTRIBUTES'\n | 'FORBIDDEN_ATTRIBUTE'\n | 'MULTIPLE_SCRIPTS'\n | 'AMBIGUOUS_SCRIPT'\n | 'SCRIPT_NOT_FOUND'\n | 'MISSING_CONFIG'\n | 'INVALID_CONFIG'\n | 'AUTO_INIT_DISABLED'\n | 'AUTO_INIT_FAILED'\n | 'MISSING_ENDPOINT';\n\nexport class BemonyBootstrapError extends Error {\n readonly code: BemonyBootstrapErrorCode;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n code: BemonyBootstrapErrorCode,\n cause?: unknown\n ) {\n super(message);\n this.name = 'BemonyBootstrapError';\n this.code = code;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n","import type { BemonyPixel } from '../BemonyPixel';\nimport type { BemonyBootstrapErrorCode } from './errors';\n\nexport const BEMONY_PIXEL_READY_EVENT = 'bemony:pixel:ready' as const;\nexport const BEMONY_PIXEL_ERROR_EVENT = 'bemony:pixel:error' as const;\nexport const BEMONY_PIXEL_INITIALIZING_EVENT =\n 'bemony:pixel:initializing' as const;\nexport const BEMONY_PIXEL_DESTROYED_EVENT = 'bemony:pixel:destroyed' as const;\n\nexport type BemonyPixelReadyDetail = {\n pixel: BemonyPixel;\n};\n\nexport type BemonyPixelErrorDetail = {\n code: BemonyBootstrapErrorCode | string;\n message: string;\n};\n\nfunction safeDispatch(type: string, detail: unknown): void {\n if (typeof window === 'undefined' || typeof CustomEvent === 'undefined') {\n return;\n }\n try {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n } catch {\n // listener externo / ambiente sem CustomEvent não quebra o lifecycle\n }\n}\n\nexport function emitBemonyPixelReady(pixel: BemonyPixel): void {\n safeDispatch(BEMONY_PIXEL_READY_EVENT, {\n pixel,\n } satisfies BemonyPixelReadyDetail);\n}\n\nexport function emitBemonyPixelError(\n code: BemonyBootstrapErrorCode | string,\n message: string\n): void {\n safeDispatch(BEMONY_PIXEL_ERROR_EVENT, {\n code,\n message,\n } satisfies BemonyPixelErrorDetail);\n}\n\nexport function emitBemonyPixelInitializing(): void {\n safeDispatch(BEMONY_PIXEL_INITIALIZING_EVENT, {});\n}\n\nexport function emitBemonyPixelDestroyed(): void {\n safeDispatch(BEMONY_PIXEL_DESTROYED_EVENT, {});\n}\n","import type { BemonyPixel } from '../BemonyPixel';\nimport {\n createBemonyPixel,\n type CreateBemonyPixelOptions,\n} from '../createBemonyPixel';\nimport { BemonyBootstrapError } from './errors';\nimport {\n emitBemonyPixelDestroyed,\n emitBemonyPixelError,\n emitBemonyPixelInitializing,\n emitBemonyPixelReady,\n} from './events';\n\nconst WINDOW_STORE_KEY = '__bemony_pixel_bootstrap__' as const;\n\nexport type BootstrapBemonyPixelOptions = CreateBemonyPixelOptions & {\n /**\n * Destrói a instância atual (se houver) e cria outra.\n * Útil para HMR / reinit controlado.\n */\n force?: boolean;\n /**\n * Gate de consentimento. Se retornar `false`, o bootstrap aborta.\n */\n waitForConsent?: () => boolean | Promise<boolean>;\n};\n\ntype BootstrapStore = {\n instance: BemonyPixel | null;\n pending: Promise<BemonyPixel> | null;\n /** Evita emitir `ready` duas vezes para o mesmo lifecycle. */\n readyEmittedFor: BemonyPixel | null;\n};\n\ntype WindowWithBootstrapStore = Window & {\n [WINDOW_STORE_KEY]?: BootstrapStore;\n};\n\nfunction assertBrowser(): void {\n if (typeof window === 'undefined') {\n throw new BemonyBootstrapError(\n 'bootstrapBemonyPixel só pode ser usado no browser (window ausente).',\n 'NOT_BROWSER'\n );\n }\n}\n\nfunction getStore(): BootstrapStore {\n assertBrowser();\n const win = window as WindowWithBootstrapStore;\n if (!win[WINDOW_STORE_KEY]) {\n win[WINDOW_STORE_KEY] = {\n instance: null,\n pending: null,\n readyEmittedFor: null,\n };\n }\n return win[WINDOW_STORE_KEY]!;\n}\n\nfunction isReusableInstance(instance: BemonyPixel): boolean {\n const state = instance.getState();\n return state === 'ready' || state === 'initializing';\n}\n\n/**\n * Bootstrap explícito: uma instância por `window`.\n * SSR-safe no sentido de falhar com erro claro fora do browser.\n */\nexport async function bootstrapBemonyPixel(\n options: BootstrapBemonyPixelOptions\n): Promise<BemonyPixel> {\n assertBrowser();\n const store = getStore();\n const { force = false, waitForConsent, ...pixelOptions } = options;\n\n if (!force) {\n if (store.pending) {\n return store.pending;\n }\n if (store.instance && isReusableInstance(store.instance)) {\n return store.instance;\n }\n }\n\n if (force) {\n if (store.pending) {\n try {\n await store.pending;\n } catch {\n // reinit após falha anterior\n }\n store.pending = null;\n }\n if (store.instance) {\n try {\n await store.instance.destroy();\n } catch {\n // segue recriando\n }\n store.instance = null;\n store.readyEmittedFor = null;\n }\n }\n\n if (waitForConsent) {\n const allowed = await waitForConsent();\n if (!allowed) {\n const error = new BemonyBootstrapError(\n 'Consentimento negado — bootstrap abortado.',\n 'CONSENT_DENIED'\n );\n emitBemonyPixelError(error.code, error.message);\n throw error;\n }\n }\n\n emitBemonyPixelInitializing();\n\n const pending = createBemonyPixel(pixelOptions)\n .then(instance => {\n store.instance = instance;\n if (store.pending === pending) {\n store.pending = null;\n }\n if (store.readyEmittedFor !== instance) {\n emitBemonyPixelReady(instance);\n store.readyEmittedFor = instance;\n }\n return instance;\n })\n .catch((error: unknown) => {\n if (store.pending === pending) {\n store.pending = null;\n }\n const code =\n error instanceof BemonyBootstrapError ? error.code : 'AUTO_INIT_FAILED';\n const message =\n error instanceof Error ? error.message : 'Bootstrap falhou';\n emitBemonyPixelError(code, message);\n throw error;\n });\n\n store.pending = pending;\n return pending;\n}\n\nexport function getBootstrappedBemonyPixel(): BemonyPixel | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const store = (window as WindowWithBootstrapStore)[WINDOW_STORE_KEY];\n return store?.instance ?? null;\n}\n\n/**\n * Promise pendente do bootstrap atual (se houver).\n */\nexport function getBootstrappedBemonyPixelPending(): Promise<BemonyPixel> | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const store = (window as WindowWithBootstrapStore)[WINDOW_STORE_KEY];\n return store?.pending ?? null;\n}\n\n/**\n * Destroi a instância bootstrapada (se existir) e limpa o store da window.\n */\nexport async function destroyBootstrappedBemonyPixel(): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n const store = getStore();\n if (store.pending) {\n try {\n await store.pending;\n } catch {\n // ignore\n }\n store.pending = null;\n }\n if (store.instance) {\n await store.instance.destroy();\n store.instance = null;\n store.readyEmittedFor = null;\n emitBemonyPixelDestroyed();\n }\n}\n\n/** @internal limpa store sem destroy (testes). Preferir destroyBootstrappedBemonyPixel. */\nexport function clearBootstrapStoreForTests(): void {\n if (typeof window === 'undefined') {\n return;\n }\n const win = window as WindowWithBootstrapStore;\n delete win[WINDOW_STORE_KEY];\n}\n","/**\n * Cenários de domínio Bemony (V1).\n * Determinam comportamentos locais (eventos, detectores, params).\n * Nenhum cenário consulta catálogo no bootstrap.\n */\nexport type BemonyScenario =\n | 'offer-page'\n | 'checkout'\n | 'upsell-offer'\n | 'one-click-checkout'\n | 'thank-you';\n\nexport const BEMONY_SCENARIOS: readonly BemonyScenario[] = [\n 'offer-page',\n 'checkout',\n 'upsell-offer',\n 'one-click-checkout',\n 'thank-you',\n] as const;\n","import { BemonyBootstrapError } from './errors';\n\n/** Nome do arquivo do bundle IIFE global. */\nexport const BEMONY_GLOBAL_BUNDLE_FILENAME = 'pixel-bemony.global.js' as const;\n\nconst LEGACY_SCRIPT_SELECTOR = 'script[data-bemony-pixel]';\n\nexport type ResolveBemonyExecutingScriptInput = {\n /** Override de `document.currentScript` (testes). */\n currentScript?: HTMLScriptElement | SVGScriptElement | null;\n /** Documento / raiz para fallbacks (default: `document`). */\n root?: ParentNode;\n};\n\nfunction isHtmlScript(el: Element | null | undefined): el is HTMLScriptElement {\n return (\n !!el &&\n typeof HTMLScriptElement !== 'undefined' &&\n el instanceof HTMLScriptElement\n );\n}\n\n/**\n * Verifica se o `src` do script aponta para o bundle global Bemony.\n * Suporta URL absoluta, relativa, query string e hash.\n */\nexport function isBemonyGlobalBundleSrc(\n src: string | null | undefined\n): boolean {\n if (!src || !src.trim()) {\n return false;\n }\n try {\n const base =\n typeof location !== 'undefined' && location.href\n ? location.href\n : 'https://example.invalid/';\n const url = new URL(src.trim(), base);\n const path = url.pathname.toLowerCase();\n return (\n path === `/${BEMONY_GLOBAL_BUNDLE_FILENAME}` ||\n path.endsWith(`/${BEMONY_GLOBAL_BUNDLE_FILENAME}`)\n );\n } catch {\n const normalized = src.trim().toLowerCase().split(/[?#]/)[0] ?? '';\n return (\n normalized === BEMONY_GLOBAL_BUNDLE_FILENAME ||\n normalized.endsWith(`/${BEMONY_GLOBAL_BUNDLE_FILENAME}`)\n );\n }\n}\n\n/**\n * Localiza o `<script>` que está executando o bundle Bemony.\n *\n * Prioridade:\n * 1. `document.currentScript` (HTMLScriptElement)\n * 2. fallback por `src` contendo `pixel-bemony.global.js`\n * 3. legado `script[data-bemony-pixel]`\n */\nexport function resolveBemonyExecutingScript(\n input: ResolveBemonyExecutingScriptInput = {}\n): HTMLScriptElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n\n const current =\n input.currentScript !== undefined\n ? input.currentScript\n : typeof document.currentScript !== 'undefined'\n ? document.currentScript\n : null;\n\n if (isHtmlScript(current)) {\n return current;\n }\n\n const root = input.root ?? document;\n const allScripts = Array.from(root.querySelectorAll('script'));\n\n const bySrc = allScripts.filter(\n (el): el is HTMLScriptElement =>\n isHtmlScript(el) && isBemonyGlobalBundleSrc(el.getAttribute('src'))\n );\n\n if (bySrc.length === 1) {\n return bySrc[0]!;\n }\n if (bySrc.length > 1) {\n throw new BemonyBootstrapError(\n `Encontrados ${bySrc.length} scripts com src de ${BEMONY_GLOBAL_BUNDLE_FILENAME}; não é possível determinar qual está em execução.`,\n 'AMBIGUOUS_SCRIPT'\n );\n }\n\n const legacy = Array.from(\n root.querySelectorAll(LEGACY_SCRIPT_SELECTOR)\n ).filter(isHtmlScript);\n\n if (legacy.length === 1) {\n return legacy[0]!;\n }\n // Múltiplos marcadores legado: deixa o caller decidir (MULTIPLE_SCRIPTS / defaults)\n return null;\n}\n","import type { CreateBemonyPixelOptions } from '../createBemonyPixel';\nimport type { BemonyPublicPageContext } from '../domain/BemonyPageContext';\nimport {\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_DEFAULT_NAMESPACE,\n BEMONY_DEFAULT_PIXEL_ID,\n type BemonyPlatformOptions,\n} from '../platform/defaults';\nimport {\n BEMONY_ENVIRONMENTS,\n type BemonyEnvironment,\n} from '../platform/environments';\nimport { BEMONY_SCENARIOS, type BemonyScenario } from '../scenarios/types';\nimport { BemonyBootstrapError } from './errors';\nimport { resolveBemonyExecutingScript } from './resolveExecutingScript';\n\n/**\n * Config global opcional (`window.BemonyPixelConfig`).\n * Apenas campos públicos — sem token efêmero.\n * Campos omitidos herdam `BEMONY_BROWSER_AUTO_INIT_DEFAULTS`.\n */\nexport type BemonyPixelGlobalConfig = {\n environment?: BemonyEnvironment;\n scenario?: BemonyScenario;\n /** Parcial — campos omitidos herdam defaults oficiais. */\n platform?: Partial<BemonyPlatformOptions>;\n page?: CreateBemonyPixelOptions['page'];\n commerce?: CreateBemonyPixelOptions['commerce'];\n overrides?: CreateBemonyPixelOptions['overrides'];\n autoInitiateCheckout?: boolean;\n /** URL de “No Thanks” (upsell/downsell). */\n noThanksUrl?: string;\n};\n\n/**\n * Fontes de configuração do auto-init.\n * Precedência (menor → maior): default → window-config → data-attributes → explicit.\n */\nexport type BemonyConfigSource =\n | 'default'\n | 'window-config'\n | 'data-attributes'\n | 'explicit'\n | 'merged';\n\n/** Atributos que nunca podem aparecer em data-* (token / segredos). */\nexport const BEMONY_FORBIDDEN_DATA_ATTRIBUTES: readonly string[] = [\n 'data-token',\n 'data-one-click-token',\n 'data-oneclick-token',\n 'data-ephemeral-token',\n 'data-payment-token',\n 'data-oc-token',\n 'data-secret',\n 'data-auth-token',\n] as const;\n\nconst SCRIPT_SELECTOR = 'script[data-bemony-pixel]';\n\nfunction isEnvironment(value: string): value is BemonyEnvironment {\n return (BEMONY_ENVIRONMENTS as readonly string[]).includes(value);\n}\n\nfunction isScenario(value: string): value is BemonyScenario {\n return (BEMONY_SCENARIOS as readonly string[]).includes(value);\n}\n\n/**\n * Parse de boolean em data-*.\n * Aceita: true/false/1/0 e atributo vazio (= true) quando aplicável.\n */\nexport function parseBooleanAttr(value: string | null): boolean | undefined {\n if (value === null) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true' || normalized === '1' || normalized === '') {\n return true;\n }\n if (normalized === 'false' || normalized === '0') {\n return false;\n }\n return undefined;\n}\n\n/**\n * Interpreta `data-auto-init` no entry global.\n * Ausência do atributo → true (auto-init por padrão).\n */\nexport function isAutoInitEnabledFromAttr(\n value: string | null | undefined\n): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n const parsed = parseBooleanAttr(value);\n if (parsed === undefined) {\n throw new BemonyBootstrapError(\n `data-auto-init inválido (recebido: ${value}). Use true/false/1/0.`,\n 'INVALID_ATTRIBUTES'\n );\n }\n return parsed;\n}\n\nfunction assertNoForbiddenAttributes(el: Element): void {\n for (const name of BEMONY_FORBIDDEN_DATA_ATTRIBUTES) {\n if (el.hasAttribute(name)) {\n throw new BemonyBootstrapError(\n `Atributo proibido em script tag: ${name}. Token one-click não pode ir em data-*.`,\n 'FORBIDDEN_ATTRIBUTE'\n );\n }\n }\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-') && attr.name.includes('token')) {\n throw new BemonyBootstrapError(\n `Atributo proibido em script tag: ${attr.name}. Token não permitido em data-*.`,\n 'FORBIDDEN_ATTRIBUTE'\n );\n }\n }\n}\n\nfunction nonEmpty(value: string | null | undefined): string | undefined {\n if (value === null || value === undefined) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readPublicPageFromDataset(\n el: HTMLElement\n): BemonyPublicPageContext | undefined {\n // TODO: parameters pegar do dataset do script\n const pageId = nonEmpty(el.getAttribute('data-page-id'));\n const funnelId = nonEmpty(el.getAttribute('data-funnel-id'));\n const funnelStepId = nonEmpty(el.getAttribute('data-funnel-step-id'));\n const offerId = nonEmpty(el.getAttribute('data-offer-id'));\n const productId = nonEmpty(el.getAttribute('data-product-id'));\n const priceCode = nonEmpty(el.getAttribute('data-price-code'));\n const checkoutId = nonEmpty(el.getAttribute('data-checkout-id'));\n const publicOrderId = nonEmpty(el.getAttribute('data-public-order-id'));\n\n if (\n !pageId &&\n !funnelId &&\n !funnelStepId &&\n !offerId &&\n !productId &&\n !priceCode &&\n !checkoutId &&\n !publicOrderId\n ) {\n return undefined;\n }\n\n return {\n ...(pageId ? { pageId } : {}),\n ...(funnelId ? { funnelId } : {}),\n ...(funnelStepId ? { funnelStepId } : {}),\n ...(offerId ? { offerId } : {}),\n ...(productId ? { productId } : {}),\n ...(priceCode ? { priceCode } : {}),\n ...(checkoutId ? { checkoutId } : {}),\n ...(publicOrderId ? { publicOrderId } : {}),\n };\n}\n\nfunction cloneDefaults(): CreateBemonyPixelOptions {\n return {\n environment: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.environment,\n scenario: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.scenario,\n platform: {\n pixelId: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.pixelId,\n apiEndpoint: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.apiEndpoint,\n namespace: BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.namespace,\n allowedDomains: [\n ...BEMONY_BROWSER_AUTO_INIT_DEFAULTS.platform.allowedDomains,\n ],\n },\n };\n}\n\nfunction mergePlatform(\n base: CreateBemonyPixelOptions['platform'],\n overlay: Partial<BemonyPlatformOptions> | undefined\n): CreateBemonyPixelOptions['platform'] {\n if (!overlay) return { ...base };\n\n const pixelId =\n overlay.pixelId !== undefined && overlay.pixelId.trim() !== ''\n ? overlay.pixelId.trim()\n : base.pixelId;\n const apiEndpoint =\n overlay.apiEndpoint !== undefined\n ? overlay.apiEndpoint.trim() || base.apiEndpoint\n : base.apiEndpoint;\n const namespace =\n overlay.namespace !== undefined\n ? overlay.namespace.trim() || base.namespace\n : base.namespace;\n\n return {\n ...base,\n pixelId,\n ...(apiEndpoint !== undefined ? { apiEndpoint } : {}),\n ...(namespace !== undefined ? { namespace } : {}),\n ...(overlay.debug !== undefined ? { debug: overlay.debug } : {}),\n allowedDomains:\n overlay.allowedDomains !== undefined\n ? (() => {\n const cleaned = overlay.allowedDomains.filter(\n d => d.trim().length > 0\n );\n // Array vazio não apaga defaults obrigatórios\n return cleaned.length > 0 ? cleaned : base.allowedDomains;\n })()\n : base.allowedDomains,\n };\n}\n\nfunction mergePage(\n base: CreateBemonyPixelOptions['page'] | undefined,\n overlay: CreateBemonyPixelOptions['page'] | undefined\n): CreateBemonyPixelOptions['page'] | undefined {\n if (!overlay && !base) return undefined;\n if (!overlay) return base;\n if (!base) return overlay;\n\n const baseNorm =\n base && 'public' in base\n ? base\n : ({ public: base as BemonyPublicPageContext } as NonNullable<\n CreateBemonyPixelOptions['page']\n >);\n const overlayNorm =\n overlay && 'public' in overlay\n ? overlay\n : ({ public: overlay as BemonyPublicPageContext } as NonNullable<\n CreateBemonyPixelOptions['page']\n >);\n\n const basePublic =\n baseNorm && 'public' in baseNorm ? (baseNorm.public ?? {}) : {};\n const overlayPublic =\n overlayNorm && 'public' in overlayNorm ? (overlayNorm.public ?? {}) : {};\n\n return {\n ...baseNorm,\n ...overlayNorm,\n public: {\n ...basePublic,\n ...overlayPublic,\n },\n };\n}\n\nfunction mergeOverrides(\n base: CreateBemonyPixelOptions['overrides'] | undefined,\n overlay: CreateBemonyPixelOptions['overrides'] | undefined\n): CreateBemonyPixelOptions['overrides'] | undefined {\n if (!overlay && !base) return undefined;\n if (!overlay) return base ? { ...base } : undefined;\n if (!base) return { ...overlay };\n\n const apiEndpoint =\n overlay.apiEndpoint !== undefined\n ? overlay.apiEndpoint.trim() || base.apiEndpoint\n : base.apiEndpoint;\n\n return {\n ...base,\n ...overlay,\n ...(apiEndpoint !== undefined ? { apiEndpoint } : {}),\n allowedDomains:\n overlay.allowedDomains !== undefined\n ? overlay.allowedDomains.filter(d => d.trim().length > 0)\n : base.allowedDomains,\n };\n}\n\n/**\n * Merge campo a campo — nunca apaga irmãos de objetos aninhados.\n * Strings vazias não apagam defaults obrigatórios.\n */\nexport function mergeBemonyPixelOptions(\n base: CreateBemonyPixelOptions,\n overlay: Partial<CreateBemonyPixelOptions> | BemonyPixelGlobalConfig\n): CreateBemonyPixelOptions {\n const environment =\n overlay.environment && isEnvironment(overlay.environment)\n ? overlay.environment\n : base.environment;\n const scenario =\n overlay.scenario && isScenario(overlay.scenario)\n ? overlay.scenario\n : base.scenario;\n\n const merged: CreateBemonyPixelOptions = {\n environment,\n scenario,\n platform: mergePlatform(base.platform, overlay.platform),\n };\n\n const page = mergePage(base.page, overlay.page);\n if (page !== undefined) merged.page = page;\n\n const commerce = overlay.commerce ?? base.commerce;\n if (commerce !== undefined) merged.commerce = commerce;\n\n const overrides = mergeOverrides(base.overrides, overlay.overrides);\n if (overrides !== undefined) merged.overrides = overrides;\n\n const autoInitiateCheckout =\n overlay.autoInitiateCheckout ?? base.autoInitiateCheckout;\n if (autoInitiateCheckout !== undefined) {\n merged.autoInitiateCheckout = autoInitiateCheckout;\n }\n\n const noThanksUrl = overlay.noThanksUrl ?? base.noThanksUrl;\n if (noThanksUrl !== undefined && noThanksUrl.trim() !== '') {\n merged.noThanksUrl = noThanksUrl.trim();\n }\n\n if ('createCorePixel' in overlay && overlay.createCorePixel) {\n merged.createCorePixel = overlay.createCorePixel;\n } else if (base.createCorePixel) {\n merged.createCorePixel = base.createCorePixel;\n }\n\n return merged;\n}\n\n/**\n * Lê overrides públicos de um elemento script (campos parciais).\n * Não exige environment/scenario — ausentes usam defaults no merge.\n */\nexport function parseBemonyScriptAttributes(\n el: Element\n): Partial<CreateBemonyPixelOptions> {\n assertNoForbiddenAttributes(el);\n const htmlEl = el as HTMLElement;\n\n const environmentRaw = nonEmpty(htmlEl.getAttribute('data-environment'));\n const scenarioRaw = nonEmpty(htmlEl.getAttribute('data-scenario'));\n\n if (environmentRaw !== undefined && !isEnvironment(environmentRaw)) {\n throw new BemonyBootstrapError(\n `data-environment inválido (recebido: ${environmentRaw}).`,\n 'INVALID_ATTRIBUTES'\n );\n }\n if (scenarioRaw !== undefined && !isScenario(scenarioRaw)) {\n throw new BemonyBootstrapError(\n `data-scenario inválido (recebido: ${scenarioRaw}).`,\n 'INVALID_ATTRIBUTES'\n );\n }\n\n // Funil: data-funnel-id é a chave do pixel na maioria dos casos.\n // Checkout (e overrides): data-pixel-id tem precedência quando presente.\n const pixelId =\n nonEmpty(htmlEl.getAttribute('data-pixel-id')) ??\n nonEmpty(htmlEl.getAttribute('data-funnel-id'));\n const namespace = nonEmpty(htmlEl.getAttribute('data-namespace'));\n const apiEndpoint = nonEmpty(htmlEl.getAttribute('data-api-endpoint'));\n const debug = parseBooleanAttr(htmlEl.getAttribute('data-debug'));\n const allowedDomainsRaw = nonEmpty(\n htmlEl.getAttribute('data-allowed-domains')\n );\n const allowedDomains = allowedDomainsRaw\n ? allowedDomainsRaw\n .split(',')\n .map(d => d.trim())\n .filter(Boolean)\n : undefined;\n\n const pagePublic = readPublicPageFromDataset(htmlEl);\n\n const partial: Partial<CreateBemonyPixelOptions> = {};\n\n if (environmentRaw) partial.environment = environmentRaw;\n if (scenarioRaw) partial.scenario = scenarioRaw;\n\n if (\n pixelId ||\n namespace ||\n apiEndpoint ||\n allowedDomains ||\n debug !== undefined\n ) {\n partial.platform = {\n pixelId: pixelId ?? BEMONY_DEFAULT_PIXEL_ID,\n ...(namespace ? { namespace } : {}),\n ...(apiEndpoint ? { apiEndpoint } : {}),\n ...(allowedDomains ? { allowedDomains } : {}),\n ...(debug !== undefined ? { debug } : {}),\n };\n }\n\n if (pagePublic) {\n partial.page = { public: pagePublic };\n }\n\n if (apiEndpoint || debug !== undefined) {\n partial.overrides = {\n ...(apiEndpoint ? { apiEndpoint } : {}),\n ...(debug !== undefined ? { debug } : {}),\n };\n }\n\n const autoInitiateCheckout = parseBooleanAttr(\n htmlEl.getAttribute('data-auto-initiate-checkout')\n );\n\n if (autoInitiateCheckout !== undefined) {\n partial.autoInitiateCheckout = autoInitiateCheckout;\n }\n\n const noThanksUrl = nonEmpty(htmlEl.getAttribute('data-no-thanks'));\n if (noThanksUrl) {\n partial.noThanksUrl = noThanksUrl;\n }\n\n return partial;\n}\n\nfunction readWindowConfig(): BemonyPixelGlobalConfig | null {\n if (typeof window === 'undefined') {\n return null;\n }\n const config = (\n window as Window & { BemonyPixelConfig?: BemonyPixelGlobalConfig }\n ).BemonyPixelConfig;\n return config && typeof config === 'object' ? config : null;\n}\n\nfunction assertValidWindowConfigPartial(config: BemonyPixelGlobalConfig): void {\n if (config.environment !== undefined && !isEnvironment(config.environment)) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.environment inválido.',\n 'INVALID_CONFIG'\n );\n }\n if (config.scenario !== undefined && !isScenario(config.scenario)) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.scenario inválido.',\n 'INVALID_CONFIG'\n );\n }\n if (\n config.platform?.pixelId !== undefined &&\n config.platform.pixelId.trim() === ''\n ) {\n throw new BemonyBootstrapError(\n 'window.BemonyPixelConfig.platform.pixelId não pode ser vazio.',\n 'INVALID_CONFIG'\n );\n }\n}\n\nexport type ResolveAutoInitConfigResult = {\n options: CreateBemonyPixelOptions;\n source: BemonyConfigSource;\n /** Fontes que participaram do merge (menor → maior prioridade). */\n sources: readonly BemonyConfigSource[];\n script: Element | null;\n};\n\nexport type ResolveAutoInitConfigInput = {\n /** Config explícita (maior precedência). */\n config?: CreateBemonyPixelOptions;\n /** Documento / raiz para buscar scripts (default: document). */\n root?: ParentNode;\n /**\n * Script já resolvido (ex.: pelo entry global).\n * Se omitido, tenta `resolveBemonyExecutingScript`.\n */\n script?: HTMLScriptElement | null;\n /**\n * Quando true, aplica defaults browser mesmo sem fonte.\n * Default: true (auto-init com defaults oficiais).\n */\n applyDefaults?: boolean;\n};\n\n/**\n * Resolve opções com defaults + merge campo a campo.\n *\n * Precedência (menor → maior):\n * 1. BEMONY_BROWSER_AUTO_INIT_DEFAULTS\n * 2. window.BemonyPixelConfig\n * 3. atributos data-* do script executado\n * 4. config explícita\n */\nexport function resolveAutoInitConfig(\n input: ResolveAutoInitConfigInput = {}\n): ResolveAutoInitConfigResult | null {\n const applyDefaults = input.applyDefaults !== false;\n\n if (typeof document === 'undefined' && typeof window === 'undefined') {\n if (input.config && applyDefaults) {\n return {\n options: mergeBemonyPixelOptions(cloneDefaults(), input.config),\n source: 'explicit',\n sources: ['default', 'explicit'],\n script: null,\n };\n }\n if (input.config) {\n return {\n options: input.config,\n source: 'explicit',\n sources: ['explicit'],\n script: null,\n };\n }\n return null;\n }\n\n const sources: BemonyConfigSource[] = [];\n let options = applyDefaults ? cloneDefaults() : null;\n if (applyDefaults) {\n sources.push('default');\n }\n\n const windowConfig = readWindowConfig();\n if (windowConfig) {\n assertValidWindowConfigPartial(windowConfig);\n if (!options) {\n options = cloneDefaults();\n if (!sources.includes('default')) sources.push('default');\n }\n options = mergeBemonyPixelOptions(options, windowConfig);\n sources.push('window-config');\n }\n\n let script: Element | null = input.script ?? null;\n if (script === null && input.script === undefined) {\n const root =\n input.root ?? (typeof document !== 'undefined' ? document : undefined);\n try {\n script = resolveBemonyExecutingScript({\n ...(root ? { root } : {}),\n });\n } catch (error) {\n if (\n error instanceof BemonyBootstrapError &&\n error.code === 'AMBIGUOUS_SCRIPT'\n ) {\n throw error;\n }\n script = null;\n }\n\n // Compat: múltiplos scripts legado com data-auto-init\n if (!script && root) {\n const legacyAuto = Array.from(\n root.querySelectorAll(`${SCRIPT_SELECTOR}[data-auto-init]`)\n );\n if (legacyAuto.length > 1) {\n throw new BemonyBootstrapError(\n `Encontrados ${legacyAuto.length} scripts com data-bemony-pixel + data-auto-init; use apenas um.`,\n 'MULTIPLE_SCRIPTS'\n );\n }\n if (legacyAuto.length === 1) {\n script = legacyAuto[0]!;\n }\n }\n }\n\n if (script) {\n const fromAttrs = parseBemonyScriptAttributes(script);\n if (!options) {\n options = cloneDefaults();\n if (!sources.includes('default')) sources.push('default');\n }\n options = mergeBemonyPixelOptions(options, fromAttrs);\n sources.push('data-attributes');\n }\n\n if (input.config) {\n if (!options) {\n options = { ...input.config };\n sources.push('explicit');\n } else {\n options = mergeBemonyPixelOptions(options, input.config);\n sources.push('explicit');\n }\n }\n\n if (!options) {\n return null;\n }\n\n // Garante pixelId / namespace / endpoint mínimos após merge\n if (!options.platform.pixelId?.trim()) {\n options = mergeBemonyPixelOptions(options, {\n platform: {\n pixelId: BEMONY_DEFAULT_PIXEL_ID,\n namespace: BEMONY_DEFAULT_NAMESPACE,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n },\n });\n }\n if (\n (options.environment === 'staging' ||\n options.environment === 'production') &&\n !options.platform.apiEndpoint?.trim() &&\n !options.overrides?.apiEndpoint?.trim()\n ) {\n options = mergeBemonyPixelOptions(options, {\n platform: {\n pixelId: options.platform.pixelId,\n apiEndpoint: BEMONY_DEFAULT_API_ENDPOINT,\n },\n });\n }\n\n const highest = sources[sources.length - 1] ?? 'default';\n const source: BemonyConfigSource = sources.length > 1 ? 'merged' : highest;\n\n return {\n options,\n source: sources.length === 1 ? highest : source,\n sources,\n script,\n };\n}\n\nexport { SCRIPT_SELECTOR as BEMONY_PIXEL_SCRIPT_SELECTOR };\nexport { BEMONY_DEFAULT_API_ENDPOINT, BEMONY_BROWSER_AUTO_INIT_DEFAULTS };\n","import type { BemonyPixel } from '../BemonyPixel';\nimport type { CreateBemonyPixelOptions } from '../createBemonyPixel';\nimport {\n bootstrapBemonyPixel,\n type BootstrapBemonyPixelOptions,\n} from './bootstrap';\nimport { BemonyBootstrapError } from './errors';\nimport {\n isAutoInitEnabledFromAttr,\n resolveAutoInitConfig,\n type BemonyConfigSource,\n type BemonyPixelGlobalConfig,\n} from './resolveAutoInitConfig';\nimport { resolveBemonyExecutingScript } from './resolveExecutingScript';\n\nexport type InstallBemonyPixelAutoInitOptions = {\n /**\n * Config explícita (maior precedência no merge).\n */\n config?: CreateBemonyPixelOptions;\n root?: ParentNode;\n /**\n * Script já resolvido (entry global). Se omitido, resolve automaticamente.\n */\n script?: HTMLScriptElement | null;\n /**\n * Gate de consentimento. Se retornar `false`, lança CONSENT_DENIED.\n */\n waitForConsent?: () => boolean | Promise<boolean>;\n /**\n * Reinit controlado (HMR).\n */\n force?: boolean;\n /**\n * Se true, não aplica defaults browser e retorna null sem fonte.\n * Default: false — auto-init usa `BEMONY_BROWSER_AUTO_INIT_DEFAULTS`.\n */\n applyDefaults?: boolean;\n /**\n * @deprecated Preferir opt-out via `data-auto-init=\"false\"` no entry global.\n * Mantido por compatibilidade.\n */\n requireDataAutoInit?: boolean;\n};\n\nexport type InstallBemonyPixelAutoInitResult = {\n pixel: BemonyPixel;\n source: BemonyConfigSource;\n};\n\n/**\n * Instalação do auto-init.\n * No entry principal ESM não roda sozinha — só quando chamada (ou via IIFE global).\n */\nexport async function installBemonyPixelAutoInit(\n options: InstallBemonyPixelAutoInitOptions = {}\n): Promise<InstallBemonyPixelAutoInitResult | null> {\n if (typeof window === 'undefined') {\n throw new BemonyBootstrapError(\n 'installBemonyPixelAutoInit só pode ser usado no browser.',\n 'NOT_BROWSER'\n );\n }\n\n const script =\n options.script !== undefined\n ? options.script\n : resolveBemonyExecutingScript({\n ...(options.root ? { root: options.root } : {}),\n });\n\n if (script) {\n const autoInitAttr = script.getAttribute('data-auto-init');\n // Só interpreta opt-out quando o atributo está presente no script resolvido\n // e a chamada não traz config explícita (chamada programática sempre inicia).\n if (\n !options.config &&\n autoInitAttr !== null &&\n !isAutoInitEnabledFromAttr(autoInitAttr)\n ) {\n return null;\n }\n }\n\n const resolved = resolveAutoInitConfig({\n config: options.config,\n root: options.root,\n script,\n applyDefaults: options.applyDefaults,\n });\n\n if (!resolved) {\n return null;\n }\n\n if (\n options.requireDataAutoInit &&\n !options.config &&\n !resolved.sources.includes('data-attributes')\n ) {\n return null;\n }\n\n const bootstrapOptions: BootstrapBemonyPixelOptions = {\n ...resolved.options,\n ...(options.force !== undefined ? { force: options.force } : {}),\n ...(options.waitForConsent\n ? { waitForConsent: options.waitForConsent }\n : {}),\n };\n\n try {\n const pixel = await bootstrapBemonyPixel(bootstrapOptions);\n return { pixel, source: resolved.source };\n } catch (error: unknown) {\n if (error instanceof BemonyBootstrapError) {\n throw error;\n }\n throw new BemonyBootstrapError(\n error instanceof Error ? error.message : 'Auto-init falhou',\n 'AUTO_INIT_FAILED',\n error\n );\n }\n}\n\nexport type { BemonyPixelGlobalConfig, BemonyConfigSource };\n"],"mappings":"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","names":[]}
|