@beworke/pixel-bemony 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +176 -0
  3. package/RELEASE_CANDIDATE.md +37 -0
  4. package/dist/browser/index.cjs.js +2598 -0
  5. package/dist/browser/index.cjs.js.map +1 -0
  6. package/dist/browser/index.d.mts +184 -0
  7. package/dist/browser/index.d.ts +184 -0
  8. package/dist/browser/index.esm.js +2557 -0
  9. package/dist/browser/index.esm.js.map +1 -0
  10. package/dist/browser/pixel-bemony.global.js +9848 -0
  11. package/dist/browser/pixel-bemony.global.js.map +1 -0
  12. package/dist/createBemonyPixel-BGRD66p-.d.mts +474 -0
  13. package/dist/createBemonyPixel-BGRD66p-.d.ts +474 -0
  14. package/dist/index.cjs.js +2154 -0
  15. package/dist/index.cjs.js.map +1 -0
  16. package/dist/index.d.mts +320 -0
  17. package/dist/index.d.ts +320 -0
  18. package/dist/index.esm.js +2081 -0
  19. package/dist/index.esm.js.map +1 -0
  20. package/docs/BACKEND_PURCHASE_AND_REDIRECTS.md +125 -0
  21. package/docs/BROWSER_EVENT_ENRICHMENT.md +116 -0
  22. package/docs/SCENARIOS.md +92 -0
  23. package/docs/SECURITY_LIMITATIONS.md +45 -0
  24. package/docs/TEST_MATRIX.md +39 -0
  25. package/docs/TROUBLESHOOTING.md +81 -0
  26. package/examples/README.md +73 -0
  27. package/examples/browser-bootstrap.html +47 -0
  28. package/examples/checkout-price-code.html +37 -0
  29. package/examples/funnel/donsell/downsell_1.html +130 -0
  30. package/examples/funnel/donsell/downsell_2.html +130 -0
  31. package/examples/funnel/donsell/downsell_3.html +130 -0
  32. package/examples/funnel/offer-page.html +105 -0
  33. package/examples/funnel/upsell/upsell_1.html +130 -0
  34. package/examples/funnel/upsell/upsell_2.html +130 -0
  35. package/examples/funnel/upsell/upsell_3.html +139 -0
  36. package/examples/offer-page-price-code.html +22 -0
  37. package/examples/one-click-price-code.html +38 -0
  38. package/examples/security/checkout-sim.css +408 -0
  39. package/examples/security/checkout-sim.js +414 -0
  40. package/examples/security/one-click/pri_downsell_1.html +85 -0
  41. package/examples/security/one-click/pri_downsell_1a.html +85 -0
  42. package/examples/security/one-click/pri_downsell_1b.html +78 -0
  43. package/examples/security/one-click/pri_downsell_2.html +78 -0
  44. package/examples/security/one-click/pri_downsell_2a.html +78 -0
  45. package/examples/security/one-click/pri_downsell_2b.html +78 -0
  46. package/examples/security/one-click/pri_downsell_3.html +78 -0
  47. package/examples/security/one-click/pri_downsell_3a.html +78 -0
  48. package/examples/security/one-click/pri_downsell_3b.html +78 -0
  49. package/examples/security/one-click/pri_upsell_1.html +78 -0
  50. package/examples/security/one-click/pri_upsell_1a.html +78 -0
  51. package/examples/security/one-click/pri_upsell_1b.html +78 -0
  52. package/examples/security/one-click/pri_upsell_2.html +78 -0
  53. package/examples/security/one-click/pri_upsell_2a.html +78 -0
  54. package/examples/security/one-click/pri_upsell_2b.html +78 -0
  55. package/examples/security/one-click/pri_upsell_3.html +78 -0
  56. package/examples/security/one-click/pri_upsell_3a.html +78 -0
  57. package/examples/security/one-click/pri_upsell_3b.html +78 -0
  58. package/examples/security/one-click/pri_upsell_3c.html +78 -0
  59. package/examples/security/pri1766322.html +333 -0
  60. package/examples/security/pri5529930.html +333 -0
  61. package/examples/security/pri6670988.html +334 -0
  62. package/examples/security/thank-you.html +65 -0
  63. package/examples/sim/funnel-flow.js +258 -0
  64. package/examples/sim/one-click-sim.js +167 -0
  65. package/examples/upsell-price-code.html +41 -0
  66. package/examples/url-context-navigation.html +96 -0
  67. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.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/createBemonyPixel.ts","../src/BemonyPixel.ts","../src/domain/BemonyLeadInput.ts","../src/domain/BemonyPaymentMethodInput.ts","../src/domain/resolvePriceCode.ts","../src/navigation/extractPriceCodeFromUrl.ts","../src/scenarios/types.ts","../src/contracts/validateBackendPurchase.ts","../src/domain/BemonyOfferInput.ts"],"sourcesContent":["/**\n * @beworke/pixel-bemony — camada tipada Bemony sobre @beworke/pixel.\n *\n * O Pixel Bemony não consulta catálogo durante a inicialização.\n * Os eventos browser transportam o `priceCode` observado e são enriquecidos\n * pelo backend de ingestão.\n */\n\nexport { createBemonyPixelConfig } from './createBemonyPixelConfig';\nexport type {\n BemonyConfigOverrides,\n CreateBemonyPixelConfigOptions,\n} from './createBemonyPixelConfig';\n\nexport { createBemonyPixel } from './createBemonyPixel';\nexport type {\n BemonyPixelOptions,\n CreateBemonyPixelOptions,\n} from './createBemonyPixel';\n\nexport { BemonyLifecycleError, BemonyPixel } from './BemonyPixel';\nexport type {\n BemonyCorePixel,\n BemonyLifecycleErrorCode,\n BemonyPixelConstructOptions,\n BemonyPixelState,\n} from './BemonyPixel';\nexport { resolvePriceCodeFromAcceptElement } from './BemonyPixel';\n\nexport type { BemonyScenario } from './scenarios/types';\nexport { BEMONY_SCENARIOS } from './scenarios/types';\n\nexport type { OfferPageCartMode } from './scenarios/offer-page';\nexport { applyOfferPageScenario } from './scenarios/offer-page';\n\nexport { applyCheckoutScenario } from './scenarios/checkout';\n\nexport type { BemonyDeclineUpsellOptions } from './domain/BemonyDeclineUpsellOptions';\n\nexport {\n applyUpsellOfferScenario,\n buildUpsellLinkSelector,\n hrefMatchesNoThanksUrl,\n BEMONY_UPSELL_BUY_LINK_SELECTOR,\n BEMONY_UPSELL_LINK_SELECTOR,\n} from './scenarios/upsell-offer';\n\nexport { applyOneClickCheckoutScenario } from './scenarios/one-click-checkout';\n\nexport { applyThankYouScenario } from './scenarios/thank-you';\n\nexport type {\n BemonyBrowserServerDedupePlaceholder,\n BemonyOneClickBackendResultPlaceholder,\n BemonyOneClickIdempotencyKeyPlaceholder,\n BemonyPublicRedirectParams,\n BemonyServerPurchasePayloadPlaceholder,\n} from './contracts/backendPurchase';\n\nexport {\n assertSafePublicRedirectParams,\n buildPublicRedirectQuery,\n validateBemonyServerPurchasePlaceholder,\n} from './contracts/validateBackendPurchase';\n\nexport type { BemonyOneClickConfirmationInput } from './domain/BemonyOneClickInput';\n\nexport type { BemonyOfferInput } from './domain/BemonyOfferInput';\nexport { isCompleteBemonyOffer } from './domain/BemonyOfferInput';\n\nexport type {\n BemonyCommerceIdentityInput,\n ResolvePriceCodeResult,\n} from './domain/resolvePriceCode';\nexport { resolvePriceCode } from './domain/resolvePriceCode';\n\nexport type { BemonyLeadInput } from './domain/BemonyLeadInput';\nexport {\n isValidBemonyLead,\n leadFingerprint,\n sanitizeLeadFields,\n} from './domain/BemonyLeadInput';\n\nexport type {\n BemonyPaymentMethodInput,\n BemonyPaymentMethod,\n} from './domain/BemonyPaymentMethodInput';\nexport {\n BEMONY_PAYMENT_METHODS,\n isValidBemonyPaymentMethod,\n} from './domain/BemonyPaymentMethodInput';\n\nexport type { BemonyCheckoutInput } from './domain/BemonyCheckoutInput';\n\nexport type { BemonyEnvironment } from './platform/environments';\nexport {\n BEMONY_ENVIRONMENTS,\n resolveBemonyEnvironment,\n} from './platform/environments';\n\nexport type { BemonyPlatformOptions } from './platform/defaults';\nexport {\n BEMONY_BROWSER_AUTO_INIT_DEFAULTS,\n BEMONY_DEFAULT_ALLOWED_DOMAINS,\n BEMONY_DEFAULT_API_ENDPOINT,\n BEMONY_DEFAULT_BROWSER_ENVIRONMENT,\n BEMONY_DEFAULT_BROWSER_SCENARIO,\n BEMONY_DEFAULT_NAMESPACE,\n BEMONY_DEFAULT_PIXEL_ID,\n BEMONY_PLATFORM_DEFAULTS,\n BEMONY_STORAGE_PREFIX,\n} from './platform/defaults';\n\nexport type {\n BemonyCommerceInput,\n BemonyPageContextInput,\n BemonyPublicPageContext,\n BemonyValidationErrorCode,\n} from './domain/BemonyPageContext';\nexport {\n BemonyValidationError,\n isBemonyPageContextInput,\n normalizeBemonyPageContextInput,\n} from './domain/BemonyPageContext';\n\nexport { resolveBemonyPageContext } from './domain/resolveBemonyPageContext';\nexport type { ResolveBemonyPageContextSources } from './domain/resolveBemonyPageContext';\n\nexport {\n REQUIRED_PUBLIC_FIELDS,\n validateBemonyPageContext,\n} from './domain/validateBemonyPageContext';\nexport type { ValidateBemonyPageContextOptions } from './domain/validateBemonyPageContext';\n\nexport type { BemonyLinkPolicy } from './navigation/BemonyLinkPolicy';\nexport {\n DEFAULT_BEMONY_LINK_SELECTOR,\n createBemonyLinkPolicy,\n normalizeAllowedDomain,\n normalizeAllowedDomains,\n} from './navigation/BemonyLinkPolicy';\n\nexport {\n BEMONY_AFID_MANAGED_PARAM,\n BEMONY_FORWARD_DENYLIST,\n BEMONY_SID_MANAGED_PARAM,\n configureBemonyLinks,\n} from './navigation/configureBemonyLinks';\nexport type { ConfigureBemonyLinksOptions } from './navigation/configureBemonyLinks';\n\nexport { createBemonyOfferLinkSource } from './navigation/createBemonyOfferLinkSource';\nexport { extractPriceCodeFromUrl } from './navigation/extractPriceCodeFromUrl';\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","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","/**\n * Extrai o priceCode público (`pri*`) do pathname de uma URL.\n *\n * - Usa somente pathname (ignora query e hash)\n * - Suporta barra final\n * - Não faz fetch nem consulta catálogo\n */\nexport function extractPriceCodeFromUrl(url: string | URL): string | null {\n let pathname: string;\n try {\n pathname = typeof url === 'string' ? new URL(url).pathname : url.pathname;\n } catch {\n return null;\n }\n\n const segments = pathname.split('/').filter(segment => segment.length > 0);\n for (let i = segments.length - 1; i >= 0; i -= 1) {\n const segment = segments[i];\n if (!segment) continue;\n // Remove extensão (ex.: pri_123.html em exemplos locais).\n const bare = segment.replace(/\\.[a-zA-Z0-9]+$/, '');\n // pri6670988 | pri_123 | pri_upsell_1 — exige dígito; evita \"privacy\".\n if (/^pri[_a-zA-Z0-9]*\\d[_a-zA-Z0-9]*$/i.test(bare)) {\n return bare;\n }\n }\n return null;\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 { BemonyValidationError } from '../domain/BemonyPageContext';\nimport type {\n BemonyPublicRedirectParams,\n BemonyServerPurchasePayloadPlaceholder,\n} from './backendPurchase';\n\nconst BLOCKED_REDIRECT_KEYS =\n /^(token|one_click_token|oneClickToken|access_token|password|card|cvv|pan)$/i;\n\n/**\n * Valida o formato conceitual do payload de PURCHASE server-side.\n * PLACEHOLDER — não afirma compatibilidade com a API HTTP final.\n */\nexport function validateBemonyServerPurchasePlaceholder(\n payload: unknown\n): BemonyServerPurchasePayloadPlaceholder {\n if (!payload || typeof payload !== 'object') {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field: 'payload',\n message:\n 'Server purchase payload must be an object (placeholder contract).',\n });\n }\n\n const value = payload as Record<string, unknown>;\n\n if (value.type !== 'PURCHASE') {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field: 'type',\n message: 'Placeholder purchase payload requires type \"PURCHASE\".',\n });\n }\n\n if (typeof value.event_id !== 'string' || !value.event_id.trim()) {\n throw new BemonyValidationError({\n code: 'MISSING_REQUIRED_FIELD',\n field: 'event_id',\n message: 'Placeholder purchase payload requires event_id.',\n });\n }\n\n if (typeof value.occurred_at !== 'string' || !value.occurred_at.trim()) {\n throw new BemonyValidationError({\n code: 'MISSING_REQUIRED_FIELD',\n field: 'occurred_at',\n message: 'Placeholder purchase payload requires occurred_at.',\n });\n }\n\n return payload as BemonyServerPurchasePayloadPlaceholder;\n}\n\n/**\n * Garante que params de redirect 302 não incluem segredos.\n */\nexport function assertSafePublicRedirectParams(\n params: BemonyPublicRedirectParams\n): BemonyPublicRedirectParams {\n const attribution = params.attribution\n ? { ...params.attribution }\n : undefined;\n\n if (attribution) {\n for (const key of Object.keys(attribution)) {\n if (BLOCKED_REDIRECT_KEYS.test(key)) {\n throw new BemonyValidationError({\n code: 'INVALID_FIELD',\n field: key,\n message:\n 'Redirect params must not include secrets (token/card/etc.).',\n });\n }\n }\n }\n\n return {\n ...(params.sid !== undefined ? { sid: params.sid } : {}),\n ...(params.public_order_id !== undefined\n ? { public_order_id: params.public_order_id }\n : {}),\n ...(params.funnel_id !== undefined ? { funnel_id: params.funnel_id } : {}),\n ...(params.offer_id !== undefined ? { offer_id: params.offer_id } : {}),\n ...(attribution !== undefined ? { attribution } : {}),\n };\n}\n\n/**\n * Monta query string pública para Location (conceitual).\n * Não inventa host/path — só serializa params já aprovados.\n */\nexport function buildPublicRedirectQuery(\n params: BemonyPublicRedirectParams\n): string {\n const safe = assertSafePublicRedirectParams(params);\n const search = new URLSearchParams();\n if (safe.sid) search.set('sid', safe.sid);\n if (safe.public_order_id) search.set('public_order_id', safe.public_order_id);\n if (safe.funnel_id) search.set('funnel_id', safe.funnel_id);\n if (safe.offer_id) search.set('offer_id', safe.offer_id);\n if (safe.attribution) {\n for (const [key, value] of Object.entries(safe.attribution)) {\n search.set(key, value);\n }\n }\n const query = search.toString();\n return query ? `?${query}` : '';\n}\n","import {\n resolvePriceCode,\n type BemonyCommerceIdentityInput,\n} from './resolvePriceCode';\n\n/**\n * Input mínimo de oferta no browser.\n *\n * Identidade canônica: `priceCode`.\n * Valor/moeda observados são opcionais e não são autoridade financeira.\n * productId/offerId reais NÃO são inventados no browser.\n */\nexport interface BemonyOfferInput extends BemonyCommerceIdentityInput {\n quantity?: number;\n /** Valor observado na UI (opcional; backend valida). */\n observedValue?: number;\n /** Moeda observada na UI (opcional; backend valida). */\n observedCurrency?: string;\n /**\n * @deprecated Preferir observedValue. Mantido para hosts legados.\n */\n price?: number;\n /**\n * @deprecated Preferir observedCurrency.\n */\n currency?: string;\n /**\n * Tipo observado (upsell/downsell) — não resolve catálogo.\n */\n productType?:\n | 'main'\n | 'order_bump'\n | 'upsell'\n | 'downsell'\n | 'cross_sell'\n | 'addon'\n | 'subscription'\n | 'custom'\n | 'other';\n}\n\n/**\n * Oferta completa exige `priceCode` (ou `priceId` legado).\n */\nexport function isCompleteBemonyOffer(\n input: BemonyOfferInput | null | undefined\n): input is BemonyOfferInput {\n return resolvePriceCode(input).priceCode !== null;\n}\n"],"mappings":"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","names":["import_pixel","import_pixel"]}