@gengage/assistant-fe 0.1.9 → 0.2.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 (71) hide show
  1. package/dist/assistant-fe.css +1 -1
  2. package/dist/chat/components/CategoriesContainer.d.ts.map +1 -1
  3. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  4. package/dist/chat/components/renderUISpec.d.ts.map +1 -1
  5. package/dist/chat/index.d.ts.map +1 -1
  6. package/dist/chat/panel-manager.d.ts +16 -0
  7. package/dist/chat/panel-manager.d.ts.map +1 -1
  8. package/dist/chat.cjs +1 -1
  9. package/dist/chat.iife.js +28 -28
  10. package/dist/chat.iife.js.map +1 -1
  11. package/dist/chat.js +2 -2
  12. package/dist/common/action-router.d.ts.map +1 -1
  13. package/dist/common/debug.d.ts.map +1 -1
  14. package/dist/common/events.d.ts.map +1 -1
  15. package/dist/common/native-webview.d.ts.map +1 -1
  16. package/dist/common/product-utils.d.ts +10 -0
  17. package/dist/common/product-utils.d.ts.map +1 -1
  18. package/dist/common/protocol-adapter.d.ts.map +1 -1
  19. package/dist/common.cjs +1 -1
  20. package/dist/common.js +5 -5
  21. package/dist/index-BUtw0Jlm.cjs +2 -0
  22. package/dist/index-BUtw0Jlm.cjs.map +1 -0
  23. package/dist/index-D-tVifN8.cjs +13 -0
  24. package/dist/index-D-tVifN8.cjs.map +1 -0
  25. package/dist/{index-DR2uepzb.js → index-DjPldwe7.js} +181 -187
  26. package/dist/index-DjPldwe7.js.map +1 -0
  27. package/dist/{index-CEt87kCd.js → index-TY0qKDI-.js} +1291 -1292
  28. package/dist/index-TY0qKDI-.js.map +1 -0
  29. package/dist/index.cjs +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/native.cjs +1 -1
  32. package/dist/native.iife.js +30 -30
  33. package/dist/native.iife.js.map +1 -1
  34. package/dist/native.js +1 -1
  35. package/dist/qna.cjs +1 -1
  36. package/dist/qna.iife.js +2 -2
  37. package/dist/qna.iife.js.map +1 -1
  38. package/dist/qna.js +1 -1
  39. package/dist/quantity-stepper-BKtPQUR1.js +78 -0
  40. package/dist/quantity-stepper-BKtPQUR1.js.map +1 -0
  41. package/dist/quantity-stepper-DU6va4sS.cjs +2 -0
  42. package/dist/quantity-stepper-DU6va4sS.cjs.map +1 -0
  43. package/dist/{schemas-DIhL3DkL.js → schemas-BAEbjFPE.js} +17 -12
  44. package/dist/schemas-BAEbjFPE.js.map +1 -0
  45. package/dist/{schemas-Dsr0bbO_.cjs → schemas-DIyHm5pa.cjs} +4 -4
  46. package/dist/{schemas-DIhL3DkL.js.map → schemas-DIyHm5pa.cjs.map} +1 -1
  47. package/dist/simrel/api.d.ts.map +1 -1
  48. package/dist/simrel/components/ProductCard.d.ts.map +1 -1
  49. package/dist/simrel/locales/en.d.ts.map +1 -1
  50. package/dist/simrel/locales/tr.d.ts.map +1 -1
  51. package/dist/simrel/types.d.ts +1 -0
  52. package/dist/simrel/types.d.ts.map +1 -1
  53. package/dist/simrel.cjs +1 -1
  54. package/dist/simrel.cjs.map +1 -1
  55. package/dist/simrel.css +1 -1
  56. package/dist/simrel.iife.js +6 -6
  57. package/dist/simrel.iife.js.map +1 -1
  58. package/dist/simrel.js +236 -234
  59. package/dist/simrel.js.map +1 -1
  60. package/package.json +1 -1
  61. package/dist/index-BWPx4pM7.cjs +0 -13
  62. package/dist/index-BWPx4pM7.cjs.map +0 -1
  63. package/dist/index-CEt87kCd.js.map +0 -1
  64. package/dist/index-DL4CAkyL.cjs +0 -2
  65. package/dist/index-DL4CAkyL.cjs.map +0 -1
  66. package/dist/index-DR2uepzb.js.map +0 -1
  67. package/dist/quantity-stepper-C-nV4lwi.js +0 -77
  68. package/dist/quantity-stepper-C-nV4lwi.js.map +0 -1
  69. package/dist/quantity-stepper-CURMkwRF.cjs +0 -2
  70. package/dist/quantity-stepper-CURMkwRF.cjs.map +0 -1
  71. package/dist/schemas-Dsr0bbO_.cjs.map +0 -1
