@getmicdrop/svelte-components 5.9.6 → 5.10.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 (278) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
  3. package/dist/calendar/FAQs/FAQs.svelte +75 -75
  4. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
  5. package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
  6. package/dist/calendar/PublicCard/PublicCard.svelte +146 -146
  7. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  8. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  9. package/dist/calendar/index.js +15 -15
  10. package/dist/components/Heading.svelte +60 -60
  11. package/dist/components/Layout/AppShell.svelte +104 -104
  12. package/dist/components/Layout/ContentSection.svelte +80 -80
  13. package/dist/components/Layout/Grid.svelte +101 -101
  14. package/dist/components/Layout/Heading.svelte +81 -81
  15. package/dist/components/Layout/PageContainer.svelte +69 -69
  16. package/dist/components/Layout/Responsive.svelte +75 -75
  17. package/dist/components/Layout/Section.svelte +80 -80
  18. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  19. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  20. package/dist/components/Layout/Sidebar.svelte +108 -108
  21. package/dist/components/Layout/Stack.svelte +52 -52
  22. package/dist/components/Layout/Text.svelte +87 -87
  23. package/dist/components/Layout/TwoColumn.svelte +108 -108
  24. package/dist/components/Text.svelte +53 -53
  25. package/dist/config.js +5 -5
  26. package/dist/config.spec.js +29 -29
  27. package/dist/constants/formOptions.js +48 -48
  28. package/dist/constants/validation.js +91 -91
  29. package/dist/constants/validation.spec.js +64 -64
  30. package/dist/index.js +51 -51
  31. package/dist/index.spec.js +370 -370
  32. package/dist/patterns/data/DataGrid.svelte +45 -45
  33. package/dist/patterns/data/DataList.svelte +24 -24
  34. package/dist/patterns/data/DataTable.svelte +45 -45
  35. package/dist/patterns/data/index.js +4 -4
  36. package/dist/patterns/forms/FormActions.spec.js +95 -95
  37. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  38. package/dist/patterns/forms/FormActions.svelte +46 -46
  39. package/dist/patterns/forms/FormGrid.svelte +33 -33
  40. package/dist/patterns/forms/FormSection.svelte +32 -32
  41. package/dist/patterns/forms/FormValidationSummary.stories.svelte +97 -97
  42. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  43. package/dist/patterns/forms/index.js +5 -5
  44. package/dist/patterns/index.js +18 -18
  45. package/dist/patterns/layout/Sidebar.svelte +39 -39
  46. package/dist/patterns/layout/Stack.svelte +61 -61
  47. package/dist/patterns/layout/index.js +29 -29
  48. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  49. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  50. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  51. package/dist/patterns/navigation/Header.svelte +255 -255
  52. package/dist/patterns/navigation/index.js +3 -3
  53. package/dist/patterns/page/PageHeader.svelte +49 -49
  54. package/dist/patterns/page/PageLayout.svelte +40 -40
  55. package/dist/patterns/page/PageLoader.spec.js +57 -57
  56. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  57. package/dist/patterns/page/PageLoader.svelte +53 -53
  58. package/dist/patterns/page/SectionHeader.svelte +51 -51
  59. package/dist/patterns/page/index.js +5 -5
  60. package/dist/presets/badges.js +112 -112
  61. package/dist/presets/buttons.js +76 -76
  62. package/dist/presets/index.js +9 -9
  63. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  64. package/dist/primitives/Accordion/Accordion.svelte +62 -62
  65. package/dist/primitives/Accordion/AccordionItem.spec.js +2 -2
  66. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  67. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -107
  68. package/dist/primitives/Alert/Alert.spec.js +173 -173
  69. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  70. package/dist/primitives/Alert/Alert.svelte +64 -64
  71. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  72. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  73. package/dist/primitives/Badges/Badge.spec.js +144 -144
  74. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  75. package/dist/primitives/Badges/Badge.svelte +99 -99
  76. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
  77. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  78. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  79. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
  80. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  81. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +98 -98
  82. package/dist/primitives/Button/Button.spec.js +223 -223
  83. package/dist/primitives/Button/Button.stories.svelte +76 -76
  84. package/dist/primitives/Button/Button.svelte +283 -283
  85. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  86. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  87. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  88. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  89. package/dist/primitives/Card.spec.js +49 -49
  90. package/dist/primitives/Card.stories.svelte +22 -22
  91. package/dist/primitives/Card.svelte +28 -28
  92. package/dist/primitives/Checkbox/Checkbox.spec.js +2 -2
  93. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  94. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  95. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  96. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  97. package/dist/primitives/DarkModeToggle.svelte +136 -136
  98. package/dist/primitives/Drawer/Drawer.stories.svelte +100 -100
  99. package/dist/primitives/Drawer/Drawer.svelte +236 -236
  100. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  101. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  102. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  103. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  104. package/dist/primitives/Helper/Helper.svelte +33 -33
  105. package/dist/primitives/Icons/ArrowLeft.svelte +21 -21
  106. package/dist/primitives/Icons/ArrowRight.svelte +21 -21
  107. package/dist/primitives/Icons/Availability.svelte +27 -27
  108. package/dist/primitives/Icons/Back.svelte +27 -27
  109. package/dist/primitives/Icons/CheckCircle.svelte +19 -19
  110. package/dist/primitives/Icons/CheckCircleOutline.svelte +28 -28
  111. package/dist/primitives/Icons/ChevronLeft.svelte +17 -17
  112. package/dist/primitives/Icons/ChevronRight.svelte +17 -17
  113. package/dist/primitives/Icons/Copy.svelte +28 -28
  114. package/dist/primitives/Icons/Cross.svelte +18 -18
  115. package/dist/primitives/Icons/DownArrow.svelte +21 -21
  116. package/dist/primitives/Icons/ErrorCircle.svelte +19 -19
  117. package/dist/primitives/Icons/FacebookIcon.svelte +15 -15
  118. package/dist/primitives/Icons/Home.svelte +28 -28
  119. package/dist/primitives/Icons/Icon.spec.js +175 -175
  120. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  121. package/dist/primitives/Icons/Icon.svelte +79 -79
  122. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  123. package/dist/primitives/Icons/ImageOutline.svelte +21 -21
  124. package/dist/primitives/Icons/Info.svelte +20 -20
  125. package/dist/primitives/Icons/InstagramIcon.svelte +21 -21
  126. package/dist/primitives/Icons/LogoInstagram.svelte +15 -15
  127. package/dist/primitives/Icons/Message.svelte +28 -28
  128. package/dist/primitives/Icons/MoonIcon.svelte +18 -18
  129. package/dist/primitives/Icons/More.svelte +34 -34
  130. package/dist/primitives/Icons/MoreHori.spec.js +67 -67
  131. package/dist/primitives/Icons/MoreHori.svelte +35 -35
  132. package/dist/primitives/Icons/Notification.svelte +27 -27
  133. package/dist/primitives/Icons/Payment.svelte +27 -27
  134. package/dist/primitives/Icons/Profile.svelte +34 -34
  135. package/dist/primitives/Icons/Reload.svelte +42 -42
  136. package/dist/primitives/Icons/Shows.svelte +34 -34
  137. package/dist/primitives/Icons/Signout.svelte +34 -34
  138. package/dist/primitives/Icons/SunIcon.svelte +21 -21
  139. package/dist/primitives/Icons/TiktokIcon.svelte +15 -15
  140. package/dist/primitives/Icons/TrashBinOutline.svelte +21 -21
  141. package/dist/primitives/Icons/TwitterIcon.svelte +15 -15
  142. package/dist/primitives/Icons/WarningIcon.spec.js +30 -30
  143. package/dist/primitives/Icons/WarningIcon.svelte +24 -24
  144. package/dist/primitives/Input/Input.spec.js +573 -573
  145. package/dist/primitives/Input/Input.stories.svelte +139 -139
  146. package/dist/primitives/Input/Input.svelte +423 -433
  147. package/dist/primitives/Input/Select.spec.js +218 -218
  148. package/dist/primitives/Input/Select.stories.svelte +112 -112
  149. package/dist/primitives/Input/Select.svelte +252 -252
  150. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  151. package/dist/primitives/Input/Textarea.svelte +105 -105
  152. package/dist/primitives/Label/Label.svelte +37 -37
  153. package/dist/primitives/Modal/Modal.spec.js +99 -99
  154. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  155. package/dist/primitives/Modal/Modal.svelte +157 -157
  156. package/dist/primitives/NumberInput/NumberInput.svelte +105 -105
  157. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  158. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  159. package/dist/primitives/Radio/Radio.spec.js +2 -2
  160. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  161. package/dist/primitives/Radio/Radio.svelte +67 -67
  162. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  163. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  164. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  165. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  166. package/dist/primitives/Skeleton/Skeleton.svelte +46 -46
  167. package/dist/primitives/Spinner/Spinner.spec.js +71 -71
  168. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  169. package/dist/primitives/Spinner/Spinner.svelte +44 -44
  170. package/dist/primitives/Tabs/TabItem.svelte +52 -52
  171. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  172. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  173. package/dist/primitives/Toggle.spec.js +146 -143
  174. package/dist/primitives/Toggle.stories.svelte +92 -92
  175. package/dist/primitives/Toggle.svelte +131 -70
  176. package/dist/primitives/Toggle.svelte.d.ts.map +1 -1
  177. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  178. package/dist/primitives/Typography/Typography.svelte +53 -53
  179. package/dist/primitives/ValidationError.spec.js +103 -103
  180. package/dist/primitives/ValidationError.stories.svelte +112 -112
  181. package/dist/primitives/ValidationError.svelte +29 -29
  182. package/dist/primitives/index.js +92 -92
  183. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  184. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  185. package/dist/recipes/CropImage/CropImage.svelte +219 -219
  186. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  187. package/dist/recipes/ImageUploader/ImageUploader.svelte +970 -970
  188. package/dist/recipes/SuperLogin/SuperLogin.svelte +1 -1
  189. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  190. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +66 -66
  191. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  192. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +113 -113
  193. package/dist/recipes/feedback/ErrorDisplay.svelte +67 -67
  194. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  195. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +176 -176
  196. package/dist/recipes/feedback/index.js +4 -4
  197. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  198. package/dist/recipes/fields/FormField.svelte +58 -58
  199. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  200. package/dist/recipes/fields/SelectField.svelte +82 -82
  201. package/dist/recipes/fields/TextareaField.svelte +101 -101
  202. package/dist/recipes/fields/ToggleField.svelte +60 -60
  203. package/dist/recipes/fields/index.js +7 -7
  204. package/dist/recipes/index.js +24 -24
  205. package/dist/recipes/inputs/MultiSelect.spec.js +260 -260
  206. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  207. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  208. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  209. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  210. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  211. package/dist/recipes/inputs/PasswordInput.svelte +121 -121
  212. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
  213. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +170 -170
  214. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +344 -344
  215. package/dist/recipes/inputs/Search.svelte +102 -102
  216. package/dist/recipes/inputs/SelectDropdown.svelte +171 -171
  217. package/dist/recipes/inputs/index.js +8 -8
  218. package/dist/recipes/modals/AlertModal.svelte +130 -130
  219. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
  220. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  221. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  222. package/dist/recipes/modals/InputModal.svelte +182 -182
  223. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  224. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  225. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  226. package/dist/recipes/modals/StatusModal.svelte +206 -206
  227. package/dist/recipes/modals/index.js +7 -7
  228. package/dist/services/EventService.js +75 -75
  229. package/dist/services/EventService.spec.js +217 -217
  230. package/dist/services/ShowService.d.ts +46 -46
  231. package/dist/services/ShowService.js +143 -143
  232. package/dist/services/ShowService.spec.js +345 -345
  233. package/dist/stores/auth.d.ts +8 -8
  234. package/dist/stores/index.js +9 -9
  235. package/dist/stores/toaster.d.ts +3 -3
  236. package/dist/stores/toaster.js +13 -13
  237. package/dist/stores/toaster.spec.js +59 -59
  238. package/dist/stories/ButtonAuditDashboard.spec.js +1 -1
  239. package/dist/stories/ButtonAuditDashboard.svelte +25 -25
  240. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  241. package/dist/stories/ButtonAuditReview.svelte +427 -427
  242. package/dist/stories/ButtonGridView.svelte +1 -1
  243. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  244. package/dist/stories/PatternsGallery.svelte +399 -399
  245. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  246. package/dist/stories/PrimitivesGallery.svelte +752 -752
  247. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  248. package/dist/stories/RecipesGallery.svelte +471 -471
  249. package/dist/stories/button-audit-manifest.json +11186 -11186
  250. package/dist/tailwind/preset.cjs +82 -82
  251. package/dist/telemetry.js +405 -405
  252. package/dist/telemetry.server.js +212 -212
  253. package/dist/telemetry.server.spec.js +438 -438
  254. package/dist/telemetry.spec.js +1169 -1169
  255. package/dist/tokens/tokens.css +87 -87
  256. package/dist/tokens/typography-base.css +163 -163
  257. package/dist/tokens/utilities.css +353 -353
  258. package/dist/utils/__tests__/auth.test.js +431 -431
  259. package/dist/utils/apiConfig.d.ts +29 -29
  260. package/dist/utils/apiConfig.js +120 -120
  261. package/dist/utils/apiConfig.spec.js +219 -219
  262. package/dist/utils/auth.d.ts +46 -46
  263. package/dist/utils/auth.js +195 -195
  264. package/dist/utils/greetings.js +187 -187
  265. package/dist/utils/greetings.spec.js +337 -337
  266. package/dist/utils/imageValidation.js +121 -121
  267. package/dist/utils/imageValidation.spec.js +223 -223
  268. package/dist/utils/portal.d.ts +11 -11
  269. package/dist/utils/portal.js +25 -25
  270. package/dist/utils/portal.spec.js +143 -143
  271. package/dist/utils/transitions.js +4 -4
  272. package/dist/utils/utils/utils.d.ts +72 -72
  273. package/dist/utils/utils/utils.js +3 -3
  274. package/dist/utils/utils/utils.spec.js +698 -698
  275. package/dist/utils/utils.d.ts +97 -97
  276. package/dist/utils/utils.js +693 -693
  277. package/dist/utils/utils.spec.js +643 -643
  278. package/package.json +297 -297
