@getmicdrop/svelte-components 1.0.2 → 1.0.3

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 (517) hide show
  1. package/README.md +98 -98
  2. package/dist/components/Alert/Alert.spec.d.ts +2 -0
  3. package/dist/components/Alert/Alert.spec.d.ts.map +1 -0
  4. package/dist/components/Alert/Alert.spec.js +170 -0
  5. package/dist/components/Alert/Alert.svelte +54 -0
  6. package/dist/components/Alert/Alert.svelte.d.ts +40 -0
  7. package/dist/components/Alert/Alert.svelte.d.ts.map +1 -0
  8. package/dist/components/Alert/AlertAudit.stories.svelte +241 -0
  9. package/dist/components/Alert/AlertAudit.stories.svelte.d.ts +31 -0
  10. package/dist/components/Alert/AlertAudit.stories.svelte.d.ts.map +1 -0
  11. package/dist/components/Badges/Badge.spec.d.ts +2 -0
  12. package/dist/components/Badges/Badge.spec.d.ts.map +1 -0
  13. package/dist/components/Badges/Badge.spec.js +103 -0
  14. package/dist/components/Badges/Badge.stories.svelte +87 -0
  15. package/dist/components/Badges/Badge.stories.svelte.d.ts +47 -0
  16. package/dist/components/Badges/Badge.stories.svelte.d.ts.map +1 -0
  17. package/dist/components/Badges/Badge.svelte +182 -0
  18. package/dist/components/Badges/Badge.svelte.d.ts +38 -0
  19. package/dist/components/Badges/Badge.svelte.d.ts.map +1 -0
  20. package/dist/components/Badges/BadgeAudit.stories.svelte +238 -0
  21. package/dist/components/Badges/BadgeAudit.stories.svelte.d.ts +31 -0
  22. package/dist/components/Badges/BadgeAudit.stories.svelte.d.ts.map +1 -0
  23. package/dist/components/BottomSheet/BottomSheet.spec.d.ts +2 -0
  24. package/dist/components/BottomSheet/BottomSheet.spec.d.ts.map +1 -0
  25. package/dist/components/BottomSheet/BottomSheet.spec.js +127 -0
  26. package/dist/components/BottomSheet/BottomSheet.stories.svelte +91 -0
  27. package/dist/components/BottomSheet/BottomSheet.stories.svelte.d.ts +45 -0
  28. package/dist/components/BottomSheet/BottomSheet.stories.svelte.d.ts.map +1 -0
  29. package/dist/components/BottomSheet/BottomSheet.svelte +171 -0
  30. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts +40 -0
  31. package/dist/components/BottomSheet/BottomSheet.svelte.d.ts.map +1 -0
  32. package/dist/components/Breadcrumb/Breadcrumb.spec.d.ts +2 -0
  33. package/dist/components/Breadcrumb/Breadcrumb.spec.d.ts.map +1 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.spec.js +120 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.stories.svelte +24 -0
  36. package/dist/components/Breadcrumb/Breadcrumb.stories.svelte.d.ts +36 -0
  37. package/dist/components/Breadcrumb/Breadcrumb.stories.svelte.d.ts.map +1 -0
  38. package/dist/components/Breadcrumb/Breadcrumb.svelte +50 -0
  39. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +30 -0
  40. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts.map +1 -0
  41. package/dist/components/Button/Button.spec.d.ts +2 -0
  42. package/dist/components/Button/Button.spec.d.ts.map +1 -0
  43. package/dist/components/Button/Button.spec.js +211 -0
  44. package/dist/components/Button/Button.stories.svelte +111 -0
  45. package/dist/components/Button/Button.stories.svelte.d.ts +59 -0
  46. package/dist/components/Button/Button.stories.svelte.d.ts.map +1 -0
  47. package/dist/components/Button/Button.svelte +642 -0
  48. package/dist/components/Button/Button.svelte.d.ts +68 -0
  49. package/dist/components/Button/Button.svelte.d.ts.map +1 -0
  50. package/dist/components/Button/ButtonAudit.stories.svelte +333 -0
  51. package/dist/components/Button/ButtonAudit.stories.svelte.d.ts +33 -0
  52. package/dist/components/Button/ButtonAudit.stories.svelte.d.ts.map +1 -0
  53. package/dist/components/Button/ButtonSaveDemo.spec.d.ts +2 -0
  54. package/dist/components/Button/ButtonSaveDemo.spec.d.ts.map +1 -0
  55. package/dist/components/Button/ButtonSaveDemo.spec.js +48 -0
  56. package/dist/components/Button/ButtonSaveDemo.svelte +24 -0
  57. package/dist/components/Button/ButtonSaveDemo.svelte.d.ts +26 -0
  58. package/dist/components/Button/ButtonSaveDemo.svelte.d.ts.map +1 -0
  59. package/dist/components/Calendar/Calendar.spec.d.ts +2 -0
  60. package/dist/components/Calendar/Calendar.spec.d.ts.map +1 -0
  61. package/dist/components/Calendar/Calendar.spec.js +131 -0
  62. package/dist/components/Calendar/Calendar.svelte +1115 -0
  63. package/dist/components/Calendar/Calendar.svelte.d.ts +52 -0
  64. package/dist/components/Calendar/Calendar.svelte.d.ts.map +1 -0
  65. package/dist/components/Calendar/QuarterView.spec.d.ts +2 -0
  66. package/dist/components/Calendar/QuarterView.spec.d.ts.map +1 -0
  67. package/dist/components/Calendar/QuarterView.spec.js +394 -0
  68. package/dist/components/Calendar/QuarterView.stories.svelte +134 -0
  69. package/dist/components/Calendar/QuarterView.stories.svelte.d.ts +40 -0
  70. package/dist/components/Calendar/QuarterView.stories.svelte.d.ts.map +1 -0
  71. package/dist/components/Calendar/QuarterView.svelte +736 -0
  72. package/dist/components/Calendar/QuarterView.svelte.d.ts +30 -0
  73. package/dist/components/Calendar/QuarterView.svelte.d.ts.map +1 -0
  74. package/dist/components/Card.spec.d.ts +2 -0
  75. package/dist/components/Card.spec.d.ts.map +1 -0
  76. package/dist/components/Card.spec.js +47 -0
  77. package/dist/components/Card.stories.svelte +26 -0
  78. package/dist/components/Card.stories.svelte.d.ts +36 -0
  79. package/dist/components/Card.stories.svelte.d.ts.map +1 -0
  80. package/dist/components/Card.svelte +9 -0
  81. package/dist/components/Card.svelte.d.ts +30 -0
  82. package/dist/components/Card.svelte.d.ts.map +1 -0
  83. package/dist/components/CardAudit.stories.svelte +175 -0
  84. package/dist/components/CardAudit.stories.svelte.d.ts +31 -0
  85. package/dist/components/CardAudit.stories.svelte.d.ts.map +1 -0
  86. package/dist/components/CropImage/CropImage.spec.d.ts +2 -0
  87. package/dist/components/CropImage/CropImage.spec.d.ts.map +1 -0
  88. package/dist/components/CropImage/CropImage.spec.js +216 -0
  89. package/dist/components/CropImage/CropImage.stories.svelte +133 -0
  90. package/dist/components/CropImage/CropImage.stories.svelte.d.ts +40 -0
  91. package/dist/components/CropImage/CropImage.stories.svelte.d.ts.map +1 -0
  92. package/dist/components/CropImage/CropImage.svelte +311 -0
  93. package/dist/components/CropImage/CropImage.svelte.d.ts +34 -0
  94. package/dist/components/CropImage/CropImage.svelte.d.ts.map +1 -0
  95. package/dist/components/DarkModeToggle.spec.d.ts +2 -0
  96. package/dist/components/DarkModeToggle.spec.d.ts.map +1 -0
  97. package/dist/components/DarkModeToggle.spec.js +357 -0
  98. package/dist/components/DarkModeToggle.stories.svelte +55 -0
  99. package/dist/components/DarkModeToggle.stories.svelte.d.ts +32 -0
  100. package/dist/components/DarkModeToggle.stories.svelte.d.ts.map +1 -0
  101. package/dist/components/DarkModeToggle.svelte +245 -0
  102. package/dist/components/DarkModeToggle.svelte.d.ts +26 -0
  103. package/dist/components/DarkModeToggle.svelte.d.ts.map +1 -0
  104. package/dist/components/ErrorDisplay.spec.d.ts +2 -0
  105. package/dist/components/ErrorDisplay.spec.d.ts.map +1 -0
  106. package/dist/components/ErrorDisplay.spec.js +69 -0
  107. package/dist/components/ErrorDisplay.stories.svelte +115 -0
  108. package/dist/components/ErrorDisplay.stories.svelte.d.ts +62 -0
  109. package/dist/components/ErrorDisplay.stories.svelte.d.ts.map +1 -0
  110. package/dist/components/ErrorDisplay.svelte +58 -0
  111. package/dist/components/ErrorDisplay.svelte.d.ts +36 -0
  112. package/dist/components/ErrorDisplay.svelte.d.ts.map +1 -0
  113. package/dist/components/FormActions.spec.d.ts +2 -0
  114. package/dist/components/FormActions.spec.d.ts.map +1 -0
  115. package/dist/components/FormActions.spec.js +88 -0
  116. package/dist/components/FormActions.stories.svelte +98 -0
  117. package/dist/components/FormActions.stories.svelte.d.ts +57 -0
  118. package/dist/components/FormActions.stories.svelte.d.ts.map +1 -0
  119. package/dist/components/FormActions.svelte +67 -0
  120. package/dist/components/FormActions.svelte.d.ts +48 -0
  121. package/dist/components/FormActions.svelte.d.ts.map +1 -0
  122. package/dist/components/FormValidationSummary.spec.d.ts +2 -0
  123. package/dist/components/FormValidationSummary.spec.d.ts.map +1 -0
  124. package/dist/components/FormValidationSummary.spec.js +203 -0
  125. package/dist/components/FormValidationSummary.stories.svelte +95 -0
  126. package/dist/components/FormValidationSummary.stories.svelte.d.ts +32 -0
  127. package/dist/components/FormValidationSummary.stories.svelte.d.ts.map +1 -0
  128. package/dist/components/FormValidationSummary.svelte +83 -0
  129. package/dist/components/FormValidationSummary.svelte.d.ts +32 -0
  130. package/dist/components/FormValidationSummary.svelte.d.ts.map +1 -0
  131. package/dist/components/Icons/ArrowLeft.svelte +21 -0
  132. package/dist/components/Icons/ArrowLeft.svelte.d.ts +28 -0
  133. package/dist/components/Icons/ArrowLeft.svelte.d.ts.map +1 -0
  134. package/dist/components/Icons/ArrowRight.svelte +21 -0
  135. package/dist/components/Icons/ArrowRight.svelte.d.ts +28 -0
  136. package/dist/components/Icons/ArrowRight.svelte.d.ts.map +1 -0
  137. package/dist/components/Icons/Availability.svelte +28 -0
  138. package/dist/components/Icons/Availability.svelte.d.ts +28 -0
  139. package/dist/components/Icons/Availability.svelte.d.ts.map +1 -0
  140. package/dist/components/Icons/Back.svelte +28 -0
  141. package/dist/components/Icons/Back.svelte.d.ts +28 -0
  142. package/dist/components/Icons/Back.svelte.d.ts.map +1 -0
  143. package/dist/components/Icons/CheckCircle.svelte +20 -0
  144. package/dist/components/Icons/CheckCircle.svelte.d.ts +28 -0
  145. package/dist/components/Icons/CheckCircle.svelte.d.ts.map +1 -0
  146. package/dist/components/Icons/CheckCircleOutline.svelte +28 -0
  147. package/dist/components/Icons/CheckCircleOutline.svelte.d.ts +28 -0
  148. package/dist/components/Icons/CheckCircleOutline.svelte.d.ts.map +1 -0
  149. package/dist/components/Icons/ChevronLeft.svelte +18 -0
  150. package/dist/components/Icons/ChevronLeft.svelte.d.ts +28 -0
  151. package/dist/components/Icons/ChevronLeft.svelte.d.ts.map +1 -0
  152. package/dist/components/Icons/ChevronRight.svelte +18 -0
  153. package/dist/components/Icons/ChevronRight.svelte.d.ts +28 -0
  154. package/dist/components/Icons/ChevronRight.svelte.d.ts.map +1 -0
  155. package/dist/components/Icons/Copy.svelte +28 -0
  156. package/dist/components/Icons/Copy.svelte.d.ts +28 -0
  157. package/dist/components/Icons/Copy.svelte.d.ts.map +1 -0
  158. package/dist/components/Icons/Cross.svelte +18 -0
  159. package/dist/components/Icons/Cross.svelte.d.ts +28 -0
  160. package/dist/components/Icons/Cross.svelte.d.ts.map +1 -0
  161. package/dist/components/Icons/DownArrow.svelte +21 -0
  162. package/dist/components/Icons/DownArrow.svelte.d.ts +28 -0
  163. package/dist/components/Icons/DownArrow.svelte.d.ts.map +1 -0
  164. package/dist/components/Icons/ErrorCircle.svelte +20 -0
  165. package/dist/components/Icons/ErrorCircle.svelte.d.ts +28 -0
  166. package/dist/components/Icons/ErrorCircle.svelte.d.ts.map +1 -0
  167. package/dist/components/Icons/FacebookIcon.svelte +14 -0
  168. package/dist/components/Icons/FacebookIcon.svelte.d.ts +28 -0
  169. package/dist/components/Icons/FacebookIcon.svelte.d.ts.map +1 -0
  170. package/dist/components/Icons/Home.svelte +29 -0
  171. package/dist/components/Icons/Home.svelte.d.ts +28 -0
  172. package/dist/components/Icons/Home.svelte.d.ts.map +1 -0
  173. package/dist/components/Icons/Icon.spec.d.ts +2 -0
  174. package/dist/components/Icons/Icon.spec.d.ts.map +1 -0
  175. package/dist/components/Icons/Icon.spec.js +175 -0
  176. package/dist/components/Icons/Icon.stories.svelte +101 -0
  177. package/dist/components/Icons/Icon.stories.svelte.d.ts +44 -0
  178. package/dist/components/Icons/Icon.stories.svelte.d.ts.map +1 -0
  179. package/dist/components/Icons/Icon.svelte +66 -0
  180. package/dist/components/Icons/Icon.svelte.d.ts +30 -0
  181. package/dist/components/Icons/Icon.svelte.d.ts.map +1 -0
  182. package/dist/components/Icons/IconGallery.stories.svelte +233 -0
  183. package/dist/components/Icons/IconGallery.stories.svelte.d.ts +30 -0
  184. package/dist/components/Icons/IconGallery.stories.svelte.d.ts.map +1 -0
  185. package/dist/components/Icons/Info.svelte +20 -0
  186. package/dist/components/Icons/Info.svelte.d.ts +28 -0
  187. package/dist/components/Icons/Info.svelte.d.ts.map +1 -0
  188. package/dist/components/Icons/InstagramIcon.svelte +20 -0
  189. package/dist/components/Icons/InstagramIcon.svelte.d.ts +28 -0
  190. package/dist/components/Icons/InstagramIcon.svelte.d.ts.map +1 -0
  191. package/dist/components/Icons/Message.svelte +28 -0
  192. package/dist/components/Icons/Message.svelte.d.ts +28 -0
  193. package/dist/components/Icons/Message.svelte.d.ts.map +1 -0
  194. package/dist/components/Icons/MoonIcon.svelte +17 -0
  195. package/dist/components/Icons/MoonIcon.svelte.d.ts +28 -0
  196. package/dist/components/Icons/MoonIcon.svelte.d.ts.map +1 -0
  197. package/dist/components/Icons/More.svelte +35 -0
  198. package/dist/components/Icons/More.svelte.d.ts +28 -0
  199. package/dist/components/Icons/More.svelte.d.ts.map +1 -0
  200. package/dist/components/Icons/MoreHori.spec.d.ts +2 -0
  201. package/dist/components/Icons/MoreHori.spec.d.ts.map +1 -0
  202. package/dist/components/Icons/MoreHori.spec.js +67 -0
  203. package/dist/components/Icons/MoreHori.svelte +35 -0
  204. package/dist/components/Icons/MoreHori.svelte.d.ts +28 -0
  205. package/dist/components/Icons/MoreHori.svelte.d.ts.map +1 -0
  206. package/dist/components/Icons/Notification.svelte +28 -0
  207. package/dist/components/Icons/Notification.svelte.d.ts +28 -0
  208. package/dist/components/Icons/Notification.svelte.d.ts.map +1 -0
  209. package/dist/components/Icons/Payment.svelte +28 -0
  210. package/dist/components/Icons/Payment.svelte.d.ts +28 -0
  211. package/dist/components/Icons/Payment.svelte.d.ts.map +1 -0
  212. package/dist/components/Icons/Profile.svelte +35 -0
  213. package/dist/components/Icons/Profile.svelte.d.ts +28 -0
  214. package/dist/components/Icons/Profile.svelte.d.ts.map +1 -0
  215. package/dist/components/Icons/Reload.svelte +42 -0
  216. package/dist/components/Icons/Reload.svelte.d.ts +28 -0
  217. package/dist/components/Icons/Reload.svelte.d.ts.map +1 -0
  218. package/dist/components/Icons/Shows.svelte +35 -0
  219. package/dist/components/Icons/Shows.svelte.d.ts +28 -0
  220. package/dist/components/Icons/Shows.svelte.d.ts.map +1 -0
  221. package/dist/components/Icons/Signout.svelte +35 -0
  222. package/dist/components/Icons/Signout.svelte.d.ts +28 -0
  223. package/dist/components/Icons/Signout.svelte.d.ts.map +1 -0
  224. package/dist/components/Icons/SunIcon.svelte +20 -0
  225. package/dist/components/Icons/SunIcon.svelte.d.ts +28 -0
  226. package/dist/components/Icons/SunIcon.svelte.d.ts.map +1 -0
  227. package/dist/components/Icons/TiktokIcon.svelte +14 -0
  228. package/dist/components/Icons/TiktokIcon.svelte.d.ts +28 -0
  229. package/dist/components/Icons/TiktokIcon.svelte.d.ts.map +1 -0
  230. package/dist/components/Icons/TwitterIcon.svelte +14 -0
  231. package/dist/components/Icons/TwitterIcon.svelte.d.ts +28 -0
  232. package/dist/components/Icons/TwitterIcon.svelte.d.ts.map +1 -0
  233. package/dist/components/Icons/WarningIcon.spec.d.ts +2 -0
  234. package/dist/components/Icons/WarningIcon.spec.d.ts.map +1 -0
  235. package/dist/components/Icons/WarningIcon.spec.js +30 -0
  236. package/dist/components/Icons/WarningIcon.svelte +24 -0
  237. package/dist/components/Icons/WarningIcon.svelte.d.ts +26 -0
  238. package/dist/components/Icons/WarningIcon.svelte.d.ts.map +1 -0
  239. package/dist/components/Input/Input.spec.d.ts +2 -0
  240. package/dist/components/Input/Input.spec.d.ts.map +1 -0
  241. package/dist/components/Input/Input.spec.js +573 -0
  242. package/dist/components/Input/Input.stories.svelte +140 -0
  243. package/dist/components/Input/Input.stories.svelte.d.ts +80 -0
  244. package/dist/components/Input/Input.stories.svelte.d.ts.map +1 -0
  245. package/dist/components/Input/Input.svelte +721 -0
  246. package/dist/components/Input/Input.svelte.d.ts +96 -0
  247. package/dist/components/Input/Input.svelte.d.ts.map +1 -0
  248. package/dist/components/Input/InputAudit.stories.svelte +483 -0
  249. package/dist/components/Input/InputAudit.stories.svelte.d.ts +31 -0
  250. package/dist/components/Input/InputAudit.stories.svelte.d.ts.map +1 -0
  251. package/dist/components/Input/MultiSelect.spec.d.ts +2 -0
  252. package/dist/components/Input/MultiSelect.spec.d.ts.map +1 -0
  253. package/dist/components/Input/MultiSelect.spec.js +257 -0
  254. package/dist/components/Input/MultiSelect.stories.svelte +138 -0
  255. package/dist/components/Input/MultiSelect.stories.svelte.d.ts +32 -0
  256. package/dist/components/Input/MultiSelect.stories.svelte.d.ts.map +1 -0
  257. package/dist/components/Input/MultiSelect.svelte +557 -0
  258. package/dist/components/Input/MultiSelect.svelte.d.ts +50 -0
  259. package/dist/components/Input/MultiSelect.svelte.d.ts.map +1 -0
  260. package/dist/components/Input/OTPInput.spec.d.ts +2 -0
  261. package/dist/components/Input/OTPInput.spec.d.ts.map +1 -0
  262. package/dist/components/Input/OTPInput.spec.js +238 -0
  263. package/dist/components/Input/OTPInput.stories.svelte +167 -0
  264. package/dist/components/Input/OTPInput.stories.svelte.d.ts +48 -0
  265. package/dist/components/Input/OTPInput.stories.svelte.d.ts.map +1 -0
  266. package/dist/components/Input/OTPInput.svelte +117 -0
  267. package/dist/components/Input/OTPInput.svelte.d.ts +42 -0
  268. package/dist/components/Input/OTPInput.svelte.d.ts.map +1 -0
  269. package/dist/components/Input/Select.spec.d.ts +2 -0
  270. package/dist/components/Input/Select.spec.d.ts.map +1 -0
  271. package/dist/components/Input/Select.spec.js +218 -0
  272. package/dist/components/Input/Select.svelte +385 -0
  273. package/dist/components/Input/Select.svelte.d.ts +48 -0
  274. package/dist/components/Input/Select.svelte.d.ts.map +1 -0
  275. package/dist/components/Input/SelectAudit.stories.svelte +364 -0
  276. package/dist/components/Input/SelectAudit.stories.svelte.d.ts +31 -0
  277. package/dist/components/Input/SelectAudit.stories.svelte.d.ts.map +1 -0
  278. package/dist/components/Layout/BottomNav.spec.d.ts +2 -0
  279. package/dist/components/Layout/BottomNav.spec.d.ts.map +1 -0
  280. package/dist/components/Layout/BottomNav.spec.js +130 -0
  281. package/dist/components/Layout/BottomNav.stories.svelte +115 -0
  282. package/dist/components/Layout/BottomNav.stories.svelte.d.ts +32 -0
  283. package/dist/components/Layout/BottomNav.stories.svelte.d.ts.map +1 -0
  284. package/dist/components/Layout/BottomNav.svelte +120 -0
  285. package/dist/components/Layout/BottomNav.svelte.d.ts +26 -0
  286. package/dist/components/Layout/BottomNav.svelte.d.ts.map +1 -0
  287. package/dist/components/Layout/Header.spec.d.ts +2 -0
  288. package/dist/components/Layout/Header.spec.d.ts.map +1 -0
  289. package/dist/components/Layout/Header.spec.js +203 -0
  290. package/dist/components/Layout/Header.stories.svelte +78 -0
  291. package/dist/components/Layout/Header.stories.svelte.d.ts +47 -0
  292. package/dist/components/Layout/Header.stories.svelte.d.ts.map +1 -0
  293. package/dist/components/Layout/Header.svelte +528 -0
  294. package/dist/components/Layout/Header.svelte.d.ts +42 -0
  295. package/dist/components/Layout/Header.svelte.d.ts.map +1 -0
  296. package/dist/components/Modal/ConfirmationModal.spec.d.ts +2 -0
  297. package/dist/components/Modal/ConfirmationModal.spec.d.ts.map +1 -0
  298. package/dist/components/Modal/ConfirmationModal.spec.js +191 -0
  299. package/dist/components/Modal/ConfirmationModal.stories.svelte +124 -0
  300. package/dist/components/Modal/ConfirmationModal.stories.svelte.d.ts +45 -0
  301. package/dist/components/Modal/ConfirmationModal.stories.svelte.d.ts.map +1 -0
  302. package/dist/components/Modal/ConfirmationModal.svelte +105 -0
  303. package/dist/components/Modal/ConfirmationModal.svelte.d.ts +38 -0
  304. package/dist/components/Modal/ConfirmationModal.svelte.d.ts.map +1 -0
  305. package/dist/components/Modal/Modal.spec.d.ts +2 -0
  306. package/dist/components/Modal/Modal.spec.d.ts.map +1 -0
  307. package/dist/components/Modal/Modal.spec.js +95 -0
  308. package/dist/components/Modal/Modal.stories.svelte +83 -0
  309. package/dist/components/Modal/Modal.stories.svelte.d.ts +31 -0
  310. package/dist/components/Modal/Modal.stories.svelte.d.ts.map +1 -0
  311. package/dist/components/Modal/Modal.svelte +234 -0
  312. package/dist/components/Modal/Modal.svelte.d.ts +46 -0
  313. package/dist/components/Modal/Modal.svelte.d.ts.map +1 -0
  314. package/dist/components/Modal/ModalAudit.stories.svelte +329 -0
  315. package/dist/components/Modal/ModalAudit.stories.svelte.d.ts +31 -0
  316. package/dist/components/Modal/ModalAudit.stories.svelte.d.ts.map +1 -0
  317. package/dist/components/Modal/ModalStateManager.spec.d.ts +2 -0
  318. package/dist/components/Modal/ModalStateManager.spec.d.ts.map +1 -0
  319. package/dist/components/Modal/ModalStateManager.spec.js +100 -0
  320. package/dist/components/Modal/ModalStateManager.svelte +67 -0
  321. package/dist/components/Modal/ModalStateManager.svelte.d.ts +48 -0
  322. package/dist/components/Modal/ModalStateManager.svelte.d.ts.map +1 -0
  323. package/dist/components/Modal/ModalTestWrapper.svelte +21 -0
  324. package/dist/components/Modal/ModalTestWrapper.svelte.d.ts +36 -0
  325. package/dist/components/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
  326. package/dist/components/PageLoader.spec.d.ts +2 -0
  327. package/dist/components/PageLoader.spec.d.ts.map +1 -0
  328. package/dist/components/PageLoader.spec.js +54 -0
  329. package/dist/components/PageLoader.stories.svelte +145 -0
  330. package/dist/components/PageLoader.stories.svelte.d.ts +53 -0
  331. package/dist/components/PageLoader.stories.svelte.d.ts.map +1 -0
  332. package/dist/components/PageLoader.svelte +52 -0
  333. package/dist/components/PageLoader.svelte.d.ts +42 -0
  334. package/dist/components/PageLoader.svelte.d.ts.map +1 -0
  335. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.d.ts +2 -0
  336. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.d.ts.map +1 -0
  337. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -0
  338. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +101 -0
  339. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts +36 -0
  340. package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte.d.ts.map +1 -0
  341. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.d.ts +2 -0
  342. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.d.ts.map +1 -0
  343. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -0
  344. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +168 -0
  345. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.stories.svelte.d.ts +60 -0
  346. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.stories.svelte.d.ts.map +1 -0
  347. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.svelte +431 -0
  348. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts +29 -0
  349. package/dist/components/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -0
  350. package/dist/components/Spinner/Spinner.spec.d.ts +2 -0
  351. package/dist/components/Spinner/Spinner.spec.d.ts.map +1 -0
  352. package/dist/components/Spinner/Spinner.spec.js +75 -0
  353. package/dist/components/Spinner/Spinner.stories.svelte +30 -0
  354. package/dist/components/Spinner/Spinner.stories.svelte.d.ts +31 -0
  355. package/dist/components/Spinner/Spinner.stories.svelte.d.ts.map +1 -0
  356. package/dist/components/Spinner/Spinner.svelte +19 -0
  357. package/dist/components/Spinner/Spinner.svelte.d.ts +26 -0
  358. package/dist/components/Spinner/Spinner.svelte.d.ts.map +1 -0
  359. package/dist/components/StatusIndicator/StatusIndicator.spec.d.ts +2 -0
  360. package/dist/components/StatusIndicator/StatusIndicator.spec.d.ts.map +1 -0
  361. package/dist/components/StatusIndicator/StatusIndicator.spec.js +129 -0
  362. package/dist/components/StatusIndicator/StatusIndicator.svelte +206 -0
  363. package/dist/components/StatusIndicator/StatusIndicator.svelte.d.ts +28 -0
  364. package/dist/components/StatusIndicator/StatusIndicator.svelte.d.ts.map +1 -0
  365. package/dist/components/Toaster/Toaster.stories.svelte +61 -0
  366. package/dist/components/Toaster/Toaster.stories.svelte.d.ts +29 -0
  367. package/dist/components/Toaster/Toaster.stories.svelte.d.ts.map +1 -0
  368. package/dist/components/Toggle.spec.d.ts +2 -0
  369. package/dist/components/Toggle.spec.d.ts.map +1 -0
  370. package/dist/components/Toggle.spec.js +158 -0
  371. package/dist/components/Toggle.stories.svelte +93 -0
  372. package/dist/components/Toggle.stories.svelte.d.ts +41 -0
  373. package/dist/components/Toggle.stories.svelte.d.ts.map +1 -0
  374. package/dist/components/Toggle.svelte +79 -0
  375. package/dist/components/Toggle.svelte.d.ts +32 -0
  376. package/dist/components/Toggle.svelte.d.ts.map +1 -0
  377. package/dist/components/ValidationError.spec.d.ts +2 -0
  378. package/dist/components/ValidationError.spec.d.ts.map +1 -0
  379. package/dist/components/ValidationError.spec.js +79 -0
  380. package/dist/components/ValidationError.stories.svelte +88 -0
  381. package/dist/components/ValidationError.stories.svelte.d.ts +41 -0
  382. package/dist/components/ValidationError.stories.svelte.d.ts.map +1 -0
  383. package/dist/components/ValidationError.svelte +19 -0
  384. package/dist/components/ValidationError.svelte.d.ts +28 -0
  385. package/dist/components/ValidationError.svelte.d.ts.map +1 -0
  386. package/dist/components/pages/performers/AvailabilityCalendarModal.spec.d.ts +2 -0
  387. package/dist/components/pages/performers/AvailabilityCalendarModal.spec.d.ts.map +1 -0
  388. package/dist/components/pages/performers/AvailabilityCalendarModal.spec.js +606 -0
  389. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +632 -0
  390. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte.d.ts +36 -0
  391. package/dist/components/pages/performers/AvailabilityCalendarModal.svelte.d.ts.map +1 -0
  392. package/dist/components/pages/performers/ModalShowInfo.spec.d.ts +2 -0
  393. package/dist/components/pages/performers/ModalShowInfo.spec.d.ts.map +1 -0
  394. package/dist/components/pages/performers/ModalShowInfo.spec.js +124 -0
  395. package/dist/components/pages/performers/ModalShowInfo.svelte +88 -0
  396. package/dist/components/pages/performers/ModalShowInfo.svelte.d.ts +34 -0
  397. package/dist/components/pages/performers/ModalShowInfo.svelte.d.ts.map +1 -0
  398. package/dist/components/pages/performers/PageBackButton.spec.d.ts +2 -0
  399. package/dist/components/pages/performers/PageBackButton.spec.d.ts.map +1 -0
  400. package/dist/components/pages/performers/PageBackButton.spec.js +89 -0
  401. package/dist/components/pages/performers/PageBackButton.stories.svelte +72 -0
  402. package/dist/components/pages/performers/PageBackButton.stories.svelte.d.ts +36 -0
  403. package/dist/components/pages/performers/PageBackButton.stories.svelte.d.ts.map +1 -0
  404. package/dist/components/pages/performers/PageBackButton.svelte +13 -0
  405. package/dist/components/pages/performers/PageBackButton.svelte.d.ts +26 -0
  406. package/dist/components/pages/performers/PageBackButton.svelte.d.ts.map +1 -0
  407. package/dist/components/pages/performers/SectionHeader.spec.d.ts +2 -0
  408. package/dist/components/pages/performers/SectionHeader.spec.d.ts.map +1 -0
  409. package/dist/components/pages/performers/SectionHeader.spec.js +75 -0
  410. package/dist/components/pages/performers/SectionHeader.stories.svelte +100 -0
  411. package/dist/components/pages/performers/SectionHeader.stories.svelte.d.ts +41 -0
  412. package/dist/components/pages/performers/SectionHeader.stories.svelte.d.ts.map +1 -0
  413. package/dist/components/pages/performers/SectionHeader.svelte +9 -0
  414. package/dist/components/pages/performers/SectionHeader.svelte.d.ts +28 -0
  415. package/dist/components/pages/performers/SectionHeader.svelte.d.ts.map +1 -0
  416. package/dist/components/pages/performers/ShowDetails.spec.d.ts +2 -0
  417. package/dist/components/pages/performers/ShowDetails.spec.d.ts.map +1 -0
  418. package/dist/components/pages/performers/ShowDetails.spec.js +166 -0
  419. package/dist/components/pages/performers/ShowDetails.stories.svelte +140 -0
  420. package/dist/components/pages/performers/ShowDetails.stories.svelte.d.ts +37 -0
  421. package/dist/components/pages/performers/ShowDetails.stories.svelte.d.ts.map +1 -0
  422. package/dist/components/pages/performers/ShowDetails.svelte +73 -0
  423. package/dist/components/pages/performers/ShowDetails.svelte.d.ts +44 -0
  424. package/dist/components/pages/performers/ShowDetails.svelte.d.ts.map +1 -0
  425. package/dist/components/pages/performers/ShowItemCard.spec.d.ts +2 -0
  426. package/dist/components/pages/performers/ShowItemCard.spec.d.ts.map +1 -0
  427. package/dist/components/pages/performers/ShowItemCard.spec.js +793 -0
  428. package/dist/components/pages/performers/ShowItemCard.stories.svelte +250 -0
  429. package/dist/components/pages/performers/ShowItemCard.stories.svelte.d.ts +43 -0
  430. package/dist/components/pages/performers/ShowItemCard.stories.svelte.d.ts.map +1 -0
  431. package/dist/components/pages/performers/ShowItemCard.svelte +886 -0
  432. package/dist/components/pages/performers/ShowItemCard.svelte.d.ts +54 -0
  433. package/dist/components/pages/performers/ShowItemCard.svelte.d.ts.map +1 -0
  434. package/dist/components/pages/performers/SwitchOption.spec.d.ts +2 -0
  435. package/dist/components/pages/performers/SwitchOption.spec.d.ts.map +1 -0
  436. package/dist/components/pages/performers/SwitchOption.spec.js +127 -0
  437. package/dist/components/pages/performers/SwitchOption.stories.svelte +211 -0
  438. package/dist/components/pages/performers/SwitchOption.stories.svelte.d.ts +40 -0
  439. package/dist/components/pages/performers/SwitchOption.stories.svelte.d.ts.map +1 -0
  440. package/dist/components/pages/performers/SwitchOption.svelte +24 -0
  441. package/dist/components/pages/performers/SwitchOption.svelte.d.ts +30 -0
  442. package/dist/components/pages/performers/SwitchOption.svelte.d.ts.map +1 -0
  443. package/dist/components/pages/performers/VenueInfo.spec.d.ts +2 -0
  444. package/dist/components/pages/performers/VenueInfo.spec.d.ts.map +1 -0
  445. package/dist/components/pages/performers/VenueInfo.spec.js +167 -0
  446. package/dist/components/pages/performers/VenueInfo.svelte +90 -0
  447. package/dist/components/pages/performers/VenueInfo.svelte.d.ts +32 -0
  448. package/dist/components/pages/performers/VenueInfo.svelte.d.ts.map +1 -0
  449. package/dist/components/pages/performers/VenueItemCard.spec.d.ts +2 -0
  450. package/dist/components/pages/performers/VenueItemCard.spec.d.ts.map +1 -0
  451. package/dist/components/pages/performers/VenueItemCard.spec.js +763 -0
  452. package/dist/components/pages/performers/VenueItemCard.stories.svelte +301 -0
  453. package/dist/components/pages/performers/VenueItemCard.stories.svelte.d.ts +37 -0
  454. package/dist/components/pages/performers/VenueItemCard.stories.svelte.d.ts.map +1 -0
  455. package/dist/components/pages/performers/VenueItemCard.svelte +192 -0
  456. package/dist/components/pages/performers/VenueItemCard.svelte.d.ts +66 -0
  457. package/dist/components/pages/performers/VenueItemCard.svelte.d.ts.map +1 -0
  458. package/dist/components/pages/profile/profile-form.spec.d.ts +2 -0
  459. package/dist/components/pages/profile/profile-form.spec.d.ts.map +1 -0
  460. package/dist/components/pages/profile/profile-form.spec.js +9 -0
  461. package/dist/components/pages/profile/profile-form.stories.svelte +279 -0
  462. package/dist/components/pages/profile/profile-form.stories.svelte.d.ts +48 -0
  463. package/dist/components/pages/profile/profile-form.stories.svelte.d.ts.map +1 -0
  464. package/dist/components/pages/profile/profile-form.svelte +445 -0
  465. package/dist/components/pages/profile/profile-form.svelte.d.ts +36 -0
  466. package/dist/components/pages/profile/profile-form.svelte.d.ts.map +1 -0
  467. package/dist/components/pages/profile/profile-photos.stories.svelte +69 -0
  468. package/dist/components/pages/profile/profile-photos.stories.svelte.d.ts +31 -0
  469. package/dist/components/pages/profile/profile-photos.stories.svelte.d.ts.map +1 -0
  470. package/dist/components/pages/profile/profile-photos.svelte +26 -0
  471. package/dist/components/pages/profile/profile-photos.svelte.d.ts +26 -0
  472. package/dist/components/pages/profile/profile-photos.svelte.d.ts.map +1 -0
  473. package/dist/components/pages/settings/tabs/CustomImageDropzone.stories.svelte +166 -0
  474. package/dist/components/pages/settings/tabs/CustomImageDropzone.stories.svelte.d.ts +49 -0
  475. package/dist/components/pages/settings/tabs/CustomImageDropzone.stories.svelte.d.ts.map +1 -0
  476. package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte +241 -0
  477. package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte.d.ts +38 -0
  478. package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte.d.ts.map +1 -0
  479. package/dist/components/pages/shows/ShowList.spec.d.ts +2 -0
  480. package/dist/components/pages/shows/ShowList.spec.d.ts.map +1 -0
  481. package/dist/components/pages/shows/ShowList.spec.js +33 -0
  482. package/dist/components/pages/shows/ShowList.stories.svelte +258 -0
  483. package/dist/components/pages/shows/ShowList.stories.svelte.d.ts +41 -0
  484. package/dist/components/pages/shows/ShowList.stories.svelte.d.ts.map +1 -0
  485. package/dist/components/pages/shows/ShowList.svelte +12 -0
  486. package/dist/components/pages/shows/ShowList.svelte.d.ts +28 -0
  487. package/dist/components/pages/shows/ShowList.svelte.d.ts.map +1 -0
  488. package/dist/components/pages/shows/TabContent.spec.d.ts +2 -0
  489. package/dist/components/pages/shows/TabContent.spec.d.ts.map +1 -0
  490. package/dist/components/pages/shows/TabContent.spec.js +90 -0
  491. package/dist/components/pages/shows/TabContent.stories.svelte +254 -0
  492. package/dist/components/pages/shows/TabContent.stories.svelte.d.ts +45 -0
  493. package/dist/components/pages/shows/TabContent.stories.svelte.d.ts.map +1 -0
  494. package/dist/components/pages/shows/TabContent.svelte +94 -0
  495. package/dist/components/pages/shows/TabContent.svelte.d.ts +32 -0
  496. package/dist/components/pages/shows/TabContent.svelte.d.ts.map +1 -0
  497. package/dist/components/pages/shows/TabNavigation.spec.d.ts +2 -0
  498. package/dist/components/pages/shows/TabNavigation.spec.d.ts.map +1 -0
  499. package/dist/components/pages/shows/TabNavigation.spec.js +143 -0
  500. package/dist/components/pages/shows/TabNavigation.stories.svelte +177 -0
  501. package/dist/components/pages/shows/TabNavigation.stories.svelte.d.ts +41 -0
  502. package/dist/components/pages/shows/TabNavigation.stories.svelte.d.ts.map +1 -0
  503. package/dist/components/pages/shows/TabNavigation.svelte +64 -0
  504. package/dist/components/pages/shows/TabNavigation.svelte.d.ts +32 -0
  505. package/dist/components/pages/shows/TabNavigation.svelte.d.ts.map +1 -0
  506. package/dist/config.js +5 -5
  507. package/dist/config.spec.js +29 -29
  508. package/dist/constants/formOptions.js +25 -25
  509. package/dist/constants/formOptions.spec.js +88 -88
  510. package/dist/index.d.ts +80 -0
  511. package/dist/index.d.ts.map +1 -0
  512. package/dist/index.js +111 -0
  513. package/dist/telemetry.js +357 -357
  514. package/dist/telemetry.server.js +211 -211
  515. package/dist/telemetry.server.spec.js +434 -434
  516. package/dist/telemetry.spec.js +660 -660
  517. package/package.json +155 -152
