@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,167 @@
1
+ /**
2
+ * Simulação local de one-click checkout Bemony.
3
+ *
4
+ * - scenario: one-click-checkout (sem auto-resolve de contexto)
5
+ * - pagamento real fica no backend/app (sem token no Pixel)
6
+ * - priceCode vem da URL (`/pri*.html`); cfg.priceCode é só fallback
7
+ * - após confirmar → navega para nextHref preservando sid/afid/oid
8
+ *
9
+ * Config via window.__ONE_CLICK_SIM__:
10
+ * {
11
+ * label, offerId, productId, priceCode?, price, currency,
12
+ * productType: 'upsell'|'downsell',
13
+ * funnelStepId, nextHref
14
+ * }
15
+ */
16
+ (function () {
17
+ var cfg = window.__ONE_CLICK_SIM__;
18
+ if (!cfg) {
19
+ console.error('[one-click-sim] window.__ONE_CLICK_SIM__ ausente');
20
+ return;
21
+ }
22
+
23
+ function $(id) {
24
+ return document.getElementById(id);
25
+ }
26
+
27
+ function setStatus(text, ok) {
28
+ var el = $('pixel-status');
29
+ if (!el) return;
30
+ el.textContent = text;
31
+ el.className = 'pill ' + (ok ? 'ok' : text === 'Erro' ? 'bad' : '');
32
+ }
33
+
34
+ /** Espelha extractPriceCodeFromUrl do pacote (pathname /pri*). */
35
+ function priceCodeFromUrl() {
36
+ try {
37
+ var pathname = new URL(window.location.href).pathname.replace(/\\/g, '/');
38
+ var segments = pathname.split('/').filter(Boolean);
39
+ for (var i = segments.length - 1; i >= 0; i--) {
40
+ var bare = segments[i].replace(/\.[a-zA-Z0-9]+$/, '');
41
+ if (/^pri[_a-zA-Z0-9]*\d[_a-zA-Z0-9]*$/i.test(bare)) {
42
+ return bare;
43
+ }
44
+ }
45
+ } catch (_) {
46
+ /* ignore */
47
+ }
48
+ return null;
49
+ }
50
+
51
+ function boot() {
52
+ var sim = window.BemonyFunnelSim;
53
+ if (!sim) {
54
+ console.error('[one-click-sim] carregue funnel-flow.js antes');
55
+ return;
56
+ }
57
+
58
+ var priceCode = priceCodeFromUrl() || cfg.priceCode;
59
+ if (!priceCode) {
60
+ setStatus('Erro', false);
61
+ console.error(
62
+ '[one-click-sim] priceCode ausente na URL (/pri*) e em __ONE_CLICK_SIM__'
63
+ );
64
+ return;
65
+ }
66
+
67
+ var oid = sim.readOid() || sim.ensureOid();
68
+ var api = window.BemonyPixel;
69
+ if (!api || typeof api.createBemonyPixel !== 'function') {
70
+ setStatus('Erro', false);
71
+ console.error('[one-click-sim] createBemonyPixel indisponível');
72
+ return;
73
+ }
74
+
75
+ api
76
+ .createBemonyPixel({
77
+ environment: 'development',
78
+ scenario: 'one-click-checkout',
79
+ platform: {
80
+ pixelId: 'pix_7704308',
81
+ namespace: 'bemony-web',
82
+ allowedDomains: [
83
+ 'localhost',
84
+ '127.0.0.1',
85
+ 'local',
86
+ 'security.bemony.com',
87
+ 'checkout.bemony.com',
88
+ ],
89
+ debug: true,
90
+ },
91
+ page: {
92
+ public: {
93
+ pageId: cfg.label || 'one-click',
94
+ funnelId: 'funnel_1',
95
+ funnelStepId: cfg.funnelStepId,
96
+ offerId: cfg.offerId,
97
+ productId: cfg.productId,
98
+ priceCode: priceCode,
99
+ publicOrderId: oid,
100
+ },
101
+ },
102
+ commerce: {
103
+ currency: cfg.currency || 'USD',
104
+ products: [
105
+ {
106
+ id: cfg.productId,
107
+ name: cfg.offerId,
108
+ type: cfg.productType || 'upsell',
109
+ price: cfg.price,
110
+ currency: cfg.currency || 'USD',
111
+ },
112
+ ],
113
+ },
114
+ autoInitiateCheckout: true,
115
+ })
116
+ .then(function (pixel) {
117
+ setStatus('Pronto', true);
118
+ sim.logPixel(cfg.label || 'one-click', pixel);
119
+ var debug = $('funnel-debug');
120
+ if (debug) {
121
+ debug.textContent = JSON.stringify(
122
+ {
123
+ scenario: pixel.getScenario(),
124
+ sid: pixel.getPublicSessionId(),
125
+ oid: pixel.getPublicOrderId(),
126
+ priceCode: priceCode,
127
+ note: 'priceCode da URL; pagamento no backend; Pixel só tracking',
128
+ },
129
+ null,
130
+ 2
131
+ );
132
+ }
133
+
134
+ var btn = $('confirm');
135
+ if (!btn) return;
136
+ btn.disabled = false;
137
+ btn.addEventListener('click', function () {
138
+ pixel.trackOneClickConfirmation({
139
+ offerId: cfg.offerId,
140
+ productId: cfg.productId,
141
+ priceCode: priceCode,
142
+ price: cfg.price,
143
+ currency: cfg.currency || 'USD',
144
+ });
145
+
146
+ console.log('[one-click-sim] payment intent', {
147
+ publicOrderId: pixel.getPublicOrderId(),
148
+ offerId: cfg.offerId,
149
+ productId: cfg.productId,
150
+ priceCode: priceCode,
151
+ });
152
+
153
+ sim.navigate(cfg.nextHref, { oid: pixel.getPublicOrderId() || oid });
154
+ });
155
+ })
156
+ .catch(function (err) {
157
+ setStatus('Erro', false);
158
+ console.error('[one-click-sim] init failed', err);
159
+ });
160
+ }
161
+
162
+ if (document.readyState === 'loading') {
163
+ document.addEventListener('DOMContentLoaded', boot);
164
+ } else {
165
+ boot();
166
+ }
167
+ })();
@@ -0,0 +1,41 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>Bemony Upsell — priceCode</title>
6
+ </head>
7
+ <body>
8
+ <h1>Upsell</h1>
9
+ <p>Sem resolução de catálogo. priceCode vem da aplicação.</p>
10
+ <button type="button" id="accept">Aceitar</button>
11
+ <button type="button" id="decline">Não, obrigado</button>
12
+ <script type="module">
13
+ import { createBemonyPixel } from '../dist/index.js';
14
+
15
+ const pixel = await createBemonyPixel({
16
+ environment: 'development',
17
+ scenario: 'upsell-offer',
18
+ platform: {
19
+ pixelId: 'pix_demo',
20
+ allowedDomains: ['security.bemony.com'],
21
+ },
22
+ page: {
23
+ public: {
24
+ funnelId: 'funnel_123',
25
+ funnelStepId: 'step_upsell',
26
+ publicOrderId: 'ord_demo',
27
+ },
28
+ },
29
+ });
30
+
31
+ pixel.viewUpsell({ priceCode: 'pri_upsell_123' });
32
+
33
+ document.getElementById('accept').onclick = () => {
34
+ pixel.acceptUpsell({ priceCode: 'pri_upsell_123' });
35
+ };
36
+ document.getElementById('decline').onclick = () => {
37
+ pixel.declineUpsell({ navigateTo: '/thank-you' });
38
+ };
39
+ </script>
40
+ </body>
41
+ </html>
@@ -0,0 +1,96 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Pixel Bemony — B11 URL Context</title>
7
+ <style>
8
+ body {
9
+ font-family: system-ui, sans-serif;
10
+ max-width: 40rem;
11
+ margin: 2rem auto;
12
+ padding: 0 1rem;
13
+ line-height: 1.5;
14
+ }
15
+ a.card {
16
+ display: block;
17
+ margin: 0.75rem 0;
18
+ padding: 0.75rem 1rem;
19
+ background: #111;
20
+ color: #fff;
21
+ text-decoration: none;
22
+ border-radius: 6px;
23
+ }
24
+ a.secondary {
25
+ background: #333;
26
+ }
27
+ code {
28
+ font-size: 0.85em;
29
+ }
30
+ </style>
31
+ </head>
32
+ <body>
33
+ <main>
34
+ <h1>B11 — Continuidade de navegação</h1>
35
+ <p>
36
+ CTAs sem <code>data-*</code>. Decoração por
37
+ <code>allowedDomains</code>. Ofertas
38
+ <code>/pri*</code> disparam ADD_TO_CART.
39
+ </p>
40
+ <p>
41
+ Sirva via HTTP:
42
+ <code>pnpm dlx serve packages/pixel-bemony</code>
43
+ </p>
44
+ <p>
45
+ URL de teste:
46
+ <code
47
+ >?utm_source=facebook&amp;utm_medium=cpc&amp;utm_campaign=b11&amp;fbclid=fb_123&amp;afid=affiliate_123</code
48
+ >
49
+ </p>
50
+
51
+ <a href="https://security.bemony.com/pri6670988" class="card">
52
+ Comprar oferta 1
53
+ </a>
54
+ <a
55
+ href="https://security.bemony.com/pri5529930?variant=main"
56
+ class="card"
57
+ >
58
+ Comprar oferta 2
59
+ </a>
60
+ <a href="https://security.bemony.com/pri1766322#checkout" class="card">
61
+ Comprar oferta 3
62
+ </a>
63
+ <a href="https://security.bemony.com/account" class="card secondary">
64
+ Minha conta (decora, sem ADD_TO_CART)
65
+ </a>
66
+ </main>
67
+
68
+ <script
69
+ src="../dist/browser/pixel-bemony.global.js"
70
+ data-funnel-id="funnel_1"
71
+ data-funnel-step-id="step_1"
72
+ ></script>
73
+
74
+ <script>
75
+ window.BemonyPixel.ready
76
+ .then(function (pixel) {
77
+ if (!pixel) throw new Error('Auto-init não produziu instância.');
78
+ var snap = pixel.getDebugSnapshot();
79
+ console.log('[b11] ready', {
80
+ state: pixel.getState(),
81
+ sid: pixel.getPublicSessionId(),
82
+ url: window.location.href,
83
+ urlContext: snap.urlContext,
84
+ transport: pixel.getConfig().modules.transport.sender.mode,
85
+ endpoint: pixel.getConfig().transport.apiEndpoint,
86
+ allowedDomains:
87
+ pixel.getConfig().modules.core.urlContext.linkDecoration
88
+ .allowedDomains,
89
+ });
90
+ })
91
+ .catch(function (error) {
92
+ console.error('[b11] error', error);
93
+ });
94
+ </script>
95
+ </body>
96
+ </html>
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@beworke/pixel-bemony",
3
+ "version": "0.1.0-rc.1",
4
+ "description": "Camada tipada Bemony sobre @beworke/pixel — cenários de funil, lifecycle e browser bootstrap",
5
+ "main": "./dist/index.cjs.js",
6
+ "module": "./dist/index.esm.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.cjs.js"
13
+ },
14
+ "./browser": {
15
+ "types": "./dist/browser/index.d.ts",
16
+ "import": "./dist/browser/index.esm.js",
17
+ "require": "./dist/browser/index.cjs.js"
18
+ },
19
+ "./global": {
20
+ "default": "./dist/browser/pixel-bemony.global.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "docs",
26
+ "examples",
27
+ "README.md",
28
+ "CHANGELOG.md",
29
+ "RELEASE_CANDIDATE.md"
30
+ ],
31
+ "dependencies": {
32
+ "@beworke/pixel": "0.1.0-rc.7"
33
+ },
34
+ "peerDependencies": {
35
+ "@beworke/pixel": ">=0.1.0-rc.7"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "devDependencies": {
41
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
42
+ "@typescript-eslint/parser": "^8.0.0",
43
+ "eslint": "^8.0.0",
44
+ "eslint-config-prettier": "^9.0.0",
45
+ "eslint-plugin-prettier": "^5.0.0",
46
+ "prettier": "^3.0.0",
47
+ "rimraf": "^6.0.1",
48
+ "tsup": "^8.5.0",
49
+ "typescript": "^5.0.0",
50
+ "vitest": "^4.0.18"
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "test": "vitest run",
55
+ "type-check": "tsc --noEmit",
56
+ "lint": "eslint src tests --ext .ts",
57
+ "clean": "rimraf dist coverage",
58
+ "pack:artifact": "node ../../scripts/pack-pixel-bemony.mjs",
59
+ "validate:rc-package": "node ../../scripts/validate-pixel-bemony-package.mjs",
60
+ "smoke:package": "node ../../scripts/smoke-pixel-bemony-package.mjs",
61
+ "publish:rc": "pnpm publish --access public --tag rc --no-git-checks && npm dist-tag add @beworke/pixel-bemony@$(node -p \"require('./package.json').version\") latest"
62
+ }
63
+ }