@@ -1,438 +1,438 @@
1
- // @ts-nocheck
2
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
-
4
- // Vitest 4.x requires class syntax for constructor mocks
5
- // Mock all OpenTelemetry modules
6
- vi.mock('@opentelemetry/instrumentation', () => ({
7
- registerInstrumentations: vi.fn(),
8
- }));
9
-
10
- vi.mock('@opentelemetry/sdk-node', () => ({
11
- NodeSDK: class MockNodeSDK {
12
- constructor() {
13
- this.start = vi.fn();
14
- this.shutdown = vi.fn(() => Promise.resolve());
15
- }
16
- },
17
- }));
18
-
19
- vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
20
- OTLPTraceExporter: class MockOTLPTraceExporter {},
21
- }));
22
-
23
- vi.mock('@opentelemetry/resources', () => ({
24
- Resource: class MockResource {},
25
- }));
26
-
27
- vi.mock('@opentelemetry/semantic-conventions', () => ({
28
- SEMRESATTRS_SERVICE_NAME: 'service.name',
29
- SEMRESATTRS_SERVICE_VERSION: 'service.version',
30
- SEMRESATTRS_DEPLOYMENT_ENVIRONMENT: 'deployment.environment',
31
- }));
32
-
33
- vi.mock('@opentelemetry/instrumentation-http', () => ({
34
- HttpInstrumentation: class MockHttpInstrumentation {},
35
- }));
36
-
37
- vi.mock('@opentelemetry/instrumentation-fetch', () => ({
38
- FetchInstrumentation: class MockFetchInstrumentation {},
39
- }));
40
-
41
- vi.mock('@opentelemetry/auto-instrumentations-node', () => ({
42
- getNodeAutoInstrumentations: vi.fn(() => []),
43
- }));
44
-
45
- const mockSpan = {
46
- setAttribute: vi.fn(),
47
- setAttributes: vi.fn(),
48
- setStatus: vi.fn(),
49
- recordException: vi.fn(),
50
- end: vi.fn(),
51
- spanContext: vi.fn(() => ({
52
- traceId: 'test-trace-id',
53
- spanId: 'test-span-id',
54
- })),
55
- };
56
-
57
- const mockTracer = {
58
- startSpan: vi.fn(() => mockSpan),
59
- };
60
-
61
- const mockContext = {
62
- active: vi.fn(() => ({})),
63
- };
64
-
65
- const mockPropagation = {
66
- extract: vi.fn(() => ({})),
67
- inject: vi.fn(),
68
- };
69
-
70
- vi.mock('@opentelemetry/api', () => ({
71
- trace: {
72
- getTracer: vi.fn(() => mockTracer),
73
- },
74
- context: mockContext,
75
- propagation: mockPropagation,
76
- }));
77
-
78
- describe('telemetry.server.js', () => {
79
- let telemetryServer;
80
-
81
- beforeEach(async () => {
82
- vi.resetModules();
83
- vi.clearAllMocks();
84
-
85
- // Ensure we're in a server environment
86
- delete global.window;
87
-
88
- // Stub environment variables
89
- vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'true');
90
- vi.stubEnv('VITE_OTEL_SERVICE_NAME', 'test-service');
91
- vi.stubEnv('VITE_ENVIRONMENT', 'test');
92
-
93
- telemetryServer = await import('./telemetry.server.js');
94
- });
95
-
96
- afterEach(() => {
97
- vi.unstubAllEnvs();
98
- });
99
-
100
- describe('initServerTelemetry', () => {
101
- it('initializes server telemetry when enabled', async () => {
102
- const consoleSpy = vi.spyOn(console, 'log');
103
-
104
- // Module auto-initializes, calling initServerTelemetry will re-init
105
- telemetryServer.initServerTelemetry();
106
-
107
- expect(consoleSpy).toHaveBeenCalled();
108
- });
109
-
110
- it('logs disabled message when tracing is disabled', async () => {
111
- vi.resetModules();
112
- vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'false');
113
-
114
- const consoleSpy = vi.spyOn(console, 'log');
115
-
116
- telemetryServer = await import('./telemetry.server.js');
117
- telemetryServer.initServerTelemetry();
118
-
119
- expect(consoleSpy).toHaveBeenCalledWith(
120
- '[Server Telemetry] Tracing is disabled'
121
- );
122
- });
123
- });
124
-
125
- describe('createSSRSpan', () => {
126
- it('creates SSR span with correct name and attributes', () => {
127
- const mockRequest = {
128
- method: 'GET',
129
- url: 'http://localhost:3000/test',
130
- headers: {
131
- 'user-agent': 'test-agent',
132
- referer: 'http://localhost:3000/',
133
- },
134
- };
135
-
136
- const span = telemetryServer.createSSRSpan(
137
- 'ssr.test',
138
- mockRequest,
139
- { custom: 'attribute' }
140
- );
141
-
142
- expect(mockTracer.startSpan).toHaveBeenCalledWith('ssr.test', {
143
- attributes: {
144
- 'span.kind': 'server',
145
- 'ssr.type': 'page_load',
146
- 'portal.type': 'performers',
147
- 'http.method': 'GET',
148
- 'http.url': 'http://localhost:3000/test',
149
- 'http.user_agent': 'test-agent',
150
- 'http.referer': 'http://localhost:3000/',
151
- custom: 'attribute',
152
- },
153
- });
154
-
155
- expect(span).toBeDefined();
156
- });
157
-
158
- it('handles null request gracefully', () => {
159
- const span = telemetryServer.createSSRSpan('ssr.null-request', null);
160
-
161
- expect(mockTracer.startSpan).toHaveBeenCalledWith('ssr.null-request', {
162
- attributes: {
163
- 'span.kind': 'server',
164
- 'ssr.type': 'page_load',
165
- 'portal.type': 'performers',
166
- 'http.method': 'GET',
167
- 'http.url': undefined,
168
- 'http.user_agent': undefined,
169
- 'http.referer': undefined,
170
- },
171
- });
172
-
173
- expect(span).toBeDefined();
174
- });
175
- });
176
-
177
- describe('trackPerformerSSRDataLoad', () => {
178
- it('wraps load function and tracks successful execution', async () => {
179
- const mockLoadFn = vi.fn().mockResolvedValue({
180
- performer: { id: 1, name: 'Test Performer', email: 'test@test.com' },
181
- });
182
-
183
- const mockEvent = {
184
- request: {
185
- method: 'GET',
186
- url: 'http://localhost:3000/performer/1',
187
- headers: {},
188
- },
189
- route: { id: '/performer/[id]' },
190
- };
191
-
192
- const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
193
- mockLoadFn,
194
- 'performer-load'
195
- );
196
-
197
- const result = await wrappedFn(mockEvent);
198
-
199
- expect(mockLoadFn).toHaveBeenCalledWith(mockEvent);
200
- expect(result.performer.id).toBe(1);
201
- expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
202
- expect(mockSpan.setAttributes).toHaveBeenCalledWith({
203
- 'performer.id': 1,
204
- 'performer.name': 'Test Performer',
205
- 'performer.email': 'test@test.com',
206
- });
207
- expect(mockSpan.end).toHaveBeenCalled();
208
- });
209
-
210
- it('tracks errors and re-throws them', async () => {
211
- const testError = new Error('Load failed');
212
- const mockLoadFn = vi.fn().mockRejectedValue(testError);
213
-
214
- const mockEvent = {
215
- request: {
216
- method: 'GET',
217
- url: 'http://localhost:3000/test',
218
- headers: {},
219
- },
220
- route: { id: '/test' },
221
- };
222
-
223
- const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
224
- mockLoadFn,
225
- 'test-load'
226
- );
227
-
228
- await expect(wrappedFn(mockEvent)).rejects.toThrow('Load failed');
229
-
230
- expect(mockSpan.recordException).toHaveBeenCalledWith(testError);
231
- expect(mockSpan.setStatus).toHaveBeenCalledWith({
232
- code: 2,
233
- message: 'Load failed',
234
- });
235
- expect(mockSpan.end).toHaveBeenCalled();
236
- });
237
-
238
- it('handles results without performer data', async () => {
239
- const mockLoadFn = vi.fn().mockResolvedValue({ data: 'test' });
240
-
241
- const mockEvent = {
242
- request: {
243
- method: 'GET',
244
- url: 'http://localhost:3000/test',
245
- headers: {},
246
- },
247
- route: { id: '/test' },
248
- };
249
-
250
- const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
251
- mockLoadFn,
252
- 'test-load'
253
- );
254
-
255
- const result = await wrappedFn(mockEvent);
256
-
257
- expect(result.data).toBe('test');
258
- expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
259
- // setAttributes should not be called for performer data
260
- expect(mockSpan.end).toHaveBeenCalled();
261
- });
262
- });
263
-
264
- describe('extractTraceContext', () => {
265
- it('extracts trace context from request headers', () => {
266
- const mockRequest = {
267
- headers: new Map([
268
- ['x-b3-traceid', 'test-trace'],
269
- ['x-b3-spanid', 'test-span'],
270
- ]),
271
- };
272
-
273
- mockRequest.headers.entries = function () {
274
- return this[Symbol.iterator]();
275
- };
276
-
277
- telemetryServer.extractTraceContext(mockRequest);
278
-
279
- expect(mockPropagation.extract).toHaveBeenCalled();
280
- });
281
-
282
- it('handles null request', () => {
283
- const result = telemetryServer.extractTraceContext(null);
284
-
285
- expect(mockPropagation.extract).toHaveBeenCalled();
286
- });
287
-
288
- it('handles request without headers', () => {
289
- const mockRequest = {};
290
-
291
- const result = telemetryServer.extractTraceContext(mockRequest);
292
-
293
- expect(mockPropagation.extract).toHaveBeenCalled();
294
- });
295
- });
296
-
297
- describe('injectTraceContext', () => {
298
- it('injects trace context into response headers', () => {
299
- const mockResponse = {
300
- headers: {
301
- set: vi.fn(),
302
- },
303
- };
304
-
305
- mockPropagation.inject.mockImplementation((ctx, headers) => {
306
- headers['x-b3-traceid'] = 'injected-trace';
307
- });
308
-
309
- telemetryServer.injectTraceContext(mockResponse, mockSpan);
310
-
311
- expect(mockPropagation.inject).toHaveBeenCalled();
312
- expect(mockResponse.headers.set).toHaveBeenCalledWith(
313
- 'X-Trace-Id',
314
- 'test-trace-id'
315
- );
316
- expect(mockResponse.headers.set).toHaveBeenCalledWith(
317
- 'X-Span-Id',
318
- 'test-span-id'
319
- );
320
- });
321
-
322
- it('handles null span context', () => {
323
- const mockResponse = {
324
- headers: {
325
- set: vi.fn(),
326
- },
327
- };
328
-
329
- const nullContextSpan = {
330
- spanContext: vi.fn(() => null),
331
- };
332
-
333
- // Should not throw
334
- expect(() =>
335
- telemetryServer.injectTraceContext(mockResponse, nullContextSpan)
336
- ).not.toThrow();
337
- });
338
-
339
- it('handles response without headers', () => {
340
- const mockResponse = {};
341
-
342
- // Should not throw
343
- expect(() =>
344
- telemetryServer.injectTraceContext(mockResponse, mockSpan)
345
- ).not.toThrow();
346
- });
347
- });
348
-
349
- describe('shutdownServerTelemetry', () => {
350
- it('shuts down SDK gracefully', async () => {
351
- const consoleSpy = vi.spyOn(console, 'log');
352
-
353
- await telemetryServer.shutdownServerTelemetry();
354
-
355
- // May or may not log depending on SDK state
356
- expect(true).toBe(true);
357
- });
358
- });
359
-
360
- describe('performersPortalTelemetry', () => {
361
- it('exports wrapLoad helper', () => {
362
- expect(telemetryServer.performersPortalTelemetry.wrapLoad).toBeDefined();
363
- expect(
364
- typeof telemetryServer.performersPortalTelemetry.wrapLoad
365
- ).toBe('function');
366
- });
367
-
368
- it('exports wrapAction helper', () => {
369
- expect(telemetryServer.performersPortalTelemetry.wrapAction).toBeDefined();
370
- expect(
371
- typeof telemetryServer.performersPortalTelemetry.wrapAction
372
- ).toBe('function');
373
- });
374
-
375
- it('wrapLoad returns wrapped function', () => {
376
- const mockFn = vi.fn();
377
- const wrapped = telemetryServer.performersPortalTelemetry.wrapLoad(
378
- mockFn,
379
- 'test'
380
- );
381
-
382
- expect(typeof wrapped).toBe('function');
383
- });
384
-
385
- it('wrapAction handles successful action', async () => {
386
- const mockActionFn = vi.fn().mockResolvedValue({ success: true });
387
-
388
- const mockEvent = {
389
- request: {
390
- method: 'POST',
391
- url: 'http://localhost:3000/action',
392
- headers: {},
393
- },
394
- };
395
-
396
- const wrappedAction =
397
- telemetryServer.performersPortalTelemetry.wrapAction(
398
- mockActionFn,
399
- 'test-action'
400
- );
401
-
402
- const result = await wrappedAction(mockEvent);
403
-
404
- expect(mockActionFn).toHaveBeenCalledWith(mockEvent);
405
- expect(result.success).toBe(true);
406
- expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
407
- expect(mockSpan.end).toHaveBeenCalled();
408
- });
409
-
410
- it('wrapAction handles action errors', async () => {
411
- const testError = new Error('Action failed');
412
- const mockActionFn = vi.fn().mockRejectedValue(testError);
413
-
414
- const mockEvent = {
415
- request: {
416
- method: 'POST',
417
- url: 'http://localhost:3000/action',
418
- headers: {},
419
- },
420
- };
421
-
422
- const wrappedAction =
423
- telemetryServer.performersPortalTelemetry.wrapAction(
424
- mockActionFn,
425
- 'failing-action'
426
- );
427
-
428
- await expect(wrappedAction(mockEvent)).rejects.toThrow('Action failed');
429
-
430
- expect(mockSpan.recordException).toHaveBeenCalledWith(testError);
431
- expect(mockSpan.setStatus).toHaveBeenCalledWith({
432
- code: 2,
433
- message: 'Action failed',
434
- });
435
- expect(mockSpan.end).toHaveBeenCalled();
436
- });
437
- });
438
- });
1
+ // @ts-nocheck
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+
4
+ // Vitest 4.x requires class syntax for constructor mocks
5
+ // Mock all OpenTelemetry modules
6
+ vi.mock('@opentelemetry/instrumentation', () => ({
7
+ registerInstrumentations: vi.fn(),
8
+ }));
9
+
10
+ vi.mock('@opentelemetry/sdk-node', () => ({
11
+ NodeSDK: class MockNodeSDK {
12
+ constructor() {
13
+ this.start = vi.fn();
14
+ this.shutdown = vi.fn(() => Promise.resolve());
15
+ }
16
+ },
17
+ }));
18
+
19
+ vi.mock('@opentelemetry/exporter-trace-otlp-http', () => ({
20
+ OTLPTraceExporter: class MockOTLPTraceExporter {},
21
+ }));
22
+
23
+ vi.mock('@opentelemetry/resources', () => ({
24
+ Resource: class MockResource {},
25
+ }));
26
+
27
+ vi.mock('@opentelemetry/semantic-conventions', () => ({
28
+ SEMRESATTRS_SERVICE_NAME: 'service.name',
29
+ SEMRESATTRS_SERVICE_VERSION: 'service.version',
30
+ SEMRESATTRS_DEPLOYMENT_ENVIRONMENT: 'deployment.environment',
31
+ }));
32
+
33
+ vi.mock('@opentelemetry/instrumentation-http', () => ({
34
+ HttpInstrumentation: class MockHttpInstrumentation {},
35
+ }));
36
+
37
+ vi.mock('@opentelemetry/instrumentation-fetch', () => ({
38
+ FetchInstrumentation: class MockFetchInstrumentation {},
39
+ }));
40
+
41
+ vi.mock('@opentelemetry/auto-instrumentations-node', () => ({
42
+ getNodeAutoInstrumentations: vi.fn(() => []),
43
+ }));
44
+
45
+ const mockSpan = {
46
+ setAttribute: vi.fn(),
47
+ setAttributes: vi.fn(),
48
+ setStatus: vi.fn(),
49
+ recordException: vi.fn(),
50
+ end: vi.fn(),
51
+ spanContext: vi.fn(() => ({
52
+ traceId: 'test-trace-id',
53
+ spanId: 'test-span-id',
54
+ })),
55
+ };
56
+
57
+ const mockTracer = {
58
+ startSpan: vi.fn(() => mockSpan),
59
+ };
60
+
61
+ const mockContext = {
62
+ active: vi.fn(() => ({})),
63
+ };
64
+
65
+ const mockPropagation = {
66
+ extract: vi.fn(() => ({})),
67
+ inject: vi.fn(),
68
+ };
69
+
70
+ vi.mock('@opentelemetry/api', () => ({
71
+ trace: {
72
+ getTracer: vi.fn(() => mockTracer),
73
+ },
74
+ context: mockContext,
75
+ propagation: mockPropagation,
76
+ }));
77
+
78
+ describe('telemetry.server.js', () => {
79
+ let telemetryServer;
80
+
81
+ beforeEach(async () => {
82
+ vi.resetModules();
83
+ vi.clearAllMocks();
84
+
85
+ // Ensure we're in a server environment
86
+ delete global.window;
87
+
88
+ // Stub environment variables
89
+ vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'true');
90
+ vi.stubEnv('VITE_OTEL_SERVICE_NAME', 'test-service');
91
+ vi.stubEnv('VITE_ENVIRONMENT', 'test');
92
+
93
+ telemetryServer = await import('./telemetry.server.js');
94
+ });
95
+
96
+ afterEach(() => {
97
+ vi.unstubAllEnvs();
98
+ });
99
+
100
+ describe('initServerTelemetry', () => {
101
+ it('initializes server telemetry when enabled', async () => {
102
+ const consoleSpy = vi.spyOn(console, 'log');
103
+
104
+ // Module auto-initializes, calling initServerTelemetry will re-init
105
+ telemetryServer.initServerTelemetry();
106
+
107
+ expect(consoleSpy).toHaveBeenCalled();
108
+ });
109
+
110
+ it('logs disabled message when tracing is disabled', async () => {
111
+ vi.resetModules();
112
+ vi.stubEnv('VITE_OTEL_TRACES_ENABLED', 'false');
113
+
114
+ const consoleSpy = vi.spyOn(console, 'log');
115
+
116
+ telemetryServer = await import('./telemetry.server.js');
117
+ telemetryServer.initServerTelemetry();
118
+
119
+ expect(consoleSpy).toHaveBeenCalledWith(
120
+ '[Server Telemetry] Tracing is disabled'
121
+ );
122
+ });
123
+ });
124
+
125
+ describe('createSSRSpan', () => {
126
+ it('creates SSR span with correct name and attributes', () => {
127
+ const mockRequest = {
128
+ method: 'GET',
129
+ url: 'http://localhost:3000/test',
130
+ headers: {
131
+ 'user-agent': 'test-agent',
132
+ referer: 'http://localhost:3000/',
133
+ },
134
+ };
135
+
136
+ const span = telemetryServer.createSSRSpan(
137
+ 'ssr.test',
138
+ mockRequest,
139
+ { custom: 'attribute' }
140
+ );
141
+
142
+ expect(mockTracer.startSpan).toHaveBeenCalledWith('ssr.test', {
143
+ attributes: {
144
+ 'span.kind': 'server',
145
+ 'ssr.type': 'page_load',
146
+ 'portal.type': 'performers',
147
+ 'http.method': 'GET',
148
+ 'http.url': 'http://localhost:3000/test',
149
+ 'http.user_agent': 'test-agent',
150
+ 'http.referer': 'http://localhost:3000/',
151
+ custom: 'attribute',
152
+ },
153
+ });
154
+
155
+ expect(span).toBeDefined();
156
+ });
157
+
158
+ it('handles null request gracefully', () => {
159
+ const span = telemetryServer.createSSRSpan('ssr.null-request', null);
160
+
161
+ expect(mockTracer.startSpan).toHaveBeenCalledWith('ssr.null-request', {
162
+ attributes: {
163
+ 'span.kind': 'server',
164
+ 'ssr.type': 'page_load',
165
+ 'portal.type': 'performers',
166
+ 'http.method': 'GET',
167
+ 'http.url': undefined,
168
+ 'http.user_agent': undefined,
169
+ 'http.referer': undefined,
170
+ },
171
+ });
172
+
173
+ expect(span).toBeDefined();
174
+ });
175
+ });
176
+
177
+ describe('trackPerformerSSRDataLoad', () => {
178
+ it('wraps load function and tracks successful execution', async () => {
179
+ const mockLoadFn = vi.fn().mockResolvedValue({
180
+ performer: { id: 1, name: 'Test Performer', email: 'test@test.com' },
181
+ });
182
+
183
+ const mockEvent = {
184
+ request: {
185
+ method: 'GET',
186
+ url: 'http://localhost:3000/performer/1',
187
+ headers: {},
188
+ },
189
+ route: { id: '/performer/[id]' },
190
+ };
191
+
192
+ const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
193
+ mockLoadFn,
194
+ 'performer-load'
195
+ );
196
+
197
+ const result = await wrappedFn(mockEvent);
198
+
199
+ expect(mockLoadFn).toHaveBeenCalledWith(mockEvent);
200
+ expect(result.performer.id).toBe(1);
201
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
202
+ expect(mockSpan.setAttributes).toHaveBeenCalledWith({
203
+ 'performer.id': 1,
204
+ 'performer.name': 'Test Performer',
205
+ 'performer.email': 'test@test.com',
206
+ });
207
+ expect(mockSpan.end).toHaveBeenCalled();
208
+ });
209
+
210
+ it('tracks errors and re-throws them', async () => {
211
+ const testError = new Error('Load failed');
212
+ const mockLoadFn = vi.fn().mockRejectedValue(testError);
213
+
214
+ const mockEvent = {
215
+ request: {
216
+ method: 'GET',
217
+ url: 'http://localhost:3000/test',
218
+ headers: {},
219
+ },
220
+ route: { id: '/test' },
221
+ };
222
+
223
+ const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
224
+ mockLoadFn,
225
+ 'test-load'
226
+ );
227
+
228
+ await expect(wrappedFn(mockEvent)).rejects.toThrow('Load failed');
229
+
230
+ expect(mockSpan.recordException).toHaveBeenCalledWith(testError);
231
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({
232
+ code: 2,
233
+ message: 'Load failed',
234
+ });
235
+ expect(mockSpan.end).toHaveBeenCalled();
236
+ });
237
+
238
+ it('handles results without performer data', async () => {
239
+ const mockLoadFn = vi.fn().mockResolvedValue({ data: 'test' });
240
+
241
+ const mockEvent = {
242
+ request: {
243
+ method: 'GET',
244
+ url: 'http://localhost:3000/test',
245
+ headers: {},
246
+ },
247
+ route: { id: '/test' },
248
+ };
249
+
250
+ const wrappedFn = telemetryServer.trackPerformerSSRDataLoad(
251
+ mockLoadFn,
252
+ 'test-load'
253
+ );
254
+
255
+ const result = await wrappedFn(mockEvent);
256
+
257
+ expect(result.data).toBe('test');
258
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
259
+ // setAttributes should not be called for performer data
260
+ expect(mockSpan.end).toHaveBeenCalled();
261
+ });
262
+ });
263
+
264
+ describe('extractTraceContext', () => {
265
+ it('extracts trace context from request headers', () => {
266
+ const mockRequest = {
267
+ headers: new Map([
268
+ ['x-b3-traceid', 'test-trace'],
269
+ ['x-b3-spanid', 'test-span'],
270
+ ]),
271
+ };
272
+
273
+ mockRequest.headers.entries = function () {
274
+ return this[Symbol.iterator]();
275
+ };
276
+
277
+ telemetryServer.extractTraceContext(mockRequest);
278
+
279
+ expect(mockPropagation.extract).toHaveBeenCalled();
280
+ });
281
+
282
+ it('handles null request', () => {
283
+ const result = telemetryServer.extractTraceContext(null);
284
+
285
+ expect(mockPropagation.extract).toHaveBeenCalled();
286
+ });
287
+
288
+ it('handles request without headers', () => {
289
+ const mockRequest = {};
290
+
291
+ const result = telemetryServer.extractTraceContext(mockRequest);
292
+
293
+ expect(mockPropagation.extract).toHaveBeenCalled();
294
+ });
295
+ });
296
+
297
+ describe('injectTraceContext', () => {
298
+ it('injects trace context into response headers', () => {
299
+ const mockResponse = {
300
+ headers: {
301
+ set: vi.fn(),
302
+ },
303
+ };
304
+
305
+ mockPropagation.inject.mockImplementation((ctx, headers) => {
306
+ headers['x-b3-traceid'] = 'injected-trace';
307
+ });
308
+
309
+ telemetryServer.injectTraceContext(mockResponse, mockSpan);
310
+
311
+ expect(mockPropagation.inject).toHaveBeenCalled();
312
+ expect(mockResponse.headers.set).toHaveBeenCalledWith(
313
+ 'X-Trace-Id',
314
+ 'test-trace-id'
315
+ );
316
+ expect(mockResponse.headers.set).toHaveBeenCalledWith(
317
+ 'X-Span-Id',
318
+ 'test-span-id'
319
+ );
320
+ });
321
+
322
+ it('handles null span context', () => {
323
+ const mockResponse = {
324
+ headers: {
325
+ set: vi.fn(),
326
+ },
327
+ };
328
+
329
+ const nullContextSpan = {
330
+ spanContext: vi.fn(() => null),
331
+ };
332
+
333
+ // Should not throw
334
+ expect(() =>
335
+ telemetryServer.injectTraceContext(mockResponse, nullContextSpan)
336
+ ).not.toThrow();
337
+ });
338
+
339
+ it('handles response without headers', () => {
340
+ const mockResponse = {};
341
+
342
+ // Should not throw
343
+ expect(() =>
344
+ telemetryServer.injectTraceContext(mockResponse, mockSpan)
345
+ ).not.toThrow();
346
+ });
347
+ });
348
+
349
+ describe('shutdownServerTelemetry', () => {
350
+ it('shuts down SDK gracefully', async () => {
351
+ const consoleSpy = vi.spyOn(console, 'log');
352
+
353
+ await telemetryServer.shutdownServerTelemetry();
354
+
355
+ // May or may not log depending on SDK state
356
+ expect(true).toBe(true);
357
+ });
358
+ });
359
+
360
+ describe('performersPortalTelemetry', () => {
361
+ it('exports wrapLoad helper', () => {
362
+ expect(telemetryServer.performersPortalTelemetry.wrapLoad).toBeDefined();
363
+ expect(
364
+ typeof telemetryServer.performersPortalTelemetry.wrapLoad
365
+ ).toBe('function');
366
+ });
367
+
368
+ it('exports wrapAction helper', () => {
369
+ expect(telemetryServer.performersPortalTelemetry.wrapAction).toBeDefined();
370
+ expect(
371
+ typeof telemetryServer.performersPortalTelemetry.wrapAction
372
+ ).toBe('function');
373
+ });
374
+
375
+ it('wrapLoad returns wrapped function', () => {
376
+ const mockFn = vi.fn();
377
+ const wrapped = telemetryServer.performersPortalTelemetry.wrapLoad(
378
+ mockFn,
379
+ 'test'
380
+ );
381
+
382
+ expect(typeof wrapped).toBe('function');
383
+ });
384
+
385
+ it('wrapAction handles successful action', async () => {
386
+ const mockActionFn = vi.fn().mockResolvedValue({ success: true });
387
+
388
+ const mockEvent = {
389
+ request: {
390
+ method: 'POST',
391
+ url: 'http://localhost:3000/action',
392
+ headers: {},
393
+ },
394
+ };
395
+
396
+ const wrappedAction =
397
+ telemetryServer.performersPortalTelemetry.wrapAction(
398
+ mockActionFn,
399
+ 'test-action'
400
+ );
401
+
402
+ const result = await wrappedAction(mockEvent);
403
+
404
+ expect(mockActionFn).toHaveBeenCalledWith(mockEvent);
405
+ expect(result.success).toBe(true);
406
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
407
+ expect(mockSpan.end).toHaveBeenCalled();
408
+ });
409
+
410
+ it('wrapAction handles action errors', async () => {
411
+ const testError = new Error('Action failed');
412
+ const mockActionFn = vi.fn().mockRejectedValue(testError);
413
+
414
+ const mockEvent = {
415
+ request: {
416
+ method: 'POST',
417
+ url: 'http://localhost:3000/action',
418
+ headers: {},
419
+ },
420
+ };
421
+
422
+ const wrappedAction =
423
+ telemetryServer.performersPortalTelemetry.wrapAction(
424
+ mockActionFn,
425
+ 'failing-action'
426
+ );
427
+
428
+ await expect(wrappedAction(mockEvent)).rejects.toThrow('Action failed');
429
+
430
+ expect(mockSpan.recordException).toHaveBeenCalledWith(testError);
431
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({
432
+ code: 2,
433
+ message: 'Action failed',
434
+ });
435
+ expect(mockSpan.end).toHaveBeenCalled();
436
+ });
437
+ });
438
+ });