package/dist/chat.js CHANGED
@@ -1,5 +1,5 @@
1
- import "./schemas-DIhL3DkL.js";
2
- import { G as r, e as c, c as s, a as n, d, b as g } from "./index-CEt87kCd.js";
1
+ import "./schemas-BAEbjFPE.js";
2
+ import { G as r, e as c, c as s, a as n, d, b as g } from "./index-TY0qKDI-.js";
3
3
  export {
4
4
  r as GengageChat,
5
5
  c as chatCatalog,
@@ -1 +1 @@
1
- {"version":3,"file":"action-router.d.ts","sourceRoot":"","sources":["../../src/common/action-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;CACpD;AAID,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAwEN"}
1
+ {"version":3,"file":"action-router.d.ts","sourceRoot":"","sources":["../../src/common/action-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;CACpD;AAID,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAgEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/common/debug.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAShF;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/common/debug.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAMhF;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/common/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI1E;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,CAEpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,gBAAgB,EAC/C,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GAClD,MAAM,IAAI,CAMZ;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AA+BD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA0GxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,IAAI,CAS9C"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/common/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI1E;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,CAEpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,gBAAgB,EAC/C,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GAClD,MAAM,IAAI,CAMZ;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AA8BD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,IAAI,CA0GxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,IAAI,CAS9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"native-webview.d.ts","sourceRoot":"","sources":["../../src/common/native-webview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGpF,eAAO,MAAM,6BAA6B,yQAWhC,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvH,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;IAChD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAAC;IACrD,aAAa,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,GAAG,IAAI,CAAC;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,YAAY,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,wBAAwB,CAAC;IACrC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAgJD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,IAAI,CACX,0BAA0B,EAC1B,gBAAgB,GAAG,sBAAsB,GAAG,0BAA0B,GAAG,KAAK,CAC1E,GACL,uBAAuB,CAUzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAM,GACpD,IAAI,CAqBN;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,mBAAmB,CAsLvG;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA8ElH"}
1
+ {"version":3,"file":"native-webview.d.ts","sourceRoot":"","sources":["../../src/common/native-webview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGpF,eAAO,MAAM,6BAA6B,yQAWhC,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvH,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;IAChD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAAC;IACrD,aAAa,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,GAAG,IAAI,CAAC;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,YAAY,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,wBAAwB,CAAC;IACrC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAwID,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,IAAI,CACX,0BAA0B,EAC1B,gBAAgB,GAAG,sBAAsB,GAAG,0BAA0B,GAAG,KAAK,CAC1E,GACL,uBAAuB,CAUzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAM,GACpD,IAAI,CAqBN;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,mBAAmB,CAsLvG;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA8ElH"}
@@ -16,6 +16,16 @@ export declare function clampDiscount(value: number): number;
16
16
  * @returns A string like "★★★½☆" or "★★★☆☆" (without half-stars).
17
17
  */
18
18
  export declare function renderStarRating(rating: number, halfStars?: boolean): string;
19
+ /**
20
+ * Create a star rating DOM element with proper half-filled star rendering.
21
+ *
22
+ * Uses a CSS-clipped full star overlaid on an empty star for the half-star,
23
+ * giving a visually accurate half-filled appearance instead of the "½" character.
24
+ *
25
+ * @param rating - A numeric rating (will be clamped to 0–5).
26
+ * @returns An HTMLSpanElement containing the star icons.
27
+ */
28
+ export declare function createStarRatingElement(rating: number): HTMLSpanElement;
19
29
  /**
20
30
  * Attach a one-time error handler that hides the image on load failure.
21
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"product-utils.d.ts","sourceRoot":"","sources":["../../src/common/product-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,MAAM,CAUlF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAQhE"}
1
+ {"version":3,"file":"product-utils.d.ts","sourceRoot":"","sources":["../../src/common/product-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,MAAM,CAUlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CA4BvE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAQhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/common/protocol-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/common/protocol-adapter.ts"],"names":[],"mappings":"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"}
package/dist/common.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./schemas-Dsr0bbO_.cjs"),l=require("./index-DL4CAkyL.cjs"),u=require("./index-BWPx4pM7.cjs");require("./qna.cjs");require("./simrel.cjs");const E={enabled:!0,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:0,batchSize:10,flushIntervalMs:250},T={mode:"none",key:"",headerName:"X-API-Key",bodyField:"api_key"};class f{constructor(t){this.queue=[],this.flushTimer=null,this.config={...E,...t,auth:{...T,...t.auth??{}}},this.onPageHideBound=()=>{this.queue.length!==0&&this.flushAllSync()},typeof window<"u"&&window.addEventListener("pagehide",this.onPageHideBound)}track(t){if(!this.config.enabled)return;const n=C(t);if(this.queue.push(n),this.queue.length>=this.config.batchSize){this.scheduleImmediateFlush();return}this.scheduleFlush()}flush(){if(!this.config.enabled||this.queue.length===0)return;const t=this.queue.splice(0,this.config.batchSize),n=this.buildTransportBody(t),o=g(this.config.endpoint,this.config.middlewareUrl);this.send(o,n)}flushAll(){for(;this.queue.length>0;)this.flush()}destroy(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.queue.length>0&&this.flushAllSync(),typeof window<"u"&&window.removeEventListener("pagehide",this.onPageHideBound)}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},this.config.flushIntervalMs))}scheduleImmediateFlush(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.flush()}buildTransportBody(t){const n={events:t};return this.config.auth.mode==="body-api-key"&&this.config.auth.key&&(n[this.config.auth.bodyField]=this.config.auth.key),n}send(t,n){try{const o=JSON.stringify(n);if(this.config.useBeacon&&this.config.auth.mode!=="x-api-key-header"&&this.config.auth.mode!=="bearer-header"&&m()){const r=new Blob([o],{type:"application/json"});navigator.sendBeacon(t,r);return}if(typeof fetch>"u")return;const a={"Content-Type":"application/json"};this.config.auth.mode==="x-api-key-header"&&this.config.auth.key&&(a[this.config.auth.headerName]=this.config.auth.key),this.config.auth.mode==="bearer-header"&&this.config.auth.key&&(a.Authorization=`Bearer ${this.config.auth.key}`),fetch(t,{method:"POST",headers:a,body:o,keepalive:!0}).catch(()=>{})}catch{}}flushAllSync(){if(!this.config.enabled)return;const t=g(this.config.endpoint,this.config.middlewareUrl);for(;this.queue.length>0;){const n=this.queue.splice(0,this.config.batchSize),o=this.buildTransportBody(n);try{const a=JSON.stringify(o);if(m()){const r=new Blob([a],{type:"application/json"});navigator.sendBeacon(t,r)}}catch{}}}}function S(e){return new f(e)}function C(e){const t={event_name:e.event_name,event_version:e.event_version??"1",timestamp_ms:e.timestamp_ms??Date.now(),account_id:e.account_id,session_id:e.session_id,correlation_id:e.correlation_id,payload:e.payload};return e.view_id!==void 0&&(t.view_id=e.view_id),e.user_id!==void 0&&(t.user_id=e.user_id),e.widget!==void 0&&(t.widget=e.widget),e.page_type!==void 0&&(t.page_type=e.page_type),e.sku!==void 0&&(t.sku=e.sku),t}function g(e,t){if(/^https?:\/\//i.test(e))return e;const n=i.normalizeMiddlewareUrl(t),o=e.startsWith("/")?e:`/${e}`;return`${n}${o}`}function m(){return typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}const p={primaryColor:"#000000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontSize:"14px",zIndex:"1000","--glov-chatbot-width":"420px","--glov-left-spacing":"260px","--chatbot-padding":"16px","--root-wrapper-background-color":"#F2F2F2","--root-wrapper-border-color":"#E5E5E5","--gengage-chat-width":"400px","--gengage-chat-shell-radius":"12px","--gengage-chat-header-height":"60px","--gengage-chat-conversation-width":"396px","--gengage-chat-panel-min-width":"320px","--gengage-chat-panel-max-width":"860px","--gengage-chat-input-height":"48px","--gengage-qna-pill-radius":"999px","--gengage-qna-input-radius":"14px","--gengage-simrel-card-radius":"14px"};function b(e){return{...p,...e}}const h="tr";function A(e){return{ACCOUNT_ID:e.accountId,MIDDLEWARE_URL:e.middlewareUrl,LOCALE:e.locale??h}}function k(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},variant:"floating",locale:e.locale??h,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function I(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},pageContext:{pageType:"pdp",sku:e.sku},mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function U(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},sku:e.sku,mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function P(e,t={}){return{enabled:!0,middlewareUrl:e,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,...t}}function _(e){try{return document.querySelector(e),!0}catch{return!1}}function y(e,t){const n=[],o=e.mounts,a=[["qna",o.qna],["simrel",o.simrel],["chat",o.chat]];for(const[s,c]of a)if(c!==void 0){if(!_(c)){n.push({code:"INVALID_SELECTOR",message:`[gengage preflight] ${s} mount selector is invalid CSS: "${c}"`,severity:"error"});continue}document.querySelector(c)||n.push({code:"MOUNT_NOT_FOUND",message:`[gengage preflight] ${s} mount target not found: "${c}" — widget will skip or wait for DOM`,severity:"warn"})}const r=e.gtm.idempotencyKey;if(window[r]!==void 0&&n.push({code:"DUPLICATE_IDEMPOTENCY",message:`[gengage preflight] window["${r}"] already exists — widgets may have already initialized`,severity:"warn"}),!t?.skipCspCheck){let s=!1;const c=d=>{d.blockedURI&&e.middlewareUrl.startsWith(d.blockedURI)&&(s=!0)};document.addEventListener("securitypolicyviolation",c);try{fetch(e.middlewareUrl,{method:"HEAD",mode:"no-cors"}).catch(()=>{})}catch{s=!0}document.removeEventListener("securitypolicyviolation",c),s&&n.push({code:"CSP_BLOCKED",message:`[gengage preflight] middleware URL may be blocked by Content-Security-Policy: "${e.middlewareUrl}". Add it to connect-src.`,severity:"warn"})}for(const s of n)s.severity==="error"?console.error(s.message):console.warn(s.message);return{ok:n.every(s=>s.severity!=="error"),warnings:n}}function x(e){const t=l.safeParseAccountRuntimeConfig(e);if(!t.success){const n=t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`).join("; ");throw new Error(`[gengage] Invalid runtime config: ${n}`)}return t.data}function R(e,t,n){const o={accountId:e.accountId,middlewareUrl:e.middlewareUrl,idempotencyKey:e.gtm.idempotencyKey};return e.locale!==void 0&&(o.locale=e.locale),n!==void 0&&(o.pageContext=n,n.sku!==void 0&&(o.sku=n.sku)),o.chat={enabled:e.widgets.chat.enabled},e.mounts.chat!==void 0&&(o.chat.mountTarget=e.mounts.chat),o.qna={enabled:e.widgets.qna.enabled},e.mounts.qna!==void 0&&(o.qna.mountTarget=e.mounts.qna),o.simrel={enabled:e.widgets.simrel.enabled},e.mounts.simrel!==void 0&&(o.simrel.mountTarget=e.mounts.simrel),t?.onAddToCart!==void 0&&(o.onAddToCart=t.onAddToCart),t?.onProductNavigate!==void 0&&(o.onProductNavigate=t.onProductNavigate),t?.onScriptCall!==void 0&&(o.onScriptCall=t.onScriptCall),o}async function D(e){const t=x(e.runtimeConfig);if(e.preflight!==!1){const r=y(t);if(!r.ok){const s=r.warnings.filter(c=>c.severity==="error");throw new Error(`[gengage] Preflight failed: ${s.map(c=>c.message).join("; ")}`)}}const n=e.contextResolver?.(),o=R(t,e.hostActions,n),a=await l.initOverlayWidgets(o);if(e.contextResolver!==void 0){const r=e.contextResolver,s=()=>{const d=r();a.updateContext(d)};window.addEventListener("gengage:context:update",s);const c=a.destroy.bind(a);a.destroy=()=>{window.removeEventListener("gengage:context:update",s),c()}}return a}const O=[{pageType:"home",urlPatterns:["^/$","^/index\\.html?$","^/anasayfa$"]},{pageType:"search",urlPatterns:["/arama","/search","/ara\\?"],queryParam:"q"},{pageType:"cart",urlPatterns:["/sepet","/cart","/basket","/sepetim"]},{pageType:"plp",urlPatterns:["/kategori/","/category/","/c/","/koleksiyon/","/collection/"]},{pageType:"pdp",urlPatterns:["/urun/","/product/","/p/","/-p-","/-pm-"]}];function v(e,t){const n=t??(typeof window<"u"?new URL(window.location.href):null);if(!n)return"other";const o=e??O,a=n.pathname;for(const r of o)if(!(r.urlPatterns&&!r.urlPatterns.some(c=>{try{return new RegExp(c,"i").test(a)}catch{return!1}}))&&!(r.queryParam&&!n.searchParams.has(r.queryParam))&&!(r.selector&&typeof document<"u"&&!document.querySelector(r.selector)))return r.pageType;return"other"}function w(e){const t=e??(typeof window<"u"?new URL(window.location.href):null);if(!t)return;const n=t.pathname,o=n.match(/\/(?:p|urun|product)\/([^/?#]+)/i);if(o?.[1])return o[1];const a=n.match(/-p-(\d+)/i);if(a?.[1])return a[1]}function L(e){const t=v(e),n={pageType:t};if(t==="pdp"){const o=w();o&&(n.sku=o)}return typeof window<"u"&&(n.url=window.location.href),n}exports.BaseWidget=i.BaseWidget;exports.DEFAULT_WIDGET_THEME_TOKENS=i.DEFAULT_WIDGET_THEME_TOKENS;exports.adaptBackendEvent=i.adaptBackendEvent;exports.basketAddEvent=i.basketAddEvent;exports.bootstrapSession=i.bootstrapSession;exports.buildChatEndpointUrl=i.buildChatEndpointUrl;exports.chatHistorySnapshotEvent=i.chatHistorySnapshotEvent;exports.checkoutCompleteEvent=i.checkoutCompleteEvent;exports.checkoutStartEvent=i.checkoutStartEvent;exports.consumeStream=i.consumeStream;exports.defaultUnknownUISpecRenderer=i.defaultUnknownUISpecRenderer;exports.dismissGlobalErrorToast=i.dismissGlobalErrorToast;exports.dispatch=i.dispatch;exports.getGlobalErrorMessage=i.getGlobalErrorMessage;exports.getWindowPageContext=i.getWindowPageContext;exports.listen=i.listen;exports.llmUsageEvent=i.llmUsageEvent;exports.mergeUISpecRegistry=i.mergeUISpecRegistry;exports.meteringIncrementEvent=i.meteringIncrementEvent;exports.meteringSummaryEvent=i.meteringSummaryEvent;exports.normalizeMiddlewareUrl=i.normalizeMiddlewareUrl;exports.normalizeProductGroupingsResponse=i.normalizeProductGroupingsResponse;exports.normalizeSimilarProductsResponse=i.normalizeSimilarProductsResponse;exports.productToNormalized=i.productToNormalized;exports.registerGlobalErrorToastListener=i.registerGlobalErrorToastListener;exports.renderUISpecWithRegistry=i.renderUISpecWithRegistry;exports.resolveSession=i.resolveSession;exports.sanitizeHtml=i.sanitizeHtml;exports.showGlobalErrorToast=i.showGlobalErrorToast;exports.streamChunkEvent=i.streamChunkEvent;exports.streamDoneEvent=i.streamDoneEvent;exports.streamErrorEvent=i.streamErrorEvent;exports.streamPost=i.streamPost;exports.streamStartEvent=i.streamStartEvent;exports.streamUiSpecEvent=i.streamUiSpecEvent;exports.updatePageContext=i.updatePageContext;exports.widgetHistorySnapshotEvent=i.widgetHistorySnapshotEvent;exports.wireGADataLayer=i.wireGADataLayer;exports.wireQNAToChat=i.wireQNAToChat;exports.wireSimilarToChat=i.wireSimilarToChat;exports.withDefaultWidgetTheme=i.withDefaultWidgetTheme;exports.AccountRuntimeConfigSchema=l.AccountRuntimeConfigSchema;exports.AnalyticsAuthModeSchema=l.AnalyticsAuthModeSchema;exports.UnknownActionPolicySchema=l.UnknownActionPolicySchema;exports.applyNativeSession=l.applyNativeSession;exports.buildOverlayIdempotencyKey=l.buildOverlayIdempotencyKey;exports.createDefaultAccountRuntimeConfig=l.createDefaultAccountRuntimeConfig;exports.createNativeWebViewBridge=l.createNativeWebViewBridge;exports.destroyOverlayWidgets=l.destroyOverlayWidgets;exports.detectNativeEnvironment=l.detectNativeEnvironment;exports.getOverlayWidgets=l.getOverlayWidgets;exports.initNativeOverlayWidgets=l.initNativeOverlayWidgets;exports.initOverlayWidgets=l.initOverlayWidgets;exports.parseAccountRuntimeConfig=l.parseAccountRuntimeConfig;exports.safeParseAccountRuntimeConfig=l.safeParseAccountRuntimeConfig;exports.VoiceInput=u.VoiceInput;exports.isVoiceInputSupported=u.isVoiceInputSupported;exports.routeStreamAction=u.routeStreamAction;exports.AnalyticsClient=f;exports.BASE_WIDGET_THEME=p;exports.DEFAULT_CUSTOMIZATION_LOCALE=h;exports.autoDetectPageContext=L;exports.createAccountIdentity=A;exports.createAnalyticsClient=S;exports.createDefaultAnalyticsConfig=P;exports.createFloatingChatConfig=k;exports.createPdpQnaConfig=I;exports.createPdpSimRelConfig=U;exports.detectPageType=v;exports.extractSkuFromUrl=w;exports.initGengageClient=D;exports.preflightDiagnostics=y;exports.withBaseTheme=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./schemas-DIyHm5pa.cjs"),l=require("./index-BUtw0Jlm.cjs"),u=require("./index-D-tVifN8.cjs");require("./qna.cjs");require("./simrel.cjs");const E={enabled:!0,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:0,batchSize:10,flushIntervalMs:250},T={mode:"none",key:"",headerName:"X-API-Key",bodyField:"api_key"};class f{constructor(t){this.queue=[],this.flushTimer=null,this.config={...E,...t,auth:{...T,...t.auth??{}}},this.onPageHideBound=()=>{this.queue.length!==0&&this.flushAllSync()},typeof window<"u"&&window.addEventListener("pagehide",this.onPageHideBound)}track(t){if(!this.config.enabled)return;const n=C(t);if(this.queue.push(n),this.queue.length>=this.config.batchSize){this.scheduleImmediateFlush();return}this.scheduleFlush()}flush(){if(!this.config.enabled||this.queue.length===0)return;const t=this.queue.splice(0,this.config.batchSize),n=this.buildTransportBody(t),o=g(this.config.endpoint,this.config.middlewareUrl);this.send(o,n)}flushAll(){for(;this.queue.length>0;)this.flush()}destroy(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.queue.length>0&&this.flushAllSync(),typeof window<"u"&&window.removeEventListener("pagehide",this.onPageHideBound)}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},this.config.flushIntervalMs))}scheduleImmediateFlush(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.flush()}buildTransportBody(t){const n={events:t};return this.config.auth.mode==="body-api-key"&&this.config.auth.key&&(n[this.config.auth.bodyField]=this.config.auth.key),n}send(t,n){try{const o=JSON.stringify(n);if(this.config.useBeacon&&this.config.auth.mode!=="x-api-key-header"&&this.config.auth.mode!=="bearer-header"&&m()){const r=new Blob([o],{type:"application/json"});navigator.sendBeacon(t,r);return}if(typeof fetch>"u")return;const a={"Content-Type":"application/json"};this.config.auth.mode==="x-api-key-header"&&this.config.auth.key&&(a[this.config.auth.headerName]=this.config.auth.key),this.config.auth.mode==="bearer-header"&&this.config.auth.key&&(a.Authorization=`Bearer ${this.config.auth.key}`),fetch(t,{method:"POST",headers:a,body:o,keepalive:!0}).catch(()=>{})}catch{}}flushAllSync(){if(!this.config.enabled)return;const t=g(this.config.endpoint,this.config.middlewareUrl);for(;this.queue.length>0;){const n=this.queue.splice(0,this.config.batchSize),o=this.buildTransportBody(n);try{const a=JSON.stringify(o);if(m()){const r=new Blob([a],{type:"application/json"});navigator.sendBeacon(t,r)}}catch{}}}}function S(e){return new f(e)}function C(e){const t={event_name:e.event_name,event_version:e.event_version??"1",timestamp_ms:e.timestamp_ms??Date.now(),account_id:e.account_id,session_id:e.session_id,correlation_id:e.correlation_id,payload:e.payload};return e.view_id!==void 0&&(t.view_id=e.view_id),e.user_id!==void 0&&(t.user_id=e.user_id),e.widget!==void 0&&(t.widget=e.widget),e.page_type!==void 0&&(t.page_type=e.page_type),e.sku!==void 0&&(t.sku=e.sku),t}function g(e,t){if(/^https?:\/\//i.test(e))return e;const n=i.normalizeMiddlewareUrl(t),o=e.startsWith("/")?e:`/${e}`;return`${n}${o}`}function m(){return typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}const p={primaryColor:"#000000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontSize:"14px",zIndex:"1000","--glov-chatbot-width":"420px","--glov-left-spacing":"260px","--chatbot-padding":"16px","--root-wrapper-background-color":"#F2F2F2","--root-wrapper-border-color":"#E5E5E5","--gengage-chat-width":"400px","--gengage-chat-shell-radius":"12px","--gengage-chat-header-height":"60px","--gengage-chat-conversation-width":"396px","--gengage-chat-panel-min-width":"320px","--gengage-chat-panel-max-width":"860px","--gengage-chat-input-height":"48px","--gengage-qna-pill-radius":"999px","--gengage-qna-input-radius":"14px","--gengage-simrel-card-radius":"14px"};function b(e){return{...p,...e}}const h="tr";function A(e){return{ACCOUNT_ID:e.accountId,MIDDLEWARE_URL:e.middlewareUrl,LOCALE:e.locale??h}}function k(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},variant:"floating",locale:e.locale??h,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function I(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},pageContext:{pageType:"pdp",sku:e.sku},mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function U(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},sku:e.sku,mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function P(e,t={}){return{enabled:!0,middlewareUrl:e,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,...t}}function _(e){try{return document.querySelector(e),!0}catch{return!1}}function y(e,t){const n=[],o=e.mounts,a=[["qna",o.qna],["simrel",o.simrel],["chat",o.chat]];for(const[s,c]of a)if(c!==void 0){if(!_(c)){n.push({code:"INVALID_SELECTOR",message:`[gengage preflight] ${s} mount selector is invalid CSS: "${c}"`,severity:"error"});continue}document.querySelector(c)||n.push({code:"MOUNT_NOT_FOUND",message:`[gengage preflight] ${s} mount target not found: "${c}" — widget will skip or wait for DOM`,severity:"warn"})}const r=e.gtm.idempotencyKey;if(window[r]!==void 0&&n.push({code:"DUPLICATE_IDEMPOTENCY",message:`[gengage preflight] window["${r}"] already exists — widgets may have already initialized`,severity:"warn"}),!t?.skipCspCheck){let s=!1;const c=d=>{d.blockedURI&&e.middlewareUrl.startsWith(d.blockedURI)&&(s=!0)};document.addEventListener("securitypolicyviolation",c);try{fetch(e.middlewareUrl,{method:"HEAD",mode:"no-cors"}).catch(()=>{})}catch{s=!0}document.removeEventListener("securitypolicyviolation",c),s&&n.push({code:"CSP_BLOCKED",message:`[gengage preflight] middleware URL may be blocked by Content-Security-Policy: "${e.middlewareUrl}". Add it to connect-src.`,severity:"warn"})}for(const s of n)s.severity==="error"?console.error(s.message):console.warn(s.message);return{ok:n.every(s=>s.severity!=="error"),warnings:n}}function x(e){const t=l.safeParseAccountRuntimeConfig(e);if(!t.success){const n=t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`).join("; ");throw new Error(`[gengage] Invalid runtime config: ${n}`)}return t.data}function R(e,t,n){const o={accountId:e.accountId,middlewareUrl:e.middlewareUrl,idempotencyKey:e.gtm.idempotencyKey};return e.locale!==void 0&&(o.locale=e.locale),n!==void 0&&(o.pageContext=n,n.sku!==void 0&&(o.sku=n.sku)),o.chat={enabled:e.widgets.chat.enabled},e.mounts.chat!==void 0&&(o.chat.mountTarget=e.mounts.chat),o.qna={enabled:e.widgets.qna.enabled},e.mounts.qna!==void 0&&(o.qna.mountTarget=e.mounts.qna),o.simrel={enabled:e.widgets.simrel.enabled},e.mounts.simrel!==void 0&&(o.simrel.mountTarget=e.mounts.simrel),t?.onAddToCart!==void 0&&(o.onAddToCart=t.onAddToCart),t?.onProductNavigate!==void 0&&(o.onProductNavigate=t.onProductNavigate),t?.onScriptCall!==void 0&&(o.onScriptCall=t.onScriptCall),o}async function D(e){const t=x(e.runtimeConfig);if(e.preflight!==!1){const r=y(t);if(!r.ok){const s=r.warnings.filter(c=>c.severity==="error");throw new Error(`[gengage] Preflight failed: ${s.map(c=>c.message).join("; ")}`)}}const n=e.contextResolver?.(),o=R(t,e.hostActions,n),a=await l.initOverlayWidgets(o);if(e.contextResolver!==void 0){const r=e.contextResolver,s=()=>{const d=r();a.updateContext(d)};window.addEventListener("gengage:context:update",s);const c=a.destroy.bind(a);a.destroy=()=>{window.removeEventListener("gengage:context:update",s),c()}}return a}const O=[{pageType:"home",urlPatterns:["^/$","^/index\\.html?$","^/anasayfa$"]},{pageType:"search",urlPatterns:["/arama","/search","/ara\\?"],queryParam:"q"},{pageType:"cart",urlPatterns:["/sepet","/cart","/basket","/sepetim"]},{pageType:"plp",urlPatterns:["/kategori/","/category/","/c/","/koleksiyon/","/collection/"]},{pageType:"pdp",urlPatterns:["/urun/","/product/","/p/","/-p-","/-pm-"]}];function v(e,t){const n=t??(typeof window<"u"?new URL(window.location.href):null);if(!n)return"other";const o=e??O,a=n.pathname;for(const r of o)if(!(r.urlPatterns&&!r.urlPatterns.some(c=>{try{return new RegExp(c,"i").test(a)}catch{return!1}}))&&!(r.queryParam&&!n.searchParams.has(r.queryParam))&&!(r.selector&&typeof document<"u"&&!document.querySelector(r.selector)))return r.pageType;return"other"}function w(e){const t=e??(typeof window<"u"?new URL(window.location.href):null);if(!t)return;const n=t.pathname,o=n.match(/\/(?:p|urun|product)\/([^/?#]+)/i);if(o?.[1])return o[1];const a=n.match(/-p-(\d+)/i);if(a?.[1])return a[1]}function L(e){const t=v(e),n={pageType:t};if(t==="pdp"){const o=w();o&&(n.sku=o)}return typeof window<"u"&&(n.url=window.location.href),n}exports.BaseWidget=i.BaseWidget;exports.DEFAULT_WIDGET_THEME_TOKENS=i.DEFAULT_WIDGET_THEME_TOKENS;exports.adaptBackendEvent=i.adaptBackendEvent;exports.basketAddEvent=i.basketAddEvent;exports.bootstrapSession=i.bootstrapSession;exports.buildChatEndpointUrl=i.buildChatEndpointUrl;exports.chatHistorySnapshotEvent=i.chatHistorySnapshotEvent;exports.checkoutCompleteEvent=i.checkoutCompleteEvent;exports.checkoutStartEvent=i.checkoutStartEvent;exports.consumeStream=i.consumeStream;exports.defaultUnknownUISpecRenderer=i.defaultUnknownUISpecRenderer;exports.dismissGlobalErrorToast=i.dismissGlobalErrorToast;exports.dispatch=i.dispatch;exports.getGlobalErrorMessage=i.getGlobalErrorMessage;exports.getWindowPageContext=i.getWindowPageContext;exports.listen=i.listen;exports.llmUsageEvent=i.llmUsageEvent;exports.mergeUISpecRegistry=i.mergeUISpecRegistry;exports.meteringIncrementEvent=i.meteringIncrementEvent;exports.meteringSummaryEvent=i.meteringSummaryEvent;exports.normalizeMiddlewareUrl=i.normalizeMiddlewareUrl;exports.normalizeProductGroupingsResponse=i.normalizeProductGroupingsResponse;exports.normalizeSimilarProductsResponse=i.normalizeSimilarProductsResponse;exports.productToNormalized=i.productToNormalized;exports.registerGlobalErrorToastListener=i.registerGlobalErrorToastListener;exports.renderUISpecWithRegistry=i.renderUISpecWithRegistry;exports.resolveSession=i.resolveSession;exports.sanitizeHtml=i.sanitizeHtml;exports.showGlobalErrorToast=i.showGlobalErrorToast;exports.streamChunkEvent=i.streamChunkEvent;exports.streamDoneEvent=i.streamDoneEvent;exports.streamErrorEvent=i.streamErrorEvent;exports.streamPost=i.streamPost;exports.streamStartEvent=i.streamStartEvent;exports.streamUiSpecEvent=i.streamUiSpecEvent;exports.updatePageContext=i.updatePageContext;exports.widgetHistorySnapshotEvent=i.widgetHistorySnapshotEvent;exports.wireGADataLayer=i.wireGADataLayer;exports.wireQNAToChat=i.wireQNAToChat;exports.wireSimilarToChat=i.wireSimilarToChat;exports.withDefaultWidgetTheme=i.withDefaultWidgetTheme;exports.AccountRuntimeConfigSchema=l.AccountRuntimeConfigSchema;exports.AnalyticsAuthModeSchema=l.AnalyticsAuthModeSchema;exports.UnknownActionPolicySchema=l.UnknownActionPolicySchema;exports.applyNativeSession=l.applyNativeSession;exports.buildOverlayIdempotencyKey=l.buildOverlayIdempotencyKey;exports.createDefaultAccountRuntimeConfig=l.createDefaultAccountRuntimeConfig;exports.createNativeWebViewBridge=l.createNativeWebViewBridge;exports.destroyOverlayWidgets=l.destroyOverlayWidgets;exports.detectNativeEnvironment=l.detectNativeEnvironment;exports.getOverlayWidgets=l.getOverlayWidgets;exports.initNativeOverlayWidgets=l.initNativeOverlayWidgets;exports.initOverlayWidgets=l.initOverlayWidgets;exports.parseAccountRuntimeConfig=l.parseAccountRuntimeConfig;exports.safeParseAccountRuntimeConfig=l.safeParseAccountRuntimeConfig;exports.VoiceInput=u.VoiceInput;exports.isVoiceInputSupported=u.isVoiceInputSupported;exports.routeStreamAction=u.routeStreamAction;exports.AnalyticsClient=f;exports.BASE_WIDGET_THEME=p;exports.DEFAULT_CUSTOMIZATION_LOCALE=h;exports.autoDetectPageContext=L;exports.createAccountIdentity=A;exports.createAnalyticsClient=S;exports.createDefaultAnalyticsConfig=P;exports.createFloatingChatConfig=k;exports.createPdpQnaConfig=I;exports.createPdpSimRelConfig=U;exports.detectPageType=v;exports.extractSkuFromUrl=w;exports.initGengageClient=D;exports.preflightDiagnostics=y;exports.withBaseTheme=b;
2
2
  //# sourceMappingURL=common.cjs.map
package/dist/common.js CHANGED
@@ -1,8 +1,8 @@
1
- import { a0 as h } from "./schemas-DIhL3DkL.js";
2
- import { B as z, a1 as W, a as H, C as G, a2 as j, b as K, R as V, a3 as Q, a4 as J, c as X, a5 as Y, a6 as Z, j as ee, k as te, a7 as ae, a8 as ne, T as oe, m as ie, Q as se, a9 as re, q as ce, p as de, aa as le, ab as ue, r as he, Z as fe, v as ge, ac as me, X as pe, h as ye, l as ve, ad as we, g as Te, U as be, ae as Ee, w as Se, af as ke, $ as Ce, ag as Ie, ah as Ue } from "./schemas-DIhL3DkL.js";
3
- import { i as f, s as g } from "./index-DR2uepzb.js";
4
- import { A as _e, a as xe, U as Pe, b as Le, c as Re, d as qe, e as De, f as Be, g as Oe, h as Fe, j as Ne, p as Me } from "./index-DR2uepzb.js";
5
- import { V as ze, i as We, r as He } from "./index-CEt87kCd.js";
1
+ import { a0 as h } from "./schemas-BAEbjFPE.js";
2
+ import { B as z, a1 as W, a as H, C as G, a2 as j, b as K, R as V, a3 as Q, a4 as J, c as X, a5 as Y, a6 as Z, j as ee, k as te, a7 as ae, a8 as ne, T as oe, m as ie, Q as se, a9 as re, q as ce, p as de, aa as le, ab as ue, r as he, Z as fe, v as ge, ac as me, X as pe, h as ye, l as ve, ad as we, g as Te, U as be, ae as Ee, w as Se, af as ke, $ as Ce, ag as Ie, ah as Ue } from "./schemas-BAEbjFPE.js";
3
+ import { i as f, s as g } from "./index-DjPldwe7.js";
4
+ import { A as _e, a as xe, U as Pe, b as Le, c as Re, d as qe, e as De, f as Be, g as Oe, h as Fe, j as Ne, p as Me } from "./index-DjPldwe7.js";
5
+ import { V as ze, i as We, r as He } from "./index-TY0qKDI-.js";
6
6
  import "./qna.js";
7
7
  import "./simrel.js";
8
8
  const m = {
@@ -0,0 +1,2 @@
1
+ "use strict";const V=require("./index-D-tVifN8.cjs"),K=require("./qna.cjs"),$=require("./simrel.cjs"),s=require("./schemas-DIyHm5pa.cjs"),b=s.object({enabled:s.boolean().default(!0)}),G=s.object({chat:s.string().optional(),qna:s.string().optional(),simrel:s.string().optional()}),Y=s.object({}),k=s._enum(["none","x-api-key-header","bearer-header","body-api-key"]),J=s.object({mode:k.default("none"),key:s.string().optional(),headerName:s.string().optional(),bodyField:s.string().default("api_key")}),X=s.object({enabled:s.boolean().default(!0),endpoint:s.string().default("/analytics"),auth:J.default({mode:"none",bodyField:"api_key"}),fireAndForget:s.boolean().default(!0),useBeacon:s.boolean().default(!0),keepaliveFetch:s.boolean().default(!0),timeoutMs:s.number().int().positive().default(4e3),maxRetries:s.number().int().min(0).max(5).default(1)}),E="__gengageWidgetsInit",z=s.object({idempotencyKey:s.string().default(E),requireDomReady:s.boolean().default(!0)}),R=s._enum(["log-and-ignore","throw","delegate"]),Z=s.object({unknownActionPolicy:R.default("log-and-ignore"),allowScriptCall:s.boolean().default(!1)}),N=s.object({version:s.literal("1",{error:'version must be "1"'}),accountId:s.string({error:"accountId must be a non-empty string"}).min(1,{error:"accountId must be a non-empty string"}),middlewareUrl:s.string({error:'middlewareUrl must be a valid URL (e.g. "https://your-backend.example.com")'}).url({error:'middlewareUrl must be a valid URL (e.g. "https://your-backend.example.com")'}),locale:s.string().optional(),widgets:s.object({chat:b.default({enabled:!0}),qna:b.default({enabled:!0}),simrel:b.default({enabled:!0})}),mounts:G.default({}),transport:Y.default({}),analytics:X.default({enabled:!0,endpoint:"/analytics",auth:{mode:"none",bodyField:"api_key"},fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:1}),gtm:z.default({idempotencyKey:"__gengageWidgetsInit",requireDomReady:!0}),actionHandling:Z.default({unknownActionPolicy:"log-and-ignore",allowScriptCall:!1})});function U(n){s.debugLog("config","parsing account runtime config",n);const e=N.parse(n);return s.debugLog("config","config resolved",{accountId:e.accountId,middlewareUrl:e.middlewareUrl}),e}function ee(n){return N.safeParse(n)}function te(n){return U({version:"1",accountId:n.accountId,middlewareUrl:n.middlewareUrl,locale:n.locale,widgets:{chat:{enabled:!0},qna:{enabled:!0},simrel:{enabled:!0}}})}const x=`${E}_overlay_`,ne="#gengage-qna",ie="#gengage-simrel";function T(){const n=window;return n.__gengageOverlayRegistry||(n.__gengageOverlayRegistry={instances:{},pending:{}}),n.__gengageOverlayRegistry}function se(n){const e={pageType:n.pageContext?.pageType??(n.sku!==void 0?"pdp":"other")},t=n.pageContext;return t?.sku!==void 0&&(e.sku=t.sku),t?.price!==void 0&&(e.price=t.price),t?.categoryTree!==void 0&&(e.categoryTree=t.categoryTree),t?.url!==void 0&&(e.url=t.url),t?.extra!==void 0&&(e.extra=t.extra),n.sku!==void 0&&(e.sku=n.sku),e}function oe(n,e){const t={...n,...e,pageType:e.pageType??n.pageType};return e.sku===void 0&&n.sku!==void 0&&(t.sku=n.sku),t}function q(n){return n instanceof HTMLElement||document.querySelector(n)?n:null}function P(n){return n.idempotencyKey??`${x}${n.accountId}`}class ae{constructor(e,t){this.options=e,this.onDestroy=t,this._chat=null,this._qna=null,this._simrel=null,this._analyticsClient=null,this._offQnaWire=null,this._destroyed=!1,this._queue=Promise.resolve(),this._warnedQnaMountMissing=!1,this._warnedSimRelMountMissing=!1,this.idempotencyKey=P(e),this.session=s.resolveSession(e.session),this._pageContext=se(e)}get chat(){return this._chat}get qna(){return this._qna}get simrel(){return this._simrel}get analyticsClient(){return this._analyticsClient}async init(){window.gengage||(window.gengage={}),window.gengage.sessionId=this.session.sessionId,window.gengage.pageContext=this._pageContext,await this._initChat(),this.options.wireQnaToChat!==!1&&(this._offQnaWire=s.wireQNAToChat()),await this._syncPdpWidgets(),window.gengage.overlay=this}openChat(e){this._chat?.open(e)}closeChat(){this._chat?.close()}async updateContext(e){this._destroyed||await this._enqueue(async()=>{this._pageContext=oe(this._pageContext,e),window.gengage||(window.gengage={}),window.gengage.pageContext=this._pageContext,this._chat?.update(e),this._qna?.update(e),this._simrel?.update(e),await this._syncPdpWidgets()})}async updateSku(e,t="pdp"){await this.updateContext({sku:e,pageType:t})}destroy(){this._destroyed||(this._destroyed=!0,this._offQnaWire?.(),this._offQnaWire=null,this._chat?.destroy(),this._qna?.destroy(),this._simrel?.destroy(),this._chat=null,this._qna=null,this._simrel=null,window.gengage?.overlay===this&&delete window.gengage.overlay,this.onDestroy())}async _initChat(){if(this.options.chat?.enabled===!1)return;const e=this.options.middlewareUrl,t={accountId:this.options.accountId,middlewareUrl:e,session:this.session,pageContext:this._pageContext,variant:this.options.chat?.variant??"floating"};this.options.theme!==void 0&&(t.theme=this.options.theme),this.options.locale!==void 0&&(t.locale=this.options.locale),this.options.pricing!==void 0&&(t.pricing=this.options.pricing),this.options.chat?.mountTarget!==void 0&&(t.mountTarget=this.options.chat.mountTarget),this.options.chat?.launcherSvg!==void 0&&(t.launcherSvg=this.options.chat.launcherSvg),this.options.chat?.headerTitle!==void 0&&(t.headerTitle=this.options.chat.headerTitle),this.options.chat?.headerAvatarUrl!==void 0&&(t.headerAvatarUrl=this.options.chat.headerAvatarUrl),this.options.chat?.headerBadge!==void 0&&(t.headerBadge=this.options.chat.headerBadge),this.options.chat?.headerCartUrl!==void 0&&(t.headerCartUrl=this.options.chat.headerCartUrl),this.options.chat?.headerFavoritesToggle!==void 0&&(t.headerFavoritesToggle=this.options.chat.headerFavoritesToggle),this.options.chat?.hideMobileLauncher!==void 0&&(t.hideMobileLauncher=this.options.chat.hideMobileLauncher),this.options.chat?.mobileBreakpoint!==void 0&&(t.mobileBreakpoint=this.options.chat.mobileBreakpoint),this.options.chat?.mobileInitialState!==void 0&&(t.mobileInitialState=this.options.chat.mobileInitialState),this.options.chat?.i18n!==void 0&&(t.i18n=this.options.chat.i18n),this.options.chat?.actionHandling!==void 0&&(t.actionHandling=this.options.chat.actionHandling),this.options.onScriptCall!==void 0&&(t.onScriptCall=this.options.onScriptCall),this._chat=new V.GengageChat,await this._chat.init(t)}async _syncPdpWidgets(){if(this._destroyed)return;const e=this._pageContext.sku;if(!(this._pageContext.pageType==="pdp"&&e!==void 0&&e.length>0)){this._destroyPdpWidgets();return}const r=this.options.middlewareUrl;if(this.options.qna?.enabled!==!1){const o=this.options.qna?.mountTarget??ne,i=q(o);if(i)if(this._warnedQnaMountMissing=!1,this._qna)this._qna.show(),this._qna.update({pageType:"pdp",sku:e});else{const h=new K.GengageQNA,a={accountId:this.options.accountId,middlewareUrl:r,session:this.session,pageContext:{pageType:"pdp",sku:e},mountTarget:i};this.options.theme!==void 0&&(a.theme=this.options.theme),this.options.qna?.ctaText!==void 0&&(a.ctaText=this.options.qna.ctaText),this.options.qna?.inputPlaceholder!==void 0&&(a.inputPlaceholder=this.options.qna.inputPlaceholder),await h.init(a),this._qna=h}else this._qna?.destroy(),this._qna=null,this._warnedQnaMountMissing||(console.warn(`[gengage] QNA mount target not found: ${o}`),this._warnedQnaMountMissing=!0)}else this._qna?.destroy(),this._qna=null;if(this.options.simrel?.enabled!==!1){const o=this.options.simrel?.mountTarget??ie,i=q(o);if(i)if(this._warnedSimRelMountMissing=!1,this._simrel)this._simrel.show(),this._simrel.update({pageType:"pdp",sku:e});else{const h=new $.GengageSimRel,a={accountId:this.options.accountId,middlewareUrl:r,session:this.session,sku:e,mountTarget:i};this.options.theme!==void 0&&(a.theme=this.options.theme),this.options.pricing!==void 0&&(a.pricing=this.options.pricing),this.options.simrel?.discountType!==void 0&&(a.discountType=this.options.simrel.discountType),this.options.onAddToCart!==void 0&&(a.onAddToCart=this.options.onAddToCart),this.options.onProductNavigate!==void 0?a.onProductNavigate=this.options.onProductNavigate:a.onProductNavigate=(d,l,p)=>{s.isSafeUrl(d)&&(this._chat?.saveSession(p??this.session.sessionId,l),window.location.href=d)},await h.init(a),this._simrel=h}else this._simrel?.destroy(),this._simrel=null,this._warnedSimRelMountMissing||(console.warn(`[gengage] SimRel mount target not found: ${o}`),this._warnedSimRelMountMissing=!0)}else this._simrel?.destroy(),this._simrel=null}_destroyPdpWidgets(){this._qna?.destroy(),this._simrel?.destroy(),this._qna=null,this._simrel=null}_enqueue(e){const t=this._queue.then(e);return this._queue=t.catch(r=>{}),t}}async function W(n){const e=P(n),t=T(),r=t.instances[e];if(r)return r;const o=t.pending[e];if(o)return o;const i=new ae(n,()=>{const a=T();delete a.instances[e],delete a.pending[e]}),h=i.init().then(()=>(t.instances[e]=i,delete t.pending[e],i)).catch(a=>{throw delete t.pending[e],a});return t.pending[e]=h,h}function O(n){return T().instances[n]??null}function re(n){O(n)?.destroy()}function de(n){return`${x}${n}`}const L=["gengage:chat:open","gengage:chat:close","gengage:chat:ready","gengage:chat:add-to-cart","gengage:qna:action","gengage:qna:open-chat","gengage:similar:product-click","gengage:similar:add-to-cart","gengage:global:error","gengage:context:update"],ce=32,S="#gengage-qna",M="#gengage-simrel";function le(n){let e=n;if(typeof n=="string"){const i=n.trim();if(i.length===0)return null;if(!i.startsWith("{")&&!i.startsWith("["))return{type:i};try{e=JSON.parse(i)}catch{return null}}if(!e||typeof e!="object")return null;const t=e,r=[t.type,t.command,t.action,t.event].find(i=>typeof i=="string"&&i.length>0);if(!r)return null;let o=t.payload;if(o===void 0&&"data"in t&&(o=t.data),r==="setSession"&&o===void 0){const i={};typeof t.sessionId=="string"&&(i.sessionId=t.sessionId),typeof t.userId=="string"&&(i.userId=t.userId),(i.sessionId!==void 0||i.userId!==void 0)&&(o=i)}return o===void 0?{type:r}:{type:r,payload:o}}function ge(n){if(typeof n=="string"&&n.length>0)return{sku:n};if(n&&typeof n=="object"&&"sku"in n){const e=n.sku;if(typeof e=="string"&&e.length>0){const t=n.pageType;return t!==void 0?{sku:e,pageType:t}:{sku:e}}}return null}function C(n,e){return e instanceof HTMLElement?!0:typeof e!="string"?!1:n.document.querySelector(e)!==null}function A(n,e,t){if(e instanceof HTMLElement||C(n,e)||typeof e!="string")return e;if(e.startsWith("#")){const i=e.slice(1);if(i.length>0){const h=n.document.getElementById(i);if(h)return h;const a=n.document.createElement("div");return a.id=i,n.document.body.appendChild(a),a}}const r=n.document.getElementById(t);if(r)return r;const o=n.document.createElement("div");return o.id=t,n.document.body.appendChild(o),o}function B(n,e){const t=n.webkit?.messageHandlers?.[e];return t&&typeof t.postMessage=="function"?t.postMessage.bind(t):null}function v(n,e){const t=n[e];return t&&typeof t=="object"&&typeof t.postMessage=="function"?t:null}function D(n={}){const e=n.win??window,t=n.iosHandlerName??"gengage",r=n.androidInterfaceName??"GengageNative",o=n.reactNativeInterfaceName??"ReactNativeWebView";return B(e,t)?"ios":v(e,r)?"android":v(e,o)?"react-native":"browser"}function F(n,e={}){const t=e.win??window;if(n.sessionId!==void 0){t.__gengageSessionId=n.sessionId,t.gengage||(t.gengage={}),t.gengage.sessionId=n.sessionId;try{t.sessionStorage.setItem("gengage_session_id",n.sessionId)}catch{}}if(n.userId!==void 0){t.gengage||(t.gengage={});const r=t.gengage,o=r.session??{};o.userId=n.userId,r.session=o}}function j(n={}){const e=n.win??window,t=e;if(t.gengageNative)return t.gengageNative;const r=n.iosHandlerName??"gengage",o=n.androidInterfaceName??"GengageNative",i=n.reactNativeInterfaceName??"ReactNativeWebView",h=n.trackedEvents??[...L],a=D({win:e,iosHandlerName:r,androidInterfaceName:o,reactNativeInterfaceName:i});let d=e.gengage?.overlay??null;const l=[],p=(g,c)=>{const f=c===void 0?{type:g}:{type:g,payload:c};if(a==="ios"){B(e,r)?.(f);return}if(a==="android"){v(e,o)?.postMessage(JSON.stringify(f));return}if(a==="react-native"){v(e,i)?.postMessage(JSON.stringify(f));return}},m=g=>{const c=g.detail;!c||typeof c.namespace!="string"||typeof c.type!="string"||p("bridge_message",{namespace:c.namespace,type:c.type,payload:c.payload})};e.addEventListener("gengage:bridge:message",m);const Q=h.map(g=>{const c=f=>{const u=f.detail;p("widget_event",{event:g,detail:u})};return e.addEventListener(g,c),{event:g,handler:c}}),y=g=>{l.length>=ce&&l.shift(),l.push(g)},H=()=>{if(!d||l.length===0)return;const g=l.splice(0,l.length);for(const c of g)I(c)},I=g=>{const c=le(g);if(!c||typeof c.type!="string"){console.warn("[gengage:native-bridge] Invalid message:",g);return}const f=c.type,u=c.payload;switch(f){case"openChat":{d?d.openChat(u&&typeof u=="object"?u:u==="half"||u==="full"?{state:u}:void 0):y(c);return}case"closeChat":{d?d.closeChat():y(c);return}case"updateContext":{d&&u&&typeof u=="object"?d.updateContext(u):d?console.warn("[gengage:native-bridge] updateContext: missing payload"):y(c);return}case"updateSku":{const w=ge(u);if(d&&w){d.updateSku(w.sku,w.pageType);return}d?console.warn("[gengage:native-bridge] updateSku: missing sku"):y(c);return}case"setSession":{u&&typeof u=="object"&&F(u,{win:e});return}case"destroy":{d?.destroy();return}default:e.postMessage({gengage:"native",type:f,payload:u},e.location.origin),n.logUnhandled&&console.warn("[gengage:native-bridge] Unhandled inbound type forwarded:",f)}},_={env:a,sendToNative:p,receive:I,setController(g){d=g,H()},destroy(){e.removeEventListener("gengage:bridge:message",m);for(const g of Q)e.removeEventListener(g.event,g.handler);l.splice(0,l.length),e.gengageNative===_&&delete e.gengageNative}};return t.gengageNative=_,_}async function ue(n){const{nativeBridge:e,emitReadyEvent:t=!0,...r}=n,o=j(e),i={...r};i.onAddToCart||(i.onAddToCart=l=>{o.sendToNative("addToCart",{sku:l.sku,quantity:l.quantity,cartCode:l.cartCode})}),i.onProductNavigate||(i.onProductNavigate=(l,p,m)=>{o.sendToNative("productNavigate",{url:l,sku:p,sessionId:m})});const h=i.qna?.enabled===!0||i.qna?.mountTarget!==void 0;if(i.qna?.enabled!==!1)if(h){const l=A(window,i.qna?.mountTarget??S,"gengage-qna");i.qna={...i.qna,enabled:!0,mountTarget:l}}else C(window,S)||(i.qna={enabled:!1});const a=i.simrel?.enabled===!0||i.simrel?.mountTarget!==void 0;if(i.simrel?.enabled!==!1)if(a){const l=A(window,i.simrel?.mountTarget??M,"gengage-simrel");i.simrel={...i.simrel,enabled:!0,mountTarget:l}}else C(window,M)||(i.simrel={enabled:!1});const d=await W(i);return o.setController(d),t&&o.sendToNative("ready",{sessionId:d.session.sessionId,widgets:{chat:d.chat!==null,qna:d.qna!==null,simrel:d.simrel!==null}}),{controller:d,bridge:o,destroy(){d.destroy(),o.destroy()}}}exports.AccountRuntimeConfigSchema=N;exports.AnalyticsAuthModeSchema=k;exports.DEFAULT_NATIVE_TRACKED_EVENTS=L;exports.UnknownActionPolicySchema=R;exports.applyNativeSession=F;exports.buildOverlayIdempotencyKey=de;exports.createDefaultAccountRuntimeConfig=te;exports.createNativeWebViewBridge=j;exports.destroyOverlayWidgets=re;exports.detectNativeEnvironment=D;exports.getOverlayWidgets=O;exports.initNativeOverlayWidgets=ue;exports.initOverlayWidgets=W;exports.parseAccountRuntimeConfig=U;exports.safeParseAccountRuntimeConfig=ee;
2
+ //# sourceMappingURL=index-BUtw0Jlm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BUtw0Jlm.cjs","sources":["../src/common/config-schema.ts","../src/common/overlay.ts","../src/common/native-webview.ts"],"sourcesContent":["import { z } from 'zod';\nimport { debugLog } from './debug.js';\n\nconst WidgetToggleSchema = z.object({\n enabled: z.boolean().default(true),\n});\n\nconst MountSelectorsSchema = z.object({\n chat: z.string().optional(),\n qna: z.string().optional(),\n simrel: z.string().optional(),\n});\n\nconst TransportSchema = z.object({});\n\nexport const AnalyticsAuthModeSchema = z.enum(['none', 'x-api-key-header', 'bearer-header', 'body-api-key']);\n\nconst AnalyticsAuthSchema = z.object({\n mode: AnalyticsAuthModeSchema.default('none'),\n key: z.string().optional(),\n headerName: z.string().optional(),\n bodyField: z.string().default('api_key'),\n});\n\nconst AnalyticsSchema = z.object({\n enabled: z.boolean().default(true),\n endpoint: z.string().default('/analytics'),\n auth: AnalyticsAuthSchema.default({ mode: 'none', bodyField: 'api_key' }),\n fireAndForget: z.boolean().default(true),\n useBeacon: z.boolean().default(true),\n keepaliveFetch: z.boolean().default(true),\n timeoutMs: z.number().int().positive().default(4000),\n maxRetries: z.number().int().min(0).max(5).default(1),\n});\n\nexport const DEFAULT_IDEMPOTENCY_KEY = '__gengageWidgetsInit';\n\nconst GTMSchema = z.object({\n idempotencyKey: z.string().default(DEFAULT_IDEMPOTENCY_KEY),\n requireDomReady: z.boolean().default(true),\n});\n\nexport const UnknownActionPolicySchema = z.enum(['log-and-ignore', 'throw', 'delegate']);\n\nconst ActionHandlingSchema = z.object({\n unknownActionPolicy: UnknownActionPolicySchema.default('log-and-ignore'),\n allowScriptCall: z.boolean().default(false),\n});\n\nexport const AccountRuntimeConfigSchema = z.object({\n version: z.literal('1', { error: 'version must be \"1\"' }),\n accountId: z\n .string({ error: 'accountId must be a non-empty string' })\n .min(1, { error: 'accountId must be a non-empty string' }),\n middlewareUrl: z\n .string({ error: 'middlewareUrl must be a valid URL (e.g. \"https://your-backend.example.com\")' })\n .url({ error: 'middlewareUrl must be a valid URL (e.g. \"https://your-backend.example.com\")' }),\n locale: z.string().optional(),\n widgets: z.object({\n chat: WidgetToggleSchema.default({ enabled: true }),\n qna: WidgetToggleSchema.default({ enabled: true }),\n simrel: WidgetToggleSchema.default({ enabled: true }),\n }),\n mounts: MountSelectorsSchema.default({}),\n transport: TransportSchema.default({}),\n analytics: AnalyticsSchema.default({\n enabled: true,\n endpoint: '/analytics',\n auth: { mode: 'none', bodyField: 'api_key' },\n fireAndForget: true,\n useBeacon: true,\n keepaliveFetch: true,\n timeoutMs: 4000,\n maxRetries: 1,\n }),\n gtm: GTMSchema.default({\n idempotencyKey: '__gengageWidgetsInit',\n requireDomReady: true,\n }),\n actionHandling: ActionHandlingSchema.default({\n unknownActionPolicy: 'log-and-ignore',\n allowScriptCall: false,\n }),\n});\n\nexport type AccountRuntimeConfig = z.infer<typeof AccountRuntimeConfigSchema>;\nexport type AnalyticsAuthMode = z.infer<typeof AnalyticsAuthModeSchema>;\nexport type UnknownActionPolicy = z.infer<typeof UnknownActionPolicySchema>;\n\nexport function parseAccountRuntimeConfig(input: unknown): AccountRuntimeConfig {\n debugLog('config', 'parsing account runtime config', input);\n const result = AccountRuntimeConfigSchema.parse(input);\n debugLog('config', 'config resolved', { accountId: result.accountId, middlewareUrl: result.middlewareUrl });\n return result;\n}\n\nexport function safeParseAccountRuntimeConfig(input: unknown): ReturnType<typeof AccountRuntimeConfigSchema.safeParse> {\n return AccountRuntimeConfigSchema.safeParse(input);\n}\n\nexport function createDefaultAccountRuntimeConfig(params: {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n}): AccountRuntimeConfig {\n return parseAccountRuntimeConfig({\n version: '1',\n accountId: params.accountId,\n middlewareUrl: params.middlewareUrl,\n locale: params.locale,\n widgets: {\n chat: { enabled: true },\n qna: { enabled: true },\n simrel: { enabled: true },\n },\n });\n}\n","import { GengageChat } from '../chat/index.js';\nimport type { ChatI18n, ChatWidgetConfig } from '../chat/types.js';\nimport { GengageQNA } from '../qna/index.js';\nimport type { QNAWidgetConfig } from '../qna/types.js';\nimport { GengageSimRel } from '../simrel/index.js';\nimport type { SimRelWidgetConfig } from '../simrel/types.js';\nimport { DEFAULT_IDEMPOTENCY_KEY } from './config-schema.js';\nimport { resolveSession } from './context.js';\nimport { wireQNAToChat } from './events.js';\nimport { isSafeUrl } from './safe-html.js';\nimport type { PageContext, SessionContext, WidgetTheme } from './types.js';\n\nconst DEFAULT_OVERLAY_KEY_PREFIX = `${DEFAULT_IDEMPOTENCY_KEY}_overlay_`;\nconst DEFAULT_QNA_MOUNT = '#gengage-qna';\nconst DEFAULT_SIMREL_MOUNT = '#gengage-simrel';\n\ninterface OverlayRegistryState {\n instances: Record<string, OverlayWidgetsRuntime>;\n pending: Record<string, Promise<OverlayWidgetsRuntime>>;\n}\n\ninterface WindowWithOverlayRegistry extends Window {\n __gengageOverlayRegistry?: OverlayRegistryState;\n}\n\nfunction getOverlayRegistry(): OverlayRegistryState {\n const win = window as WindowWithOverlayRegistry;\n if (!win.__gengageOverlayRegistry) {\n win.__gengageOverlayRegistry = {\n instances: {},\n pending: {},\n };\n }\n return win.__gengageOverlayRegistry;\n}\n\nfunction buildInitialPageContext(options: OverlayWidgetsOptions): PageContext {\n const base: PageContext = {\n pageType: options.pageContext?.pageType ?? (options.sku !== undefined ? 'pdp' : 'other'),\n };\n\n const incoming = options.pageContext;\n if (incoming?.sku !== undefined) base.sku = incoming.sku;\n if (incoming?.price !== undefined) base.price = incoming.price;\n if (incoming?.categoryTree !== undefined) base.categoryTree = incoming.categoryTree;\n if (incoming?.url !== undefined) base.url = incoming.url;\n if (incoming?.extra !== undefined) base.extra = incoming.extra;\n\n if (options.sku !== undefined) {\n base.sku = options.sku;\n }\n\n return base;\n}\n\nfunction mergePageContext(current: PageContext, patch: Partial<PageContext>): PageContext {\n const next: PageContext = {\n ...current,\n ...patch,\n pageType: patch.pageType ?? current.pageType,\n };\n if (patch.sku === undefined && current.sku !== undefined) {\n next.sku = current.sku;\n }\n return next;\n}\n\nfunction resolveMountTarget(target: HTMLElement | string): HTMLElement | string | null {\n if (target instanceof HTMLElement) return target;\n if (document.querySelector(target)) return target;\n return null;\n}\n\nfunction buildOverlayKey(options: OverlayWidgetsOptions): string {\n return options.idempotencyKey ?? `${DEFAULT_OVERLAY_KEY_PREFIX}${options.accountId}`;\n}\n\nexport interface OverlayChatOptions {\n enabled?: boolean;\n variant?: ChatWidgetConfig['variant'];\n mountTarget?: HTMLElement | string;\n launcherSvg?: string;\n headerTitle?: string;\n headerAvatarUrl?: string;\n headerBadge?: string;\n headerCartUrl?: string;\n headerFavoritesToggle?: boolean;\n hideMobileLauncher?: boolean;\n mobileBreakpoint?: number;\n mobileInitialState?: 'half' | 'full';\n i18n?: Partial<ChatI18n>;\n actionHandling?: ChatWidgetConfig['actionHandling'];\n}\n\nexport interface OverlayQNAOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n ctaText?: string;\n inputPlaceholder?: QNAWidgetConfig['inputPlaceholder'];\n}\n\nexport interface OverlaySimRelOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n discountType?: SimRelWidgetConfig['discountType'];\n}\n\nexport interface OverlayWidgetsOptions {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n session?: Partial<SessionContext>;\n pageContext?: Partial<PageContext>;\n sku?: string;\n theme?: WidgetTheme;\n /** Price formatting options. Defaults to Turkish locale. */\n pricing?: import('./price-formatter.js').PriceFormatConfig;\n idempotencyKey?: string;\n wireQnaToChat?: boolean;\n chat?: OverlayChatOptions;\n qna?: OverlayQNAOptions;\n simrel?: OverlaySimRelOptions;\n onAddToCart?: SimRelWidgetConfig['onAddToCart'];\n onProductNavigate?: SimRelWidgetConfig['onProductNavigate'];\n onScriptCall?: ChatWidgetConfig['onScriptCall'];\n}\n\nexport interface OverlayWidgetsController {\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n readonly chat: GengageChat | null;\n readonly qna: GengageQNA | null;\n readonly simrel: GengageSimRel | null;\n /** Shared analytics client for custom event tracking (null if not configured). */\n readonly analyticsClient: import('./analytics.js').AnalyticsClient | null;\n openChat(options?: { state?: 'half' | 'full' }): void;\n closeChat(): void;\n updateContext(patch: Partial<PageContext>): Promise<void>;\n updateSku(sku: string, pageType?: PageContext['pageType']): Promise<void>;\n destroy(): void;\n}\n\nclass OverlayWidgetsRuntime implements OverlayWidgetsController {\n private _chat: GengageChat | null = null;\n private _qna: GengageQNA | null = null;\n private _simrel: GengageSimRel | null = null;\n private _analyticsClient: import('./analytics.js').AnalyticsClient | null = null;\n private _offQnaWire: (() => void) | null = null;\n private _pageContext: PageContext;\n private _destroyed = false;\n private _queue: Promise<void> = Promise.resolve();\n private _warnedQnaMountMissing = false;\n private _warnedSimRelMountMissing = false;\n\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n\n constructor(\n private readonly options: OverlayWidgetsOptions,\n private readonly onDestroy: () => void,\n ) {\n this.idempotencyKey = buildOverlayKey(options);\n this.session = resolveSession(options.session);\n this._pageContext = buildInitialPageContext(options);\n }\n\n get chat(): GengageChat | null {\n return this._chat;\n }\n\n get qna(): GengageQNA | null {\n return this._qna;\n }\n\n get simrel(): GengageSimRel | null {\n return this._simrel;\n }\n\n get analyticsClient(): import('./analytics.js').AnalyticsClient | null {\n return this._analyticsClient;\n }\n\n async init(): Promise<void> {\n if (!window.gengage) window.gengage = {};\n window.gengage.sessionId = this.session.sessionId;\n window.gengage.pageContext = this._pageContext;\n\n await this._initChat();\n\n if (this.options.wireQnaToChat !== false) {\n this._offQnaWire = wireQNAToChat();\n }\n\n await this._syncPdpWidgets();\n\n window.gengage.overlay = this;\n }\n\n openChat(options?: { state?: 'half' | 'full' }): void {\n this._chat?.open(options);\n }\n\n closeChat(): void {\n this._chat?.close();\n }\n\n async updateContext(patch: Partial<PageContext>): Promise<void> {\n if (this._destroyed) return;\n await this._enqueue(async () => {\n this._pageContext = mergePageContext(this._pageContext, patch);\n\n if (!window.gengage) window.gengage = {};\n window.gengage.pageContext = this._pageContext;\n\n this._chat?.update(patch);\n this._qna?.update(patch);\n this._simrel?.update(patch);\n await this._syncPdpWidgets();\n });\n }\n\n async updateSku(sku: string, pageType: PageContext['pageType'] = 'pdp'): Promise<void> {\n await this.updateContext({ sku, pageType });\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n\n this._offQnaWire?.();\n this._offQnaWire = null;\n\n this._chat?.destroy();\n this._qna?.destroy();\n this._simrel?.destroy();\n\n this._chat = null;\n this._qna = null;\n this._simrel = null;\n\n if (window.gengage?.overlay === this) {\n delete window.gengage.overlay;\n }\n\n this.onDestroy();\n }\n\n private async _initChat(): Promise<void> {\n if (this.options.chat?.enabled === false) return;\n\n const middlewareUrl = this.options.middlewareUrl;\n\n const config: ChatWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: this._pageContext,\n variant: this.options.chat?.variant ?? 'floating',\n };\n\n if (this.options.theme !== undefined) config.theme = this.options.theme;\n if (this.options.locale !== undefined) config.locale = this.options.locale;\n if (this.options.pricing !== undefined) config.pricing = this.options.pricing;\n if (this.options.chat?.mountTarget !== undefined) config.mountTarget = this.options.chat.mountTarget;\n if (this.options.chat?.launcherSvg !== undefined) config.launcherSvg = this.options.chat.launcherSvg;\n if (this.options.chat?.headerTitle !== undefined) config.headerTitle = this.options.chat.headerTitle;\n if (this.options.chat?.headerAvatarUrl !== undefined) {\n config.headerAvatarUrl = this.options.chat.headerAvatarUrl;\n }\n if (this.options.chat?.headerBadge !== undefined) config.headerBadge = this.options.chat.headerBadge;\n if (this.options.chat?.headerCartUrl !== undefined) config.headerCartUrl = this.options.chat.headerCartUrl;\n if (this.options.chat?.headerFavoritesToggle !== undefined) {\n config.headerFavoritesToggle = this.options.chat.headerFavoritesToggle;\n }\n if (this.options.chat?.hideMobileLauncher !== undefined) {\n config.hideMobileLauncher = this.options.chat.hideMobileLauncher;\n }\n if (this.options.chat?.mobileBreakpoint !== undefined) {\n config.mobileBreakpoint = this.options.chat.mobileBreakpoint;\n }\n if (this.options.chat?.mobileInitialState !== undefined) {\n config.mobileInitialState = this.options.chat.mobileInitialState;\n }\n if (this.options.chat?.i18n !== undefined) config.i18n = this.options.chat.i18n;\n if (this.options.chat?.actionHandling !== undefined) {\n config.actionHandling = this.options.chat.actionHandling;\n }\n if (this.options.onScriptCall !== undefined) {\n config.onScriptCall = this.options.onScriptCall;\n }\n\n this._chat = new GengageChat();\n await this._chat.init(config);\n }\n\n private async _syncPdpWidgets(): Promise<void> {\n if (this._destroyed) return;\n const sku = this._pageContext.sku;\n const isPdp = this._pageContext.pageType === 'pdp' && sku !== undefined && sku.length > 0;\n\n if (!isPdp) {\n this._destroyPdpWidgets();\n return;\n }\n\n const middlewareUrl = this.options.middlewareUrl;\n\n if (this.options.qna?.enabled !== false) {\n const qnaTarget = this.options.qna?.mountTarget ?? DEFAULT_QNA_MOUNT;\n const mountTarget = resolveMountTarget(qnaTarget);\n\n if (mountTarget) {\n this._warnedQnaMountMissing = false;\n if (!this._qna) {\n const qna = new GengageQNA();\n const qnaConfig: QNAWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: {\n pageType: 'pdp',\n sku,\n },\n mountTarget,\n };\n if (this.options.theme !== undefined) qnaConfig.theme = this.options.theme;\n if (this.options.qna?.ctaText !== undefined) qnaConfig.ctaText = this.options.qna.ctaText;\n if (this.options.qna?.inputPlaceholder !== undefined) {\n qnaConfig.inputPlaceholder = this.options.qna.inputPlaceholder;\n }\n await qna.init(qnaConfig);\n this._qna = qna;\n } else {\n this._qna.show();\n this._qna.update({ pageType: 'pdp', sku });\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n if (!this._warnedQnaMountMissing) {\n console.warn(`[gengage] QNA mount target not found: ${qnaTarget}`);\n this._warnedQnaMountMissing = true;\n }\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n }\n\n if (this.options.simrel?.enabled !== false) {\n const simRelTarget = this.options.simrel?.mountTarget ?? DEFAULT_SIMREL_MOUNT;\n const mountTarget = resolveMountTarget(simRelTarget);\n\n if (mountTarget) {\n this._warnedSimRelMountMissing = false;\n if (!this._simrel) {\n const simrel = new GengageSimRel();\n const simRelConfig: SimRelWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n sku,\n mountTarget,\n };\n if (this.options.theme !== undefined) simRelConfig.theme = this.options.theme;\n if (this.options.pricing !== undefined) simRelConfig.pricing = this.options.pricing;\n if (this.options.simrel?.discountType !== undefined) {\n simRelConfig.discountType = this.options.simrel.discountType;\n }\n if (this.options.onAddToCart !== undefined) {\n simRelConfig.onAddToCart = this.options.onAddToCart;\n }\n if (this.options.onProductNavigate !== undefined) {\n simRelConfig.onProductNavigate = this.options.onProductNavigate;\n } else {\n simRelConfig.onProductNavigate = (url, productSku, sessionId) => {\n if (!isSafeUrl(url)) return;\n this._chat?.saveSession(sessionId ?? this.session.sessionId, productSku);\n window.location.href = url;\n };\n }\n await simrel.init(simRelConfig);\n this._simrel = simrel;\n } else {\n this._simrel.show();\n this._simrel.update({ pageType: 'pdp', sku });\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n if (!this._warnedSimRelMountMissing) {\n console.warn(`[gengage] SimRel mount target not found: ${simRelTarget}`);\n this._warnedSimRelMountMissing = true;\n }\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n }\n }\n\n private _destroyPdpWidgets(): void {\n this._qna?.destroy();\n this._simrel?.destroy();\n this._qna = null;\n this._simrel = null;\n }\n\n private _enqueue(fn: () => Promise<void>): Promise<void> {\n const next = this._queue.then(fn);\n this._queue = next.catch((err) => {\n if (import.meta.env?.DEV) {\n console.error('[gengage:overlay] Queued operation failed:', err);\n }\n });\n return next;\n }\n}\n\n/**\n * Initialize all three widgets (chat, QNA, SimRel) in a single call.\n * Idempotent — safe to call multiple times from GTM; deduplicates by account + SKU key.\n *\n * @example\n * ```ts\n * import { initOverlayWidgets } from '@gengage/assistant-fe';\n *\n * const controller = await initOverlayWidgets({\n * accountId: 'mystore',\n * middlewareUrl: 'https://chat.gengage.ai',\n * sku: window.productSku,\n * pageContext: { pageType: 'pdp' },\n * chat: { variant: 'floating' },\n * qna: { mountTarget: '#qna-section' },\n * simrel: { mountTarget: '#similar-products' },\n * });\n * ```\n */\nexport async function initOverlayWidgets(options: OverlayWidgetsOptions): Promise<OverlayWidgetsController> {\n const key = buildOverlayKey(options);\n const registry = getOverlayRegistry();\n\n const existing = registry.instances[key];\n if (existing) return existing;\n\n const pending = registry.pending[key];\n if (pending) return pending;\n\n const runtime = new OverlayWidgetsRuntime(options, () => {\n const liveRegistry = getOverlayRegistry();\n delete liveRegistry.instances[key];\n delete liveRegistry.pending[key];\n });\n\n const runtimeInit = runtime\n .init()\n .then(() => {\n registry.instances[key] = runtime;\n delete registry.pending[key];\n return runtime;\n })\n .catch((err) => {\n delete registry.pending[key];\n throw err;\n });\n\n registry.pending[key] = runtimeInit;\n return runtimeInit;\n}\n\nexport function getOverlayWidgets(idempotencyKey: string): OverlayWidgetsController | null {\n const registry = getOverlayRegistry();\n return registry.instances[idempotencyKey] ?? null;\n}\n\nexport function destroyOverlayWidgets(idempotencyKey: string): void {\n const controller = getOverlayWidgets(idempotencyKey);\n controller?.destroy();\n}\n\nexport function buildOverlayIdempotencyKey(accountId: string): string {\n return `${DEFAULT_OVERLAY_KEY_PREFIX}${accountId}`;\n}\n","import { initOverlayWidgets } from './overlay.js';\nimport type { OverlayWidgetsController, OverlayWidgetsOptions } from './overlay.js';\nimport type { PageContext } from './types.js';\n\nexport const DEFAULT_NATIVE_TRACKED_EVENTS = [\n 'gengage:chat:open',\n 'gengage:chat:close',\n 'gengage:chat:ready',\n 'gengage:chat:add-to-cart',\n 'gengage:qna:action',\n 'gengage:qna:open-chat',\n 'gengage:similar:product-click',\n 'gengage:similar:add-to-cart',\n 'gengage:global:error',\n 'gengage:context:update',\n] as const;\n\nexport type NativeTrackedEvent = (typeof DEFAULT_NATIVE_TRACKED_EVENTS)[number];\nexport type NativeInboundMessage = 'openChat' | 'closeChat' | 'updateContext' | 'updateSku' | 'setSession' | 'destroy';\n\nexport type NativeBridgeEnvironment = 'ios' | 'android' | 'react-native' | 'browser';\n\nexport interface NativeSessionPayload {\n sessionId?: string;\n userId?: string;\n}\n\nexport interface NativeBridgeMessage {\n type: string;\n payload?: unknown;\n}\n\nexport interface NativeWebViewBridgeOptions {\n iosHandlerName?: string;\n androidInterfaceName?: string;\n reactNativeInterfaceName?: string;\n trackedEvents?: NativeTrackedEvent[] | string[];\n /** Log unhandled inbound message types to console in addition to forwarding to postMessage. */\n logUnhandled?: boolean;\n /** Injected for tests; defaults to global window. */\n win?: Window;\n}\n\nexport interface NativeWebViewBridge {\n readonly env: NativeBridgeEnvironment;\n sendToNative(type: string, payload?: unknown): void;\n receive(message: NativeBridgeMessage | string): void;\n setController(controller: OverlayWidgetsController | null): void;\n destroy(): void;\n}\n\nexport interface NativeOverlayInitOptions extends OverlayWidgetsOptions {\n nativeBridge?: Omit<NativeWebViewBridgeOptions, 'win'>;\n emitReadyEvent?: boolean;\n}\n\nexport interface NativeOverlayInitResult {\n controller: OverlayWidgetsController;\n bridge: NativeWebViewBridge;\n destroy(): void;\n}\n\nconst MAX_QUEUED_NATIVE_COMMANDS = 32;\nconst DEFAULT_NATIVE_QNA_MOUNT = '#gengage-qna';\nconst DEFAULT_NATIVE_SIMREL_MOUNT = '#gengage-simrel';\n\ninterface NativeWindow extends Window {\n webkit?: {\n messageHandlers?: Record<string, { postMessage?: (message: unknown) => void }>;\n };\n GengageNative?: {\n postMessage?: (message: string) => void;\n };\n ReactNativeWebView?: {\n postMessage?: (message: string) => void;\n };\n gengageNative?: NativeWebViewBridge;\n}\n\nfunction toNativeWindow(win: Window): NativeWindow {\n return win as NativeWindow;\n}\n\nfunction parseNativeBridgeMessage(raw: NativeBridgeMessage | string): NativeBridgeMessage | null {\n let candidate: unknown = raw;\n\n if (typeof raw === 'string') {\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n\n // Allow plain command strings such as \"openChat\" from native evaluateJavaScript calls.\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return { type: trimmed };\n }\n\n try {\n candidate = JSON.parse(trimmed);\n } catch {\n return null;\n }\n }\n\n if (!candidate || typeof candidate !== 'object') return null;\n const obj = candidate as Record<string, unknown>;\n\n const typeCandidate = [obj['type'], obj['command'], obj['action'], obj['event']].find(\n (value): value is string => typeof value === 'string' && value.length > 0,\n );\n if (!typeCandidate) return null;\n\n let payload = obj['payload'];\n if (payload === undefined && 'data' in obj) payload = obj['data'];\n\n // Common native shorthand:\n // { type: \"setSession\", sessionId: \"...\", userId: \"...\" }\n if (typeCandidate === 'setSession' && payload === undefined) {\n const sessionPayload: NativeSessionPayload = {};\n if (typeof obj['sessionId'] === 'string') sessionPayload.sessionId = obj['sessionId'];\n if (typeof obj['userId'] === 'string') sessionPayload.userId = obj['userId'];\n if (sessionPayload.sessionId !== undefined || sessionPayload.userId !== undefined) {\n payload = sessionPayload;\n }\n }\n\n return payload === undefined ? { type: typeCandidate } : { type: typeCandidate, payload };\n}\n\nfunction parseUpdateSkuPayload(payload: unknown): { sku: string; pageType?: PageContext['pageType'] } | null {\n if (typeof payload === 'string' && payload.length > 0) {\n return { sku: payload };\n }\n if (payload && typeof payload === 'object' && 'sku' in payload) {\n const sku = (payload as { sku?: unknown }).sku;\n if (typeof sku === 'string' && sku.length > 0) {\n const pageType = (payload as { pageType?: PageContext['pageType'] }).pageType;\n return pageType !== undefined ? { sku, pageType } : { sku };\n }\n }\n return null;\n}\n\nfunction hasMountTarget(win: Window, target: HTMLElement | string): boolean {\n if (target instanceof HTMLElement) return true;\n if (typeof target !== 'string') return false;\n return win.document.querySelector(target) !== null;\n}\n\nfunction ensureMountTarget(\n win: Window,\n preferredTarget: HTMLElement | string,\n fallbackId: string,\n): HTMLElement | string {\n if (preferredTarget instanceof HTMLElement) return preferredTarget;\n if (hasMountTarget(win, preferredTarget)) return preferredTarget;\n if (typeof preferredTarget !== 'string') return preferredTarget;\n\n // If target is a simple #id selector, create that mount.\n if (preferredTarget.startsWith('#')) {\n const id = preferredTarget.slice(1);\n if (id.length > 0) {\n const existing = win.document.getElementById(id);\n if (existing) return existing;\n const mount = win.document.createElement('div');\n mount.id = id;\n win.document.body.appendChild(mount);\n return mount;\n }\n }\n\n const fallback = win.document.getElementById(fallbackId);\n if (fallback) return fallback;\n const mount = win.document.createElement('div');\n mount.id = fallbackId;\n win.document.body.appendChild(mount);\n return mount;\n}\n\nfunction getIosPostMessage(win: Window, handlerName: string): ((message: unknown) => void) | null {\n const handler = toNativeWindow(win).webkit?.messageHandlers?.[handlerName];\n if (handler && typeof handler.postMessage === 'function') {\n return handler.postMessage.bind(handler);\n }\n return null;\n}\n\nfunction getNamedBridge(win: Window, interfaceName: string): { postMessage: (message: string) => void } | null {\n const candidate = (win as Window & Record<string, unknown>)[interfaceName];\n if (candidate && typeof candidate === 'object') {\n const postMessage = (candidate as { postMessage?: unknown }).postMessage;\n if (typeof postMessage === 'function') {\n return candidate as { postMessage: (message: string) => void };\n }\n }\n return null;\n}\n\nexport function detectNativeEnvironment(\n options: Pick<\n NativeWebViewBridgeOptions,\n 'iosHandlerName' | 'androidInterfaceName' | 'reactNativeInterfaceName' | 'win'\n > = {},\n): NativeBridgeEnvironment {\n const win = options.win ?? window;\n const iosHandlerName = options.iosHandlerName ?? 'gengage';\n const androidInterfaceName = options.androidInterfaceName ?? 'GengageNative';\n const reactNativeInterfaceName = options.reactNativeInterfaceName ?? 'ReactNativeWebView';\n\n if (getIosPostMessage(win, iosHandlerName)) return 'ios';\n if (getNamedBridge(win, androidInterfaceName)) return 'android';\n if (getNamedBridge(win, reactNativeInterfaceName)) return 'react-native';\n return 'browser';\n}\n\n/**\n * Applies native-provided session identity so widgets can share correlation IDs\n * with the host app. Safe to call before or after widget initialization.\n */\nexport function applyNativeSession(\n payload: NativeSessionPayload,\n options: Pick<NativeWebViewBridgeOptions, 'win'> = {},\n): void {\n const win = options.win ?? window;\n\n if (payload.sessionId !== undefined) {\n win.__gengageSessionId = payload.sessionId;\n if (!win.gengage) win.gengage = {};\n win.gengage.sessionId = payload.sessionId;\n try {\n win.sessionStorage.setItem('gengage_session_id', payload.sessionId);\n } catch {\n // sessionStorage can be unavailable in restricted WebView modes.\n }\n }\n\n if (payload.userId !== undefined) {\n if (!win.gengage) win.gengage = {};\n const bag = win.gengage as unknown as Record<string, unknown>;\n const session = (bag['session'] as Record<string, unknown> | undefined) ?? {};\n session['userId'] = payload.userId;\n bag['session'] = session;\n }\n}\n\n/**\n * Installs a native WebView bridge compatible with:\n * - iOS WKWebView (`webkit.messageHandlers`)\n * - Android JavascriptInterface (`window.GengageNative`)\n * - React Native WebView (`window.ReactNativeWebView`)\n * and exposes it on `window.gengageNative`.\n */\nexport function createNativeWebViewBridge(options: NativeWebViewBridgeOptions = {}): NativeWebViewBridge {\n const win = options.win ?? window;\n const nativeWin = toNativeWindow(win);\n if (nativeWin.gengageNative) return nativeWin.gengageNative;\n\n const iosHandlerName = options.iosHandlerName ?? 'gengage';\n const androidInterfaceName = options.androidInterfaceName ?? 'GengageNative';\n const reactNativeInterfaceName = options.reactNativeInterfaceName ?? 'ReactNativeWebView';\n const trackedEvents = options.trackedEvents ?? [...DEFAULT_NATIVE_TRACKED_EVENTS];\n const env = detectNativeEnvironment({ win, iosHandlerName, androidInterfaceName, reactNativeInterfaceName });\n\n let controller: OverlayWidgetsController | null = win.gengage?.overlay ?? null;\n const queuedCommands: NativeBridgeMessage[] = [];\n\n const sendToNative = (type: string, payload?: unknown): void => {\n const message: NativeBridgeMessage = payload === undefined ? { type } : { type, payload };\n\n if (env === 'ios') {\n const postMessage = getIosPostMessage(win, iosHandlerName);\n postMessage?.(message);\n return;\n }\n\n if (env === 'android') {\n const androidBridge = getNamedBridge(win, androidInterfaceName);\n androidBridge?.postMessage(JSON.stringify(message));\n return;\n }\n\n if (env === 'react-native') {\n const reactNativeBridge = getNamedBridge(win, reactNativeInterfaceName);\n reactNativeBridge?.postMessage(JSON.stringify(message));\n return;\n }\n\n // Browser fallback: no-op. Useful when running the same integration\n // outside a native WebView (desktop QA, local dev, docs previews).\n return;\n };\n\n const bridgeMessageHandler: EventListener = (event) => {\n const detail = (event as CustomEvent<{ namespace: string; type: string; payload?: unknown }>).detail;\n if (!detail || typeof detail.namespace !== 'string' || typeof detail.type !== 'string') return;\n sendToNative('bridge_message', {\n namespace: detail.namespace,\n type: detail.type,\n payload: detail.payload,\n });\n };\n\n win.addEventListener('gengage:bridge:message', bridgeMessageHandler);\n\n const trackedEventHandlers: Array<{ event: string; handler: EventListener }> = trackedEvents.map((eventName) => {\n const handler: EventListener = (event) => {\n const detail = (event as CustomEvent<unknown>).detail;\n sendToNative('widget_event', {\n event: eventName,\n detail,\n });\n };\n win.addEventListener(eventName, handler);\n return { event: eventName, handler };\n });\n\n const queueCommand = (command: NativeBridgeMessage): void => {\n if (queuedCommands.length >= MAX_QUEUED_NATIVE_COMMANDS) {\n queuedCommands.shift();\n }\n queuedCommands.push(command);\n };\n\n const flushQueuedCommands = (): void => {\n if (!controller || queuedCommands.length === 0) return;\n const pending = queuedCommands.splice(0, queuedCommands.length);\n for (const command of pending) {\n receive(command);\n }\n };\n\n const receive = (message: NativeBridgeMessage | string): void => {\n const incoming = parseNativeBridgeMessage(message);\n if (!incoming || typeof incoming.type !== 'string') {\n console.warn('[gengage:native-bridge] Invalid message:', message);\n return;\n }\n\n const type = incoming.type as NativeInboundMessage | string;\n const payload = incoming.payload;\n\n switch (type) {\n case 'openChat': {\n if (controller) {\n controller.openChat(\n payload && typeof payload === 'object'\n ? (payload as { state?: 'half' | 'full' })\n : payload === 'half' || payload === 'full'\n ? { state: payload }\n : undefined,\n );\n } else {\n queueCommand(incoming);\n }\n return;\n }\n\n case 'closeChat': {\n if (controller) {\n controller.closeChat();\n } else {\n queueCommand(incoming);\n }\n return;\n }\n\n case 'updateContext': {\n if (controller && payload && typeof payload === 'object') {\n void controller.updateContext(payload as Partial<PageContext>);\n } else if (!controller) {\n queueCommand(incoming);\n } else {\n console.warn('[gengage:native-bridge] updateContext: missing payload');\n }\n return;\n }\n\n case 'updateSku': {\n const parsed = parseUpdateSkuPayload(payload);\n if (controller && parsed) {\n void controller.updateSku(parsed.sku, parsed.pageType);\n return;\n }\n if (!controller) {\n queueCommand(incoming);\n } else {\n console.warn('[gengage:native-bridge] updateSku: missing sku');\n }\n return;\n }\n\n case 'setSession': {\n if (payload && typeof payload === 'object') {\n applyNativeSession(payload as NativeSessionPayload, { win });\n }\n return;\n }\n\n case 'destroy': {\n controller?.destroy();\n return;\n }\n\n default: {\n win.postMessage({ gengage: 'native', type, payload }, win.location.origin);\n if (options.logUnhandled) {\n console.warn('[gengage:native-bridge] Unhandled inbound type forwarded:', type);\n }\n }\n }\n };\n\n const bridge: NativeWebViewBridge = {\n env,\n sendToNative,\n receive,\n setController(nextController) {\n controller = nextController;\n flushQueuedCommands();\n },\n destroy() {\n win.removeEventListener('gengage:bridge:message', bridgeMessageHandler);\n for (const entry of trackedEventHandlers) {\n win.removeEventListener(entry.event, entry.handler);\n }\n queuedCommands.splice(0, queuedCommands.length);\n if (toNativeWindow(win).gengageNative === bridge) {\n delete toNativeWindow(win).gengageNative;\n }\n },\n };\n\n nativeWin.gengageNative = bridge;\n return bridge;\n}\n\n/**\n * Convenience helper for mobile WebViews:\n * 1) installs native bridge\n * 2) initializes overlay widgets\n * 3) sends a `ready` message to native\n */\nexport async function initNativeOverlayWidgets(options: NativeOverlayInitOptions): Promise<NativeOverlayInitResult> {\n const { nativeBridge, emitReadyEvent = true, ...overlayOptions } = options;\n const bridge = createNativeWebViewBridge(nativeBridge);\n const resolvedOptions: OverlayWidgetsOptions = { ...overlayOptions };\n\n // Mobile-app-friendly defaults:\n // 1) translate commerce callbacks to native bridge messages by default\n // 2) avoid noisy missing-mount warnings unless PDP widgets are explicitly requested\n if (!resolvedOptions.onAddToCart) {\n resolvedOptions.onAddToCart = (params) => {\n bridge.sendToNative('addToCart', {\n sku: params.sku,\n quantity: params.quantity,\n cartCode: params.cartCode,\n });\n };\n }\n\n if (!resolvedOptions.onProductNavigate) {\n resolvedOptions.onProductNavigate = (url, sku, sessionId) => {\n bridge.sendToNative('productNavigate', {\n url,\n sku,\n sessionId,\n });\n };\n }\n\n const qnaRequested = resolvedOptions.qna?.enabled === true || resolvedOptions.qna?.mountTarget !== undefined;\n if (resolvedOptions.qna?.enabled !== false) {\n if (qnaRequested) {\n const mountTarget = ensureMountTarget(\n window,\n resolvedOptions.qna?.mountTarget ?? DEFAULT_NATIVE_QNA_MOUNT,\n 'gengage-qna',\n );\n resolvedOptions.qna = { ...resolvedOptions.qna, enabled: true, mountTarget };\n } else if (!hasMountTarget(window, DEFAULT_NATIVE_QNA_MOUNT)) {\n resolvedOptions.qna = { enabled: false };\n }\n }\n\n const simrelRequested = resolvedOptions.simrel?.enabled === true || resolvedOptions.simrel?.mountTarget !== undefined;\n if (resolvedOptions.simrel?.enabled !== false) {\n if (simrelRequested) {\n const mountTarget = ensureMountTarget(\n window,\n resolvedOptions.simrel?.mountTarget ?? DEFAULT_NATIVE_SIMREL_MOUNT,\n 'gengage-simrel',\n );\n resolvedOptions.simrel = { ...resolvedOptions.simrel, enabled: true, mountTarget };\n } else if (!hasMountTarget(window, DEFAULT_NATIVE_SIMREL_MOUNT)) {\n resolvedOptions.simrel = { enabled: false };\n }\n }\n\n const controller = await initOverlayWidgets(resolvedOptions);\n bridge.setController(controller);\n\n if (emitReadyEvent) {\n bridge.sendToNative('ready', {\n sessionId: controller.session.sessionId,\n widgets: {\n chat: controller.chat !== null,\n qna: controller.qna !== null,\n simrel: controller.simrel !== null,\n },\n });\n }\n\n return {\n controller,\n bridge,\n destroy() {\n controller.destroy();\n bridge.destroy();\n },\n };\n}\n"],"names":["WidgetToggleSchema","z.object","z.boolean","MountSelectorsSchema","z.string","TransportSchema","AnalyticsAuthModeSchema","z.enum","AnalyticsAuthSchema","AnalyticsSchema","z.number","DEFAULT_IDEMPOTENCY_KEY","GTMSchema","UnknownActionPolicySchema","ActionHandlingSchema","AccountRuntimeConfigSchema","z.literal","parseAccountRuntimeConfig","input","debugLog","result","safeParseAccountRuntimeConfig","createDefaultAccountRuntimeConfig","params","DEFAULT_OVERLAY_KEY_PREFIX","DEFAULT_QNA_MOUNT","DEFAULT_SIMREL_MOUNT","getOverlayRegistry","win","buildInitialPageContext","options","base","incoming","mergePageContext","current","patch","next","resolveMountTarget","target","buildOverlayKey","OverlayWidgetsRuntime","onDestroy","resolveSession","wireQNAToChat","sku","pageType","middlewareUrl","config","GengageChat","qnaTarget","mountTarget","qna","GengageQNA","qnaConfig","simRelTarget","simrel","GengageSimRel","simRelConfig","url","productSku","sessionId","isSafeUrl","fn","err","initOverlayWidgets","key","registry","existing","pending","runtime","liveRegistry","runtimeInit","getOverlayWidgets","idempotencyKey","destroyOverlayWidgets","buildOverlayIdempotencyKey","accountId","DEFAULT_NATIVE_TRACKED_EVENTS","MAX_QUEUED_NATIVE_COMMANDS","DEFAULT_NATIVE_QNA_MOUNT","DEFAULT_NATIVE_SIMREL_MOUNT","parseNativeBridgeMessage","raw","candidate","trimmed","obj","typeCandidate","value","payload","sessionPayload","parseUpdateSkuPayload","hasMountTarget","ensureMountTarget","preferredTarget","fallbackId","id","mount","fallback","getIosPostMessage","handlerName","handler","getNamedBridge","interfaceName","detectNativeEnvironment","iosHandlerName","androidInterfaceName","reactNativeInterfaceName","applyNativeSession","bag","session","createNativeWebViewBridge","nativeWin","trackedEvents","env","controller","queuedCommands","sendToNative","type","message","bridgeMessageHandler","event","detail","trackedEventHandlers","eventName","queueCommand","command","flushQueuedCommands","receive","parsed","bridge","nextController","entry","initNativeOverlayWidgets","nativeBridge","emitReadyEvent","overlayOptions","resolvedOptions","qnaRequested","simrelRequested"],"mappings":"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"}