@@ -1,660 +1,660 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
-
3
- // Mock all OpenTelemetry modules before importing telemetry
4
- vi.mock('@opentelemetry/sdk-trace-web', () => ({
5
- WebTracerProvider: vi.fn().mockImplementation(() => ({
6
- addSpanProcessor: vi.fn(),
7
- register: vi.fn(),
8
- getTracer: vi.fn().mockReturnValue({
9
- startSpan: vi.fn().mockReturnValue({
10
- setAttribute: vi.fn(),
11
- setStatus: vi.fn(),
12
- recordException: vi.fn(),
13
- end: vi.fn(),
14
- name: 'test-span',
15
- }),
16
- }),
17
- shutdown: vi.fn().mockResolvedValue(undefined),
18
- })),
19
- }));
20
-
21
- vi.mock('@opentelemetry/sdk-trace-base', () => ({
22
- BatchSpanProcessor: vi.fn(),
23
- }));
24
-
25
- vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
26
- OTLPTraceExporter: vi.fn(),
27
- }));
28
-
29
- vi.mock('@opentelemetry/resources', () => ({
30
- Resource: vi.fn(),
31
- }));
32
-
33
- vi.mock('@opentelemetry/semantic-conventions', () => ({
34
- SEMRESATTRS_SERVICE_NAME: 'service.name',
35
- SEMRESATTRS_SERVICE_VERSION: 'service.version',
36
- SEMRESATTRS_DEPLOYMENT_ENVIRONMENT: 'deployment.environment',
37
- }));
38
-
39
- vi.mock('@opentelemetry/instrumentation-document-load', () => ({
40
- DocumentLoadInstrumentation: vi.fn().mockImplementation(() => ({
41
- enable: vi.fn(),
42
- })),
43
- }));
44
-
45
- vi.mock('@opentelemetry/instrumentation-fetch', () => ({
46
- FetchInstrumentation: vi.fn().mockImplementation(() => ({
47
- enable: vi.fn(),
48
- })),
49
- }));
50
-
51
- vi.mock('@opentelemetry/instrumentation-xml-http-request', () => ({
52
- XMLHttpRequestInstrumentation: vi.fn().mockImplementation(() => ({
53
- enable: vi.fn(),
54
- })),
55
- }));
56
-
57
- vi.mock('@opentelemetry/instrumentation-user-interaction', () => ({
58
- UserInteractionInstrumentation: vi.fn().mockImplementation(() => ({
59
- enable: vi.fn(),
60
- })),
61
- }));
62
-
63
- vi.mock('@opentelemetry/context-zone', () => ({
64
- ZoneContextManager: vi.fn(),
65
- }));
66
-
67
- vi.mock('@opentelemetry/propagator-b3', () => ({
68
- B3Propagator: vi.fn(),
69
- }));
70
-
71
- describe('Telemetry Module', () => {
72
- let telemetry;
73
- let originalWindow;
74
- let originalDocument;
75
- let mockSpan;
76
-
77
- beforeEach(async () => {
78
- vi.resetModules();
79
-
80
- // Save original globals
81
- originalWindow = global.window;
82
- originalDocument = global.document;
83
-
84
- // Setup mock window
85
- global.window = {
86
- location: {
87
- pathname: '/performers',
88
- search: '?test=1',
89
- hash: '#section',
90
- href: 'http://localhost/performers?test=1#section',
91
- },
92
- addEventListener: vi.fn(),
93
- __TRACE_CONTEXT__: null,
94
- };
95
-
96
- global.document = {
97
- readyState: 'complete',
98
- title: 'Test Page',
99
- referrer: 'http://localhost/',
100
- addEventListener: vi.fn(),
101
- };
102
-
103
- global.navigator = {
104
- userAgent: 'test-agent',
105
- language: 'en-US',
106
- platform: 'test-platform',
107
- };
108
-
109
- // Create mock span
110
- mockSpan = {
111
- setAttribute: vi.fn(),
112
- setStatus: vi.fn(),
113
- recordException: vi.fn(),
114
- end: vi.fn(),
115
- name: 'test-span',
116
- };
117
-
118
- // Re-import with fresh mocks
119
- telemetry = await import('./telemetry.js');
120
- });
121
-
122
- afterEach(() => {
123
- global.window = originalWindow;
124
- global.document = originalDocument;
125
- vi.clearAllMocks();
126
- });
127
-
128
- describe('initTelemetry', () => {
129
- it('exports initTelemetry function', () => {
130
- expect(telemetry.initTelemetry).toBeDefined();
131
- expect(typeof telemetry.initTelemetry).toBe('function');
132
- });
133
-
134
- it('can be called without errors', () => {
135
- expect(() => telemetry.initTelemetry()).not.toThrow();
136
- });
137
- });
138
-
139
- describe('startSpan', () => {
140
- it('exports startSpan function', () => {
141
- expect(telemetry.startSpan).toBeDefined();
142
- expect(typeof telemetry.startSpan).toBe('function');
143
- });
144
-
145
- it('returns null when tracer is not initialized', async () => {
146
- vi.resetModules();
147
- const tempWindow = global.window;
148
- delete global.window;
149
-
150
- const freshTelemetry = await import('./telemetry.js');
151
- global.window = tempWindow;
152
-
153
- const result = freshTelemetry.startSpan('test-span');
154
- expect(result).toBeNull();
155
- });
156
-
157
- it('can be called with name only', () => {
158
- telemetry.initTelemetry();
159
- const result = telemetry.startSpan('test-span');
160
- expect(result === null || typeof result === 'object').toBe(true);
161
- });
162
-
163
- it('can be called with name and options', () => {
164
- telemetry.initTelemetry();
165
- const result = telemetry.startSpan('test-span', { attributes: { key: 'value' } });
166
- expect(result === null || typeof result === 'object').toBe(true);
167
- });
168
- });
169
-
170
- describe('endSpan', () => {
171
- it('exports endSpan function', () => {
172
- expect(telemetry.endSpan).toBeDefined();
173
- expect(typeof telemetry.endSpan).toBe('function');
174
- });
175
-
176
- it('handles null span gracefully', () => {
177
- expect(() => telemetry.endSpan(null)).not.toThrow();
178
- });
179
-
180
- it('handles undefined span gracefully', () => {
181
- expect(() => telemetry.endSpan(undefined)).not.toThrow();
182
- });
183
-
184
- it('can end a span with default status', () => {
185
- expect(() => telemetry.endSpan(mockSpan)).not.toThrow();
186
- expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 0 });
187
- expect(mockSpan.end).toHaveBeenCalled();
188
- });
189
-
190
- it('can end a span with custom status', () => {
191
- expect(() => telemetry.endSpan(mockSpan, { code: 2, message: 'error' })).not.toThrow();
192
- expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 2, message: 'error' });
193
- });
194
- });
195
-
196
- describe('trackPageView', () => {
197
- it('exports trackPageView function', () => {
198
- expect(telemetry.trackPageView).toBeDefined();
199
- expect(typeof telemetry.trackPageView).toBe('function');
200
- });
201
-
202
- it('can be called without errors', () => {
203
- expect(() => telemetry.trackPageView('/test-page')).not.toThrow();
204
- });
205
-
206
- it('can be called with page path and title', () => {
207
- expect(() => telemetry.trackPageView('/test-page', 'Test Page Title')).not.toThrow();
208
- });
209
- });
210
-
211
- describe('trackEvent', () => {
212
- it('exports trackEvent function', () => {
213
- expect(telemetry.trackEvent).toBeDefined();
214
- expect(typeof telemetry.trackEvent).toBe('function');
215
- });
216
-
217
- it('can be called with event name only', () => {
218
- expect(() => telemetry.trackEvent('button_click')).not.toThrow();
219
- });
220
-
221
- it('can be called with event name and attributes', () => {
222
- expect(() => telemetry.trackEvent('button_click', { button_id: 'submit' })).not.toThrow();
223
- });
224
- });
225
-
226
- describe('trackPerformerAction', () => {
227
- it('exports trackPerformerAction function', () => {
228
- expect(telemetry.trackPerformerAction).toBeDefined();
229
- expect(typeof telemetry.trackPerformerAction).toBe('function');
230
- });
231
-
232
- it('can be called with action only', () => {
233
- expect(() => telemetry.trackPerformerAction('profile_update')).not.toThrow();
234
- });
235
-
236
- it('can be called with action and metadata', () => {
237
- expect(() => telemetry.trackPerformerAction('profile_update', { field: 'bio' })).not.toThrow();
238
- });
239
- });
240
-
241
- describe('trackError', () => {
242
- it('exports trackError function', () => {
243
- expect(telemetry.trackError).toBeDefined();
244
- expect(typeof telemetry.trackError).toBe('function');
245
- });
246
-
247
- it('can be called with Error object', () => {
248
- const error = new Error('Test error');
249
- expect(() => telemetry.trackError(error)).not.toThrow();
250
- });
251
-
252
- it('can be called with Error and context', () => {
253
- const error = new Error('Test error');
254
- expect(() => telemetry.trackError(error, { component: 'TestComponent' })).not.toThrow();
255
- });
256
-
257
- it('handles error without stack trace', () => {
258
- const error = { message: 'Simple error', name: 'SimpleError' };
259
- expect(() => telemetry.trackError(error)).not.toThrow();
260
- });
261
-
262
- it('handles string error', () => {
263
- expect(() => telemetry.trackError('String error message')).not.toThrow();
264
- });
265
- });
266
-
267
- describe('trackAPICall', () => {
268
- it('exports trackAPICall function', () => {
269
- expect(telemetry.trackAPICall).toBeDefined();
270
- expect(typeof telemetry.trackAPICall).toBe('function');
271
- });
272
-
273
- it('can be called with basic parameters', () => {
274
- expect(() => telemetry.trackAPICall('GET', '/api/users', 200, 150)).not.toThrow();
275
- });
276
-
277
- it('can be called with additional attributes', () => {
278
- expect(() => telemetry.trackAPICall('POST', '/api/users', 201, 200, { user_id: '123' })).not.toThrow();
279
- });
280
-
281
- it('handles error status codes', () => {
282
- expect(() => telemetry.trackAPICall('GET', '/api/users', 500, 100)).not.toThrow();
283
- });
284
-
285
- it('handles 4xx status codes', () => {
286
- expect(() => telemetry.trackAPICall('GET', '/api/users', 404, 50)).not.toThrow();
287
- });
288
- });
289
-
290
- describe('trackUserAction', () => {
291
- it('exports trackUserAction function', () => {
292
- expect(telemetry.trackUserAction).toBeDefined();
293
- expect(typeof telemetry.trackUserAction).toBe('function');
294
- });
295
-
296
- it('can be called with action only', () => {
297
- expect(() => telemetry.trackUserAction('login')).not.toThrow();
298
- });
299
-
300
- it('can be called with action and metadata', () => {
301
- expect(() => telemetry.trackUserAction('login', { method: 'email' })).not.toThrow();
302
- });
303
- });
304
-
305
- describe('shutdownTelemetry', () => {
306
- it('exports shutdownTelemetry function', () => {
307
- expect(telemetry.shutdownTelemetry).toBeDefined();
308
- expect(typeof telemetry.shutdownTelemetry).toBe('function');
309
- });
310
-
311
- it('can be called without errors', async () => {
312
- await expect(telemetry.shutdownTelemetry()).resolves.not.toThrow();
313
- });
314
-
315
- it('handles shutdown when not initialized', async () => {
316
- vi.resetModules();
317
- const tempWindow = global.window;
318
- delete global.window;
319
-
320
- const freshTelemetry = await import('./telemetry.js');
321
- global.window = tempWindow;
322
-
323
- await expect(freshTelemetry.shutdownTelemetry()).resolves.not.toThrow();
324
- });
325
- });
326
-
327
- describe('Module auto-initialization', () => {
328
- it('adds DOMContentLoaded listener when document is loading', async () => {
329
- vi.resetModules();
330
-
331
- global.document = {
332
- readyState: 'loading',
333
- addEventListener: vi.fn(),
334
- title: 'Test',
335
- referrer: '',
336
- };
337
-
338
- await import('./telemetry.js');
339
-
340
- expect(global.document.addEventListener).toHaveBeenCalledWith(
341
- 'DOMContentLoaded',
342
- expect.any(Function)
343
- );
344
- });
345
-
346
- it('initializes immediately when document is ready', async () => {
347
- vi.resetModules();
348
-
349
- global.document = {
350
- readyState: 'complete',
351
- title: 'Test',
352
- referrer: '',
353
- addEventListener: vi.fn(),
354
- };
355
-
356
- await import('./telemetry.js');
357
- });
358
-
359
- it('adds beforeunload listener for cleanup', async () => {
360
- vi.resetModules();
361
-
362
- global.window.addEventListener = vi.fn();
363
-
364
- await import('./telemetry.js');
365
-
366
- expect(global.window.addEventListener).toHaveBeenCalledWith(
367
- 'beforeunload',
368
- expect.any(Function)
369
- );
370
- });
371
- });
372
-
373
- describe('SSR trace context connection', () => {
374
- it('handles missing SSR trace context', async () => {
375
- vi.resetModules();
376
-
377
- global.window.__TRACE_CONTEXT__ = null;
378
-
379
- await expect(import('./telemetry.js')).resolves.not.toThrow();
380
- });
381
-
382
- it('handles SSR trace context when present', async () => {
383
- vi.resetModules();
384
-
385
- global.window.__TRACE_CONTEXT__ = {
386
- traceId: 'test-trace-id',
387
- spanId: 'test-span-id',
388
- traceFlags: 1,
389
- };
390
-
391
- await expect(import('./telemetry.js')).resolves.not.toThrow();
392
- });
393
- });
394
- });
395
-
396
- describe('Telemetry with traces disabled', () => {
397
- let telemetry;
398
-
399
- beforeEach(async () => {
400
- vi.resetModules();
401
-
402
- vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'false');
403
-
404
- global.window = {
405
- location: {
406
- pathname: '/performers',
407
- search: '',
408
- hash: '',
409
- href: 'http://localhost/performers',
410
- },
411
- addEventListener: vi.fn(),
412
- __TRACE_CONTEXT__: null,
413
- };
414
-
415
- global.document = {
416
- readyState: 'complete',
417
- title: 'Test',
418
- referrer: '',
419
- addEventListener: vi.fn(),
420
- };
421
-
422
- global.navigator = {
423
- userAgent: 'test',
424
- language: 'en',
425
- platform: 'test',
426
- };
427
-
428
- telemetry = await import('./telemetry.js');
429
- });
430
-
431
- afterEach(() => {
432
- vi.unstubAllEnvs();
433
- vi.clearAllMocks();
434
- });
435
-
436
- it('initTelemetry returns early when tracing is disabled', () => {
437
- const consoleSpy = vi.spyOn(console, 'log');
438
- telemetry.initTelemetry();
439
- expect(consoleSpy).toHaveBeenCalledWith('[Telemetry] Tracing is disabled');
440
- });
441
- });
442
-
443
- describe('Telemetry debug mode', () => {
444
- let telemetry;
445
-
446
- beforeEach(async () => {
447
- vi.resetModules();
448
-
449
- vi.stubEnv('VITE_OTEL_DEBUG', 'true');
450
-
451
- global.window = {
452
- location: {
453
- pathname: '/performers',
454
- search: '',
455
- hash: '',
456
- href: 'http://localhost/performers',
457
- },
458
- addEventListener: vi.fn(),
459
- __TRACE_CONTEXT__: null,
460
- };
461
-
462
- global.document = {
463
- readyState: 'complete',
464
- title: 'Test',
465
- referrer: '',
466
- addEventListener: vi.fn(),
467
- };
468
-
469
- global.navigator = {
470
- userAgent: 'test',
471
- language: 'en',
472
- platform: 'test',
473
- };
474
-
475
- telemetry = await import('./telemetry.js');
476
- });
477
-
478
- afterEach(() => {
479
- vi.unstubAllEnvs();
480
- vi.clearAllMocks();
481
- });
482
-
483
- it('can initialize with debug mode enabled', () => {
484
- expect(() => telemetry.initTelemetry()).not.toThrow();
485
- });
486
- });
487
-
488
- describe('Telemetry shutdown error handling', () => {
489
- let telemetry;
490
-
491
- beforeEach(async () => {
492
- vi.resetModules();
493
-
494
- // Mock shutdown to throw error
495
- vi.mock('@opentelemetry/sdk-trace-web', () => ({
496
- WebTracerProvider: vi.fn().mockImplementation(() => ({
497
- addSpanProcessor: vi.fn(),
498
- register: vi.fn(),
499
- getTracer: vi.fn().mockReturnValue({
500
- startSpan: vi.fn().mockReturnValue({
501
- setAttribute: vi.fn(),
502
- setStatus: vi.fn(),
503
- recordException: vi.fn(),
504
- end: vi.fn(),
505
- name: 'test-span',
506
- }),
507
- }),
508
- shutdown: vi.fn().mockRejectedValue(new Error('Shutdown failed')),
509
- })),
510
- }));
511
-
512
- global.window = {
513
- location: {
514
- pathname: '/performers',
515
- search: '',
516
- hash: '',
517
- href: 'http://localhost/performers',
518
- },
519
- addEventListener: vi.fn(),
520
- __TRACE_CONTEXT__: null,
521
- };
522
-
523
- global.document = {
524
- readyState: 'complete',
525
- title: 'Test',
526
- referrer: '',
527
- addEventListener: vi.fn(),
528
- };
529
-
530
- global.navigator = {
531
- userAgent: 'test',
532
- language: 'en',
533
- platform: 'test',
534
- };
535
-
536
- telemetry = await import('./telemetry.js');
537
- });
538
-
539
- afterEach(() => {
540
- vi.unstubAllEnvs();
541
- vi.clearAllMocks();
542
- });
543
-
544
- it('handles shutdown error gracefully', async () => {
545
- const consoleErrorSpy = vi.spyOn(console, 'error');
546
- telemetry.initTelemetry();
547
- await telemetry.shutdownTelemetry();
548
- // Should not throw, just log error
549
- expect(consoleErrorSpy).toBeDefined();
550
- });
551
- });
552
-
553
- describe('Telemetry DOMContentLoaded event', () => {
554
- let telemetry;
555
- let domContentLoadedCallback;
556
-
557
- beforeEach(async () => {
558
- vi.resetModules();
559
-
560
- global.window = {
561
- location: {
562
- pathname: '/performers',
563
- search: '',
564
- hash: '',
565
- href: 'http://localhost/performers',
566
- },
567
- addEventListener: vi.fn(),
568
- __TRACE_CONTEXT__: null,
569
- };
570
-
571
- // Mock document with loading state
572
- global.document = {
573
- readyState: 'loading',
574
- title: 'Test',
575
- referrer: '',
576
- addEventListener: vi.fn((event, callback) => {
577
- if (event === 'DOMContentLoaded') {
578
- domContentLoadedCallback = callback;
579
- }
580
- }),
581
- };
582
-
583
- global.navigator = {
584
- userAgent: 'test',
585
- language: 'en',
586
- platform: 'test',
587
- };
588
-
589
- telemetry = await import('./telemetry.js');
590
- });
591
-
592
- afterEach(() => {
593
- vi.unstubAllEnvs();
594
- vi.clearAllMocks();
595
- });
596
-
597
- it('registers DOMContentLoaded event listener when document is loading', () => {
598
- expect(document.addEventListener).toHaveBeenCalledWith('DOMContentLoaded', expect.any(Function));
599
- });
600
-
601
- it('calls initTelemetry and connectWithSSRTrace when DOMContentLoaded fires', () => {
602
- // Trigger the DOMContentLoaded callback
603
- if (domContentLoadedCallback) {
604
- expect(() => domContentLoadedCallback()).not.toThrow();
605
- }
606
- });
607
- });
608
-
609
- describe('Telemetry beforeunload event', () => {
610
- let beforeUnloadCallback;
611
-
612
- beforeEach(async () => {
613
- vi.resetModules();
614
-
615
- global.window = {
616
- location: {
617
- pathname: '/performers',
618
- search: '',
619
- hash: '',
620
- href: 'http://localhost/performers',
621
- },
622
- addEventListener: vi.fn((event, callback) => {
623
- if (event === 'beforeunload') {
624
- beforeUnloadCallback = callback;
625
- }
626
- }),
627
- __TRACE_CONTEXT__: null,
628
- };
629
-
630
- global.document = {
631
- readyState: 'complete',
632
- title: 'Test',
633
- referrer: '',
634
- addEventListener: vi.fn(),
635
- };
636
-
637
- global.navigator = {
638
- userAgent: 'test',
639
- language: 'en',
640
- platform: 'test',
641
- };
642
-
643
- await import('./telemetry.js');
644
- });
645
-
646
- afterEach(() => {
647
- vi.unstubAllEnvs();
648
- vi.clearAllMocks();
649
- });
650
-
651
- it('registers beforeunload event listener', () => {
652
- expect(window.addEventListener).toHaveBeenCalledWith('beforeunload', expect.any(Function));
653
- });
654
-
655
- it('calls shutdownTelemetry when beforeunload fires', () => {
656
- if (beforeUnloadCallback) {
657
- expect(() => beforeUnloadCallback()).not.toThrow();
658
- }
659
- });
660
- });
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+
3
+ // Mock all OpenTelemetry modules before importing telemetry
4
+ vi.mock('@opentelemetry/sdk-trace-web', () => ({
5
+ WebTracerProvider: vi.fn().mockImplementation(() => ({
6
+ addSpanProcessor: vi.fn(),
7
+ register: vi.fn(),
8
+ getTracer: vi.fn().mockReturnValue({
9
+ startSpan: vi.fn().mockReturnValue({
10
+ setAttribute: vi.fn(),
11
+ setStatus: vi.fn(),
12
+ recordException: vi.fn(),
13
+ end: vi.fn(),
14
+ name: 'test-span',
15
+ }),
16
+ }),
17
+ shutdown: vi.fn().mockResolvedValue(undefined),
18
+ })),
19
+ }));
20
+
21
+ vi.mock('@opentelemetry/sdk-trace-base', () => ({
22
+ BatchSpanProcessor: vi.fn(),
23
+ }));
24
+
25
+ vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
26
+ OTLPTraceExporter: vi.fn(),
27
+ }));
28
+
29
+ vi.mock('@opentelemetry/resources', () => ({
30
+ Resource: vi.fn(),
31
+ }));
32
+
33
+ vi.mock('@opentelemetry/semantic-conventions', () => ({
34
+ SEMRESATTRS_SERVICE_NAME: 'service.name',
35
+ SEMRESATTRS_SERVICE_VERSION: 'service.version',
36
+ SEMRESATTRS_DEPLOYMENT_ENVIRONMENT: 'deployment.environment',
37
+ }));
38
+
39
+ vi.mock('@opentelemetry/instrumentation-document-load', () => ({
40
+ DocumentLoadInstrumentation: vi.fn().mockImplementation(() => ({
41
+ enable: vi.fn(),
42
+ })),
43
+ }));
44
+
45
+ vi.mock('@opentelemetry/instrumentation-fetch', () => ({
46
+ FetchInstrumentation: vi.fn().mockImplementation(() => ({
47
+ enable: vi.fn(),
48
+ })),
49
+ }));
50
+
51
+ vi.mock('@opentelemetry/instrumentation-xml-http-request', () => ({
52
+ XMLHttpRequestInstrumentation: vi.fn().mockImplementation(() => ({
53
+ enable: vi.fn(),
54
+ })),
55
+ }));
56
+
57
+ vi.mock('@opentelemetry/instrumentation-user-interaction', () => ({
58
+ UserInteractionInstrumentation: vi.fn().mockImplementation(() => ({
59
+ enable: vi.fn(),
60
+ })),
61
+ }));
62
+
63
+ vi.mock('@opentelemetry/context-zone', () => ({
64
+ ZoneContextManager: vi.fn(),
65
+ }));
66
+
67
+ vi.mock('@opentelemetry/propagator-b3', () => ({
68
+ B3Propagator: vi.fn(),
69
+ }));
70
+
71
+ describe('Telemetry Module', () => {
72
+ let telemetry;
73
+ let originalWindow;
74
+ let originalDocument;
75
+ let mockSpan;
76
+
77
+ beforeEach(async () => {
78
+ vi.resetModules();
79
+
80
+ // Save original globals
81
+ originalWindow = global.window;
82
+ originalDocument = global.document;
83
+
84
+ // Setup mock window
85
+ global.window = {
86
+ location: {
87
+ pathname: '/performers',
88
+ search: '?test=1',
89
+ hash: '#section',
90
+ href: 'http://localhost/performers?test=1#section',
91
+ },
92
+ addEventListener: vi.fn(),
93
+ __TRACE_CONTEXT__: null,
94
+ };
95
+
96
+ global.document = {
97
+ readyState: 'complete',
98
+ title: 'Test Page',
99
+ referrer: 'http://localhost/',
100
+ addEventListener: vi.fn(),
101
+ };
102
+
103
+ global.navigator = {
104
+ userAgent: 'test-agent',
105
+ language: 'en-US',
106
+ platform: 'test-platform',
107
+ };
108
+
109
+ // Create mock span
110
+ mockSpan = {
111
+ setAttribute: vi.fn(),
112
+ setStatus: vi.fn(),
113
+ recordException: vi.fn(),
114
+ end: vi.fn(),
115
+ name: 'test-span',
116
+ };
117
+
118
+ // Re-import with fresh mocks
119
+ telemetry = await import('./telemetry.js');
120
+ });
121
+
122
+ afterEach(() => {
123
+ global.window = originalWindow;
124
+ global.document = originalDocument;
125
+ vi.clearAllMocks();
126
+ });
127
+
128
+ describe('initTelemetry', () => {
129
+ it('exports initTelemetry function', () => {
130
+ expect(telemetry.initTelemetry).toBeDefined();
131
+ expect(typeof telemetry.initTelemetry).toBe('function');
132
+ });
133
+
134
+ it('can be called without errors', () => {
135
+ expect(() => telemetry.initTelemetry()).not.toThrow();
136
+ });
137
+ });
138
+
139
+ describe('startSpan', () => {
140
+ it('exports startSpan function', () => {
141
+ expect(telemetry.startSpan).toBeDefined();
142
+ expect(typeof telemetry.startSpan).toBe('function');
143
+ });
144
+
145
+ it('returns null when tracer is not initialized', async () => {
146
+ vi.resetModules();
147
+ const tempWindow = global.window;
148
+ delete global.window;
149
+
150
+ const freshTelemetry = await import('./telemetry.js');
151
+ global.window = tempWindow;
152
+
153
+ const result = freshTelemetry.startSpan('test-span');
154
+ expect(result).toBeNull();
155
+ });
156
+
157
+ it('can be called with name only', () => {
158
+ telemetry.initTelemetry();
159
+ const result = telemetry.startSpan('test-span');
160
+ expect(result === null || typeof result === 'object').toBe(true);
161
+ });
162
+
163
+ it('can be called with name and options', () => {
164
+ telemetry.initTelemetry();
165
+ const result = telemetry.startSpan('test-span', { attributes: { key: 'value' } });
166
+ expect(result === null || typeof result === 'object').toBe(true);
167
+ });
168
+ });
169
+
170
+ describe('endSpan', () => {
171
+ it('exports endSpan function', () => {
172
+ expect(telemetry.endSpan).toBeDefined();
173
+ expect(typeof telemetry.endSpan).toBe('function');
174
+ });
175
+
176
+ it('handles null span gracefully', () => {
177
+ expect(() => telemetry.endSpan(null)).not.toThrow();
178
+ });
179
+
180
+ it('handles undefined span gracefully', () => {
181
+ expect(() => telemetry.endSpan(undefined)).not.toThrow();
182
+ });
183
+
184
+ it('can end a span with default status', () => {
185
+ expect(() => telemetry.endSpan(mockSpan)).not.toThrow();
186
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 0 });
187
+ expect(mockSpan.end).toHaveBeenCalled();
188
+ });
189
+
190
+ it('can end a span with custom status', () => {
191
+ expect(() => telemetry.endSpan(mockSpan, { code: 2, message: 'error' })).not.toThrow();
192
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 2, message: 'error' });
193
+ });
194
+ });
195
+
196
+ describe('trackPageView', () => {
197
+ it('exports trackPageView function', () => {
198
+ expect(telemetry.trackPageView).toBeDefined();
199
+ expect(typeof telemetry.trackPageView).toBe('function');
200
+ });
201
+
202
+ it('can be called without errors', () => {
203
+ expect(() => telemetry.trackPageView('/test-page')).not.toThrow();
204
+ });
205
+
206
+ it('can be called with page path and title', () => {
207
+ expect(() => telemetry.trackPageView('/test-page', 'Test Page Title')).not.toThrow();
208
+ });
209
+ });
210
+
211
+ describe('trackEvent', () => {
212
+ it('exports trackEvent function', () => {
213
+ expect(telemetry.trackEvent).toBeDefined();
214
+ expect(typeof telemetry.trackEvent).toBe('function');
215
+ });
216
+
217
+ it('can be called with event name only', () => {
218
+ expect(() => telemetry.trackEvent('button_click')).not.toThrow();
219
+ });
220
+
221
+ it('can be called with event name and attributes', () => {
222
+ expect(() => telemetry.trackEvent('button_click', { button_id: 'submit' })).not.toThrow();
223
+ });
224
+ });
225
+
226
+ describe('trackPerformerAction', () => {
227
+ it('exports trackPerformerAction function', () => {
228
+ expect(telemetry.trackPerformerAction).toBeDefined();
229
+ expect(typeof telemetry.trackPerformerAction).toBe('function');
230
+ });
231
+
232
+ it('can be called with action only', () => {
233
+ expect(() => telemetry.trackPerformerAction('profile_update')).not.toThrow();
234
+ });
235
+
236
+ it('can be called with action and metadata', () => {
237
+ expect(() => telemetry.trackPerformerAction('profile_update', { field: 'bio' })).not.toThrow();
238
+ });
239
+ });
240
+
241
+ describe('trackError', () => {
242
+ it('exports trackError function', () => {
243
+ expect(telemetry.trackError).toBeDefined();
244
+ expect(typeof telemetry.trackError).toBe('function');
245
+ });
246
+
247
+ it('can be called with Error object', () => {
248
+ const error = new Error('Test error');
249
+ expect(() => telemetry.trackError(error)).not.toThrow();
250
+ });
251
+
252
+ it('can be called with Error and context', () => {
253
+ const error = new Error('Test error');
254
+ expect(() => telemetry.trackError(error, { component: 'TestComponent' })).not.toThrow();
255
+ });
256
+
257
+ it('handles error without stack trace', () => {
258
+ const error = { message: 'Simple error', name: 'SimpleError' };
259
+ expect(() => telemetry.trackError(error)).not.toThrow();
260
+ });
261
+
262
+ it('handles string error', () => {
263
+ expect(() => telemetry.trackError('String error message')).not.toThrow();
264
+ });
265
+ });
266
+
267
+ describe('trackAPICall', () => {
268
+ it('exports trackAPICall function', () => {
269
+ expect(telemetry.trackAPICall).toBeDefined();
270
+ expect(typeof telemetry.trackAPICall).toBe('function');
271
+ });
272
+
273
+ it('can be called with basic parameters', () => {
274
+ expect(() => telemetry.trackAPICall('GET', '/api/users', 200, 150)).not.toThrow();
275
+ });
276
+
277
+ it('can be called with additional attributes', () => {
278
+ expect(() => telemetry.trackAPICall('POST', '/api/users', 201, 200, { user_id: '123' })).not.toThrow();
279
+ });
280
+
281
+ it('handles error status codes', () => {
282
+ expect(() => telemetry.trackAPICall('GET', '/api/users', 500, 100)).not.toThrow();
283
+ });
284
+
285
+ it('handles 4xx status codes', () => {
286
+ expect(() => telemetry.trackAPICall('GET', '/api/users', 404, 50)).not.toThrow();
287
+ });
288
+ });
289
+
290
+ describe('trackUserAction', () => {
291
+ it('exports trackUserAction function', () => {
292
+ expect(telemetry.trackUserAction).toBeDefined();
293
+ expect(typeof telemetry.trackUserAction).toBe('function');
294
+ });
295
+
296
+ it('can be called with action only', () => {
297
+ expect(() => telemetry.trackUserAction('login')).not.toThrow();
298
+ });
299
+
300
+ it('can be called with action and metadata', () => {
301
+ expect(() => telemetry.trackUserAction('login', { method: 'email' })).not.toThrow();
302
+ });
303
+ });
304
+
305
+ describe('shutdownTelemetry', () => {
306
+ it('exports shutdownTelemetry function', () => {
307
+ expect(telemetry.shutdownTelemetry).toBeDefined();
308
+ expect(typeof telemetry.shutdownTelemetry).toBe('function');
309
+ });
310
+
311
+ it('can be called without errors', async () => {
312
+ await expect(telemetry.shutdownTelemetry()).resolves.not.toThrow();
313
+ });
314
+
315
+ it('handles shutdown when not initialized', async () => {
316
+ vi.resetModules();
317
+ const tempWindow = global.window;
318
+ delete global.window;
319
+
320
+ const freshTelemetry = await import('./telemetry.js');
321
+ global.window = tempWindow;
322
+
323
+ await expect(freshTelemetry.shutdownTelemetry()).resolves.not.toThrow();
324
+ });
325
+ });
326
+
327
+ describe('Module auto-initialization', () => {
328
+ it('adds DOMContentLoaded listener when document is loading', async () => {
329
+ vi.resetModules();
330
+
331
+ global.document = {
332
+ readyState: 'loading',
333
+ addEventListener: vi.fn(),
334
+ title: 'Test',
335
+ referrer: '',
336
+ };
337
+
338
+ await import('./telemetry.js');
339
+
340
+ expect(global.document.addEventListener).toHaveBeenCalledWith(
341
+ 'DOMContentLoaded',
342
+ expect.any(Function)
343
+ );
344
+ });
345
+
346
+ it('initializes immediately when document is ready', async () => {
347
+ vi.resetModules();
348
+
349
+ global.document = {
350
+ readyState: 'complete',
351
+ title: 'Test',
352
+ referrer: '',
353
+ addEventListener: vi.fn(),
354
+ };
355
+
356
+ await import('./telemetry.js');
357
+ });
358
+
359
+ it('adds beforeunload listener for cleanup', async () => {
360
+ vi.resetModules();
361
+
362
+ global.window.addEventListener = vi.fn();
363
+
364
+ await import('./telemetry.js');
365
+
366
+ expect(global.window.addEventListener).toHaveBeenCalledWith(
367
+ 'beforeunload',
368
+ expect.any(Function)
369
+ );
370
+ });
371
+ });
372
+
373
+ describe('SSR trace context connection', () => {
374
+ it('handles missing SSR trace context', async () => {
375
+ vi.resetModules();
376
+
377
+ global.window.__TRACE_CONTEXT__ = null;
378
+
379
+ await expect(import('./telemetry.js')).resolves.not.toThrow();
380
+ });
381
+
382
+ it('handles SSR trace context when present', async () => {
383
+ vi.resetModules();
384
+
385
+ global.window.__TRACE_CONTEXT__ = {
386
+ traceId: 'test-trace-id',
387
+ spanId: 'test-span-id',
388
+ traceFlags: 1,
389
+ };
390
+
391
+ await expect(import('./telemetry.js')).resolves.not.toThrow();
392
+ });
393
+ });
394
+ });
395
+
396
+ describe('Telemetry with traces disabled', () => {
397
+ let telemetry;
398
+
399
+ beforeEach(async () => {
400
+ vi.resetModules();
401
+
402
+ vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'false');
403
+
404
+ global.window = {
405
+ location: {
406
+ pathname: '/performers',
407
+ search: '',
408
+ hash: '',
409
+ href: 'http://localhost/performers',
410
+ },
411
+ addEventListener: vi.fn(),
412
+ __TRACE_CONTEXT__: null,
413
+ };
414
+
415
+ global.document = {
416
+ readyState: 'complete',
417
+ title: 'Test',
418
+ referrer: '',
419
+ addEventListener: vi.fn(),
420
+ };
421
+
422
+ global.navigator = {
423
+ userAgent: 'test',
424
+ language: 'en',
425
+ platform: 'test',
426
+ };
427
+
428
+ telemetry = await import('./telemetry.js');
429
+ });
430
+
431
+ afterEach(() => {
432
+ vi.unstubAllEnvs();
433
+ vi.clearAllMocks();
434
+ });
435
+
436
+ it('initTelemetry returns early when tracing is disabled', () => {
437
+ const consoleSpy = vi.spyOn(console, 'log');
438
+ telemetry.initTelemetry();
439
+ expect(consoleSpy).toHaveBeenCalledWith('[Telemetry] Tracing is disabled');
440
+ });
441
+ });
442
+
443
+ describe('Telemetry debug mode', () => {
444
+ let telemetry;
445
+
446
+ beforeEach(async () => {
447
+ vi.resetModules();
448
+
449
+ vi.stubEnv('VITE_OTEL_DEBUG', 'true');
450
+
451
+ global.window = {
452
+ location: {
453
+ pathname: '/performers',
454
+ search: '',
455
+ hash: '',
456
+ href: 'http://localhost/performers',
457
+ },
458
+ addEventListener: vi.fn(),
459
+ __TRACE_CONTEXT__: null,
460
+ };
461
+
462
+ global.document = {
463
+ readyState: 'complete',
464
+ title: 'Test',
465
+ referrer: '',
466
+ addEventListener: vi.fn(),
467
+ };
468
+
469
+ global.navigator = {
470
+ userAgent: 'test',
471
+ language: 'en',
472
+ platform: 'test',
473
+ };
474
+
475
+ telemetry = await import('./telemetry.js');
476
+ });
477
+
478
+ afterEach(() => {
479
+ vi.unstubAllEnvs();
480
+ vi.clearAllMocks();
481
+ });
482
+
483
+ it('can initialize with debug mode enabled', () => {
484
+ expect(() => telemetry.initTelemetry()).not.toThrow();
485
+ });
486
+ });
487
+
488
+ describe('Telemetry shutdown error handling', () => {
489
+ let telemetry;
490
+
491
+ beforeEach(async () => {
492
+ vi.resetModules();
493
+
494
+ // Mock shutdown to throw error
495
+ vi.mock('@opentelemetry/sdk-trace-web', () => ({
496
+ WebTracerProvider: vi.fn().mockImplementation(() => ({
497
+ addSpanProcessor: vi.fn(),
498
+ register: vi.fn(),
499
+ getTracer: vi.fn().mockReturnValue({
500
+ startSpan: vi.fn().mockReturnValue({
501
+ setAttribute: vi.fn(),
502
+ setStatus: vi.fn(),
503
+ recordException: vi.fn(),
504
+ end: vi.fn(),
505
+ name: 'test-span',
506
+ }),
507
+ }),
508
+ shutdown: vi.fn().mockRejectedValue(new Error('Shutdown failed')),
509
+ })),
510
+ }));
511
+
512
+ global.window = {
513
+ location: {
514
+ pathname: '/performers',
515
+ search: '',
516
+ hash: '',
517
+ href: 'http://localhost/performers',
518
+ },
519
+ addEventListener: vi.fn(),
520
+ __TRACE_CONTEXT__: null,
521
+ };
522
+
523
+ global.document = {
524
+ readyState: 'complete',
525
+ title: 'Test',
526
+ referrer: '',
527
+ addEventListener: vi.fn(),
528
+ };
529
+
530
+ global.navigator = {
531
+ userAgent: 'test',
532
+ language: 'en',
533
+ platform: 'test',
534
+ };
535
+
536
+ telemetry = await import('./telemetry.js');
537
+ });
538
+
539
+ afterEach(() => {
540
+ vi.unstubAllEnvs();
541
+ vi.clearAllMocks();
542
+ });
543
+
544
+ it('handles shutdown error gracefully', async () => {
545
+ const consoleErrorSpy = vi.spyOn(console, 'error');
546
+ telemetry.initTelemetry();
547
+ await telemetry.shutdownTelemetry();
548
+ // Should not throw, just log error
549
+ expect(consoleErrorSpy).toBeDefined();
550
+ });
551
+ });
552
+
553
+ describe('Telemetry DOMContentLoaded event', () => {
554
+ let telemetry;
555
+ let domContentLoadedCallback;
556
+
557
+ beforeEach(async () => {
558
+ vi.resetModules();
559
+
560
+ global.window = {
561
+ location: {
562
+ pathname: '/performers',
563
+ search: '',
564
+ hash: '',
565
+ href: 'http://localhost/performers',
566
+ },
567
+ addEventListener: vi.fn(),
568
+ __TRACE_CONTEXT__: null,
569
+ };
570
+
571
+ // Mock document with loading state
572
+ global.document = {
573
+ readyState: 'loading',
574
+ title: 'Test',
575
+ referrer: '',
576
+ addEventListener: vi.fn((event, callback) => {
577
+ if (event === 'DOMContentLoaded') {
578
+ domContentLoadedCallback = callback;
579
+ }
580
+ }),
581
+ };
582
+
583
+ global.navigator = {
584
+ userAgent: 'test',
585
+ language: 'en',
586
+ platform: 'test',
587
+ };
588
+
589
+ telemetry = await import('./telemetry.js');
590
+ });
591
+
592
+ afterEach(() => {
593
+ vi.unstubAllEnvs();
594
+ vi.clearAllMocks();
595
+ });
596
+
597
+ it('registers DOMContentLoaded event listener when document is loading', () => {
598
+ expect(document.addEventListener).toHaveBeenCalledWith('DOMContentLoaded', expect.any(Function));
599
+ });
600
+
601
+ it('calls initTelemetry and connectWithSSRTrace when DOMContentLoaded fires', () => {
602
+ // Trigger the DOMContentLoaded callback
603
+ if (domContentLoadedCallback) {
604
+ expect(() => domContentLoadedCallback()).not.toThrow();
605
+ }
606
+ });
607
+ });
608
+
609
+ describe('Telemetry beforeunload event', () => {
610
+ let beforeUnloadCallback;
611
+
612
+ beforeEach(async () => {
613
+ vi.resetModules();
614
+
615
+ global.window = {
616
+ location: {
617
+ pathname: '/performers',
618
+ search: '',
619
+ hash: '',
620
+ href: 'http://localhost/performers',
621
+ },
622
+ addEventListener: vi.fn((event, callback) => {
623
+ if (event === 'beforeunload') {
624
+ beforeUnloadCallback = callback;
625
+ }
626
+ }),
627
+ __TRACE_CONTEXT__: null,
628
+ };
629
+
630
+ global.document = {
631
+ readyState: 'complete',
632
+ title: 'Test',
633
+ referrer: '',
634
+ addEventListener: vi.fn(),
635
+ };
636
+
637
+ global.navigator = {
638
+ userAgent: 'test',
639
+ language: 'en',
640
+ platform: 'test',
641
+ };
642
+
643
+ await import('./telemetry.js');
644
+ });
645
+
646
+ afterEach(() => {
647
+ vi.unstubAllEnvs();
648
+ vi.clearAllMocks();
649
+ });
650
+
651
+ it('registers beforeunload event listener', () => {
652
+ expect(window.addEventListener).toHaveBeenCalledWith('beforeunload', expect.any(Function));
653
+ });
654
+
655
+ it('calls shutdownTelemetry when beforeunload fires', () => {
656
+ if (beforeUnloadCallback) {
657
+ expect(() => beforeUnloadCallback()).not.toThrow();
658
+ }
659
+ });
660
+ });