tempest-react-sdk 0.24.0 → 0.26.0

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 (403) hide show
  1. package/README.md +25 -4
  2. package/bin/lib/alias/collect.mjs +94 -0
  3. package/bin/lib/alias/collect.test.mjs +95 -0
  4. package/bin/lib/alias/discover.mjs +77 -0
  5. package/bin/lib/alias/discover.test.mjs +189 -0
  6. package/bin/lib/alias/index.mjs +88 -0
  7. package/bin/lib/alias/index.test.mjs +138 -0
  8. package/bin/lib/alias/rewrite-css.mjs +76 -0
  9. package/bin/lib/alias/rewrite-css.test.mjs +85 -0
  10. package/bin/lib/alias/rewrite.mjs +141 -0
  11. package/bin/lib/alias/rewrite.test.mjs +148 -0
  12. package/bin/lib/alias/specifier.mjs +49 -0
  13. package/bin/lib/alias/specifier.test.mjs +85 -0
  14. package/bin/lib/alias/tsconfig.mjs +116 -0
  15. package/bin/lib/alias/typescript.mjs +23 -0
  16. package/bin/lib/icons/generate.mjs +156 -0
  17. package/bin/lib/icons/generate.test.mjs +125 -0
  18. package/bin/tempest.mjs +158 -13
  19. package/dist/audio/use-audio.cjs +1 -1
  20. package/dist/audio/use-audio.cjs.map +1 -1
  21. package/dist/audio/use-audio.js +12 -12
  22. package/dist/audio/use-audio.js.map +1 -1
  23. package/dist/charts/AreaChart.cjs +1 -1
  24. package/dist/charts/AreaChart.cjs.map +1 -1
  25. package/dist/charts/AreaChart.js +7 -7
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.cjs +1 -1
  28. package/dist/charts/BarChart.cjs.map +1 -1
  29. package/dist/charts/BarChart.js +7 -7
  30. package/dist/charts/BarChart.js.map +1 -1
  31. package/dist/charts/LineChart.cjs +1 -1
  32. package/dist/charts/LineChart.cjs.map +1 -1
  33. package/dist/charts/LineChart.js +6 -6
  34. package/dist/charts/LineChart.js.map +1 -1
  35. package/dist/charts/PieChart.cjs +1 -1
  36. package/dist/charts/PieChart.cjs.map +1 -1
  37. package/dist/charts/PieChart.js +6 -6
  38. package/dist/charts/PieChart.js.map +1 -1
  39. package/dist/charts/RadarChart.cjs +1 -1
  40. package/dist/charts/RadarChart.cjs.map +1 -1
  41. package/dist/charts/RadarChart.js +6 -6
  42. package/dist/charts/RadarChart.js.map +1 -1
  43. package/dist/charts/palette.cjs +1 -1
  44. package/dist/charts/palette.cjs.map +1 -1
  45. package/dist/charts/palette.js +19 -2
  46. package/dist/charts/palette.js.map +1 -1
  47. package/dist/charts/use-chart-colors.cjs +2 -0
  48. package/dist/charts/use-chart-colors.cjs.map +1 -0
  49. package/dist/charts/use-chart-colors.js +29 -0
  50. package/dist/charts/use-chart-colors.js.map +1 -0
  51. package/dist/charts.cjs +1 -1
  52. package/dist/charts.d.ts +61 -10
  53. package/dist/charts.js +8 -7
  54. package/dist/components/AvatarGroup/AvatarGroup.cjs +2 -0
  55. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -0
  56. package/dist/components/AvatarGroup/AvatarGroup.js +39 -0
  57. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -0
  58. package/dist/components/AvatarGroup/AvatarGroup.module.cjs +2 -0
  59. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -0
  60. package/dist/components/AvatarGroup/AvatarGroup.module.js +16 -0
  61. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -0
  62. package/dist/components/ClickOutside/ClickOutside.cjs +1 -1
  63. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  64. package/dist/components/ClickOutside/ClickOutside.js +3 -1
  65. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  66. package/dist/components/DataTable/DataTable.cjs +1 -1
  67. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  68. package/dist/components/DataTable/DataTable.js +21 -23
  69. package/dist/components/DataTable/DataTable.js.map +1 -1
  70. package/dist/components/Kanban/Kanban.cjs +2 -0
  71. package/dist/components/Kanban/Kanban.cjs.map +1 -0
  72. package/dist/components/Kanban/Kanban.js +102 -0
  73. package/dist/components/Kanban/Kanban.js.map +1 -0
  74. package/dist/components/Kanban/Kanban.module.cjs +2 -0
  75. package/dist/components/Kanban/Kanban.module.cjs.map +1 -0
  76. package/dist/components/Kanban/Kanban.module.js +19 -0
  77. package/dist/components/Kanban/Kanban.module.js.map +1 -0
  78. package/dist/components/Lightbox/Lightbox.cjs +2 -0
  79. package/dist/components/Lightbox/Lightbox.cjs.map +1 -0
  80. package/dist/components/Lightbox/Lightbox.js +148 -0
  81. package/dist/components/Lightbox/Lightbox.js.map +1 -0
  82. package/dist/components/Lightbox/Lightbox.module.cjs +2 -0
  83. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -0
  84. package/dist/components/Lightbox/Lightbox.module.js +21 -0
  85. package/dist/components/Lightbox/Lightbox.module.js.map +1 -0
  86. package/dist/components/NotificationCenter/NotificationCenter.cjs +2 -0
  87. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -0
  88. package/dist/components/NotificationCenter/NotificationCenter.js +83 -0
  89. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -0
  90. package/dist/components/NotificationCenter/NotificationCenter.module.cjs +2 -0
  91. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -0
  92. package/dist/components/NotificationCenter/NotificationCenter.module.js +21 -0
  93. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -0
  94. package/dist/components/NotificationCenter/use-notification-inbox.cjs +2 -0
  95. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -0
  96. package/dist/components/NotificationCenter/use-notification-inbox.js +63 -0
  97. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -0
  98. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  99. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  100. package/dist/components/RefreshIndicator/RefreshIndicator.js +17 -17
  101. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  102. package/dist/components/SignaturePad/SignaturePad.cjs +2 -0
  103. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -0
  104. package/dist/components/SignaturePad/SignaturePad.js +115 -0
  105. package/dist/components/SignaturePad/SignaturePad.js.map +1 -0
  106. package/dist/components/SignaturePad/SignaturePad.module.cjs +2 -0
  107. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -0
  108. package/dist/components/SignaturePad/SignaturePad.module.js +11 -0
  109. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -0
  110. package/dist/components/Stepper/Stepper.cjs +1 -1
  111. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  112. package/dist/components/Stepper/Stepper.js +43 -19
  113. package/dist/components/Stepper/Stepper.js.map +1 -1
  114. package/dist/components/Stepper/Stepper.module.cjs +1 -1
  115. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  116. package/dist/components/Stepper/Stepper.module.js +6 -3
  117. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  118. package/dist/components/Tooltip/Tooltip.cjs +1 -1
  119. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  120. package/dist/components/Tooltip/Tooltip.js +26 -20
  121. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  122. package/dist/components/TreeView/TreeView.cjs +2 -0
  123. package/dist/components/TreeView/TreeView.cjs.map +1 -0
  124. package/dist/components/TreeView/TreeView.js +124 -0
  125. package/dist/components/TreeView/TreeView.js.map +1 -0
  126. package/dist/components/TreeView/TreeView.module.cjs +2 -0
  127. package/dist/components/TreeView/TreeView.module.cjs.map +1 -0
  128. package/dist/components/TreeView/TreeView.module.js +17 -0
  129. package/dist/components/TreeView/TreeView.module.js.map +1 -0
  130. package/dist/components/VirtualTable/VirtualTable.cjs +2 -0
  131. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -0
  132. package/dist/components/VirtualTable/VirtualTable.js +116 -0
  133. package/dist/components/VirtualTable/VirtualTable.js.map +1 -0
  134. package/dist/components/VirtualTable/VirtualTable.module.cjs +2 -0
  135. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -0
  136. package/dist/components/VirtualTable/VirtualTable.module.js +20 -0
  137. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -0
  138. package/dist/components/Wizard/Wizard.cjs +2 -0
  139. package/dist/components/Wizard/Wizard.cjs.map +1 -0
  140. package/dist/components/Wizard/Wizard.js +111 -0
  141. package/dist/components/Wizard/Wizard.js.map +1 -0
  142. package/dist/components/Wizard/Wizard.module.cjs +2 -0
  143. package/dist/components/Wizard/Wizard.module.cjs.map +1 -0
  144. package/dist/components/Wizard/Wizard.module.js +10 -0
  145. package/dist/components/Wizard/Wizard.module.js.map +1 -0
  146. package/dist/geo/use-position-tracker.cjs +1 -1
  147. package/dist/geo/use-position-tracker.cjs.map +1 -1
  148. package/dist/geo/use-position-tracker.js +3 -1
  149. package/dist/geo/use-position-tracker.js.map +1 -1
  150. package/dist/hooks/use-async.cjs +1 -1
  151. package/dist/hooks/use-async.cjs.map +1 -1
  152. package/dist/hooks/use-async.js +3 -1
  153. package/dist/hooks/use-async.js.map +1 -1
  154. package/dist/hooks/use-click-outside.cjs +1 -1
  155. package/dist/hooks/use-click-outside.cjs.map +1 -1
  156. package/dist/hooks/use-click-outside.js +3 -1
  157. package/dist/hooks/use-click-outside.js.map +1 -1
  158. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  159. package/dist/hooks/use-deep-memo.js.map +1 -1
  160. package/dist/hooks/use-event-listener.cjs +1 -1
  161. package/dist/hooks/use-event-listener.cjs.map +1 -1
  162. package/dist/hooks/use-event-listener.js +3 -1
  163. package/dist/hooks/use-event-listener.js.map +1 -1
  164. package/dist/hooks/use-interval.cjs +1 -1
  165. package/dist/hooks/use-interval.cjs.map +1 -1
  166. package/dist/hooks/use-interval.js +3 -1
  167. package/dist/hooks/use-interval.js.map +1 -1
  168. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  169. package/dist/hooks/use-is-first-render.js.map +1 -1
  170. package/dist/hooks/use-long-press-handlers.cjs +1 -1
  171. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  172. package/dist/hooks/use-long-press-handlers.js +25 -23
  173. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  174. package/dist/hooks/use-long-press.cjs +1 -1
  175. package/dist/hooks/use-long-press.cjs.map +1 -1
  176. package/dist/hooks/use-long-press.js +3 -1
  177. package/dist/hooks/use-long-press.js.map +1 -1
  178. package/dist/hooks/use-online.cjs +1 -1
  179. package/dist/hooks/use-online.cjs.map +1 -1
  180. package/dist/hooks/use-online.js +6 -4
  181. package/dist/hooks/use-online.js.map +1 -1
  182. package/dist/hooks/use-previous.cjs.map +1 -1
  183. package/dist/hooks/use-previous.js.map +1 -1
  184. package/dist/hooks/use-service-worker-update.cjs +1 -1
  185. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  186. package/dist/hooks/use-service-worker-update.js +3 -1
  187. package/dist/hooks/use-service-worker-update.js.map +1 -1
  188. package/dist/hooks/use-sortable.cjs +2 -0
  189. package/dist/hooks/use-sortable.cjs.map +1 -0
  190. package/dist/hooks/use-sortable.js +169 -0
  191. package/dist/hooks/use-sortable.js.map +1 -0
  192. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  193. package/dist/hooks/use-stable-callback.js.map +1 -1
  194. package/dist/hooks/use-timeout.cjs +1 -1
  195. package/dist/hooks/use-timeout.cjs.map +1 -1
  196. package/dist/hooks/use-timeout.js +3 -1
  197. package/dist/hooks/use-timeout.js.map +1 -1
  198. package/dist/icons/Icon.cjs +2 -0
  199. package/dist/icons/Icon.cjs.map +1 -0
  200. package/dist/icons/Icon.js +24 -0
  201. package/dist/icons/Icon.js.map +1 -0
  202. package/dist/icons/IconProvider.cjs +2 -0
  203. package/dist/icons/IconProvider.cjs.map +1 -0
  204. package/dist/icons/IconProvider.js +24 -0
  205. package/dist/icons/IconProvider.js.map +1 -0
  206. package/dist/icons/generated/aliases.cjs +2 -0
  207. package/dist/icons/generated/aliases.cjs.map +1 -0
  208. package/dist/icons/generated/aliases.js +255 -0
  209. package/dist/icons/generated/aliases.js.map +1 -0
  210. package/dist/icons/generated/icon-names.cjs +2 -0
  211. package/dist/icons/generated/icon-names.cjs.map +1 -0
  212. package/dist/icons/generated/icon-names.js +6 -0
  213. package/dist/icons/generated/icon-names.js.map +1 -0
  214. package/dist/icons/generated/loaders.cjs +2 -0
  215. package/dist/icons/generated/loaders.cjs.map +1 -0
  216. package/dist/icons/generated/loaders.js +32 -0
  217. package/dist/icons/generated/loaders.js.map +1 -0
  218. package/dist/icons/generated/shard-a.cjs +2 -0
  219. package/dist/icons/generated/shard-a.cjs.map +1 -0
  220. package/dist/icons/generated/shard-a.js +114 -0
  221. package/dist/icons/generated/shard-a.js.map +1 -0
  222. package/dist/icons/generated/shard-b.cjs +2 -0
  223. package/dist/icons/generated/shard-b.cjs.map +1 -0
  224. package/dist/icons/generated/shard-b.js +156 -0
  225. package/dist/icons/generated/shard-b.js.map +1 -0
  226. package/dist/icons/generated/shard-c.cjs +2 -0
  227. package/dist/icons/generated/shard-c.cjs.map +1 -0
  228. package/dist/icons/generated/shard-c.js +269 -0
  229. package/dist/icons/generated/shard-c.js.map +1 -0
  230. package/dist/icons/generated/shard-d.cjs +2 -0
  231. package/dist/icons/generated/shard-d.cjs.map +1 -0
  232. package/dist/icons/generated/shard-d.js +62 -0
  233. package/dist/icons/generated/shard-d.js.map +1 -0
  234. package/dist/icons/generated/shard-e.cjs +2 -0
  235. package/dist/icons/generated/shard-e.cjs.map +1 -0
  236. package/dist/icons/generated/shard-e.js +32 -0
  237. package/dist/icons/generated/shard-e.js.map +1 -0
  238. package/dist/icons/generated/shard-f.cjs +2 -0
  239. package/dist/icons/generated/shard-f.cjs.map +1 -0
  240. package/dist/icons/generated/shard-f.js +139 -0
  241. package/dist/icons/generated/shard-f.js.map +1 -0
  242. package/dist/icons/generated/shard-g.cjs +2 -0
  243. package/dist/icons/generated/shard-g.cjs.map +1 -0
  244. package/dist/icons/generated/shard-g.js +61 -0
  245. package/dist/icons/generated/shard-g.js.map +1 -0
  246. package/dist/icons/generated/shard-h.cjs +2 -0
  247. package/dist/icons/generated/shard-h.cjs.map +1 -0
  248. package/dist/icons/generated/shard-h.js +63 -0
  249. package/dist/icons/generated/shard-h.js.map +1 -0
  250. package/dist/icons/generated/shard-i.cjs +2 -0
  251. package/dist/icons/generated/shard-i.cjs.map +1 -0
  252. package/dist/icons/generated/shard-i.js +30 -0
  253. package/dist/icons/generated/shard-i.js.map +1 -0
  254. package/dist/icons/generated/shard-j.cjs +2 -0
  255. package/dist/icons/generated/shard-j.cjs.map +1 -0
  256. package/dist/icons/generated/shard-j.js +10 -0
  257. package/dist/icons/generated/shard-j.js.map +1 -0
  258. package/dist/icons/generated/shard-k.cjs +2 -0
  259. package/dist/icons/generated/shard-k.cjs.map +1 -0
  260. package/dist/icons/generated/shard-k.js +16 -0
  261. package/dist/icons/generated/shard-k.js.map +1 -0
  262. package/dist/icons/generated/shard-l.cjs +2 -0
  263. package/dist/icons/generated/shard-l.cjs.map +1 -0
  264. package/dist/icons/generated/shard-l.js +88 -0
  265. package/dist/icons/generated/shard-l.js.map +1 -0
  266. package/dist/icons/generated/shard-m.cjs +2 -0
  267. package/dist/icons/generated/shard-m.cjs.map +1 -0
  268. package/dist/icons/generated/shard-m.js +140 -0
  269. package/dist/icons/generated/shard-m.js.map +1 -0
  270. package/dist/icons/generated/shard-n.cjs +2 -0
  271. package/dist/icons/generated/shard-n.cjs.map +1 -0
  272. package/dist/icons/generated/shard-n.js +24 -0
  273. package/dist/icons/generated/shard-n.js.map +1 -0
  274. package/dist/icons/generated/shard-o.cjs +2 -0
  275. package/dist/icons/generated/shard-o.cjs.map +1 -0
  276. package/dist/icons/generated/shard-o.js +17 -0
  277. package/dist/icons/generated/shard-o.js.map +1 -0
  278. package/dist/icons/generated/shard-p.cjs +2 -0
  279. package/dist/icons/generated/shard-p.cjs.map +1 -0
  280. package/dist/icons/generated/shard-p.js +115 -0
  281. package/dist/icons/generated/shard-p.js.map +1 -0
  282. package/dist/icons/generated/shard-q.cjs +2 -0
  283. package/dist/icons/generated/shard-q.cjs.map +1 -0
  284. package/dist/icons/generated/shard-q.js +10 -0
  285. package/dist/icons/generated/shard-q.js.map +1 -0
  286. package/dist/icons/generated/shard-r.cjs +2 -0
  287. package/dist/icons/generated/shard-r.cjs.map +1 -0
  288. package/dist/icons/generated/shard-r.js +77 -0
  289. package/dist/icons/generated/shard-r.js.map +1 -0
  290. package/dist/icons/generated/shard-s.cjs +2 -0
  291. package/dist/icons/generated/shard-s.cjs.map +1 -0
  292. package/dist/icons/generated/shard-s.js +255 -0
  293. package/dist/icons/generated/shard-s.js.map +1 -0
  294. package/dist/icons/generated/shard-t.cjs +2 -0
  295. package/dist/icons/generated/shard-t.cjs.map +1 -0
  296. package/dist/icons/generated/shard-t.js +109 -0
  297. package/dist/icons/generated/shard-t.js.map +1 -0
  298. package/dist/icons/generated/shard-u.cjs +2 -0
  299. package/dist/icons/generated/shard-u.cjs.map +1 -0
  300. package/dist/icons/generated/shard-u.js +49 -0
  301. package/dist/icons/generated/shard-u.js.map +1 -0
  302. package/dist/icons/generated/shard-v.cjs +2 -0
  303. package/dist/icons/generated/shard-v.cjs.map +1 -0
  304. package/dist/icons/generated/shard-v.js +30 -0
  305. package/dist/icons/generated/shard-v.js.map +1 -0
  306. package/dist/icons/generated/shard-w.cjs +2 -0
  307. package/dist/icons/generated/shard-w.cjs.map +1 -0
  308. package/dist/icons/generated/shard-w.js +48 -0
  309. package/dist/icons/generated/shard-w.js.map +1 -0
  310. package/dist/icons/generated/shard-x.cjs +2 -0
  311. package/dist/icons/generated/shard-x.cjs.map +1 -0
  312. package/dist/icons/generated/shard-x.js +10 -0
  313. package/dist/icons/generated/shard-x.js.map +1 -0
  314. package/dist/icons/generated/shard-z.cjs +2 -0
  315. package/dist/icons/generated/shard-z.cjs.map +1 -0
  316. package/dist/icons/generated/shard-z.js +25 -0
  317. package/dist/icons/generated/shard-z.js.map +1 -0
  318. package/dist/icons/icon-context.cjs +2 -0
  319. package/dist/icons/icon-context.cjs.map +1 -0
  320. package/dist/icons/icon-context.js +13 -0
  321. package/dist/icons/icon-context.js.map +1 -0
  322. package/dist/icons/is-icon-name.cjs +2 -0
  323. package/dist/icons/is-icon-name.cjs.map +1 -0
  324. package/dist/icons/is-icon-name.js +10 -0
  325. package/dist/icons/is-icon-name.js.map +1 -0
  326. package/dist/icons/shard-cache.cjs +2 -0
  327. package/dist/icons/shard-cache.cjs.map +1 -0
  328. package/dist/icons/shard-cache.js +41 -0
  329. package/dist/icons/shard-cache.js.map +1 -0
  330. package/dist/icons/use-icon.cjs +2 -0
  331. package/dist/icons/use-icon.cjs.map +1 -0
  332. package/dist/icons/use-icon.js +20 -0
  333. package/dist/icons/use-icon.js.map +1 -0
  334. package/dist/icons-virtual.d.ts +22 -0
  335. package/dist/icons.cjs +1 -0
  336. package/dist/icons.d.ts +220 -0
  337. package/dist/icons.js +9 -0
  338. package/dist/offline/create-offline-sync.cjs +1 -1
  339. package/dist/offline/create-offline-sync.cjs.map +1 -1
  340. package/dist/offline/create-offline-sync.js +8 -2
  341. package/dist/offline/create-offline-sync.js.map +1 -1
  342. package/dist/offline/use-offline-sync.cjs +1 -1
  343. package/dist/offline/use-offline-sync.cjs.map +1 -1
  344. package/dist/offline/use-offline-sync.js +3 -1
  345. package/dist/offline/use-offline-sync.js.map +1 -1
  346. package/dist/push/use-push-subscription.cjs +1 -1
  347. package/dist/push/use-push-subscription.cjs.map +1 -1
  348. package/dist/push/use-push-subscription.js +3 -1
  349. package/dist/push/use-push-subscription.js.map +1 -1
  350. package/dist/sse/use-event-stream.cjs +1 -1
  351. package/dist/sse/use-event-stream.cjs.map +1 -1
  352. package/dist/sse/use-event-stream.js +3 -1
  353. package/dist/sse/use-event-stream.js.map +1 -1
  354. package/dist/styles.css +1 -1
  355. package/dist/tempest-react-sdk.cjs +1 -1
  356. package/dist/tempest-react-sdk.d.ts +1187 -2
  357. package/dist/tempest-react-sdk.js +261 -246
  358. package/dist/theme/ThemeProvider.cjs +1 -1
  359. package/dist/theme/ThemeProvider.cjs.map +1 -1
  360. package/dist/theme/ThemeProvider.js +6 -2
  361. package/dist/theme/ThemeProvider.js.map +1 -1
  362. package/dist/theme/apply-theme.cjs +2 -0
  363. package/dist/theme/apply-theme.cjs.map +1 -0
  364. package/dist/theme/apply-theme.js +24 -0
  365. package/dist/theme/apply-theme.js.map +1 -0
  366. package/dist/theme/color.cjs +2 -0
  367. package/dist/theme/color.cjs.map +1 -0
  368. package/dist/theme/color.js +161 -0
  369. package/dist/theme/color.js.map +1 -0
  370. package/dist/theme/create-theme.cjs +5 -0
  371. package/dist/theme/create-theme.cjs.map +1 -0
  372. package/dist/theme/create-theme.js +141 -0
  373. package/dist/theme/create-theme.js.map +1 -0
  374. package/dist/theme/theme-presets.cjs +2 -0
  375. package/dist/theme/theme-presets.cjs.map +1 -0
  376. package/dist/theme/theme-presets.js +82 -0
  377. package/dist/theme/theme-presets.js.map +1 -0
  378. package/dist/utilities.css +432 -0
  379. package/dist/utils/compare-values.cjs +2 -0
  380. package/dist/utils/compare-values.cjs.map +1 -0
  381. package/dist/utils/compare-values.js +8 -0
  382. package/dist/utils/compare-values.js.map +1 -0
  383. package/dist/vision/use-camera-stream.cjs +1 -1
  384. package/dist/vision/use-camera-stream.cjs.map +1 -1
  385. package/dist/vision/use-camera-stream.js +3 -1
  386. package/dist/vision/use-camera-stream.js.map +1 -1
  387. package/dist/vite/create-vite-config.cjs +1 -1
  388. package/dist/vite/create-vite-config.cjs.map +1 -1
  389. package/dist/vite/create-vite-config.js +30 -22
  390. package/dist/vite/create-vite-config.js.map +1 -1
  391. package/dist/vite/tempest-icons.cjs +9 -0
  392. package/dist/vite/tempest-icons.cjs.map +1 -0
  393. package/dist/vite/tempest-icons.js +99 -0
  394. package/dist/vite/tempest-icons.js.map +1 -0
  395. package/dist/vite.cjs +1 -1
  396. package/dist/vite.d.ts +79 -0
  397. package/dist/vite.js +6 -5
  398. package/dist/ws/use-web-socket.cjs +1 -1
  399. package/dist/ws/use-web-socket.cjs.map +1 -1
  400. package/dist/ws/use-web-socket.js +3 -1
  401. package/dist/ws/use-web-socket.js.map +1 -1
  402. package/package.json +14 -4
  403. package/template/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { isInsideBase, toAlias } from "./specifier.mjs";
4
+
5
+ const BASE = "/proj/src";
6
+ const FILE = "/proj/src/components/Card/Card.tsx";
7
+
8
+ const alias = (spec, filePath = FILE) => toAlias({ spec, filePath, prefix: "@", baseDir: BASE });
9
+
10
+ describe("isInsideBase", () => {
11
+ it("accepts a file under the base", () => {
12
+ expect(isInsideBase(FILE, BASE)).toBe(true);
13
+ });
14
+ it("rejects a file outside the base", () => {
15
+ expect(isInsideBase("/proj/vite.config.ts", BASE)).toBe(false);
16
+ expect(isInsideBase("/proj/e2e/spec.ts", BASE)).toBe(false);
17
+ });
18
+ it("rejects the base itself", () => {
19
+ expect(isInsideBase(BASE, BASE)).toBe(false);
20
+ });
21
+ });
22
+
23
+ describe("toAlias — what converts", () => {
24
+ it("converts a specifier climbing two levels", () => {
25
+ expect(alias("../../services/api")).toBe("@/services/api");
26
+ });
27
+ it("converts a specifier climbing one level", () => {
28
+ expect(alias("../Button")).toBe("@/components/Button");
29
+ });
30
+ it("converts up to the base root", () => {
31
+ expect(alias("../../routes")).toBe("@/routes");
32
+ });
33
+ });
34
+
35
+ describe("toAlias — what stays", () => {
36
+ it("leaves a sibling alone", () => {
37
+ expect(alias("./Card.module.css")).toBeNull();
38
+ expect(alias("./nested/deep")).toBeNull();
39
+ });
40
+ it("leaves a bare package alone", () => {
41
+ expect(alias("react")).toBeNull();
42
+ expect(alias("tempest-react-sdk/charts")).toBeNull();
43
+ });
44
+ it("leaves an already-aliased specifier alone", () => {
45
+ expect(alias("@/services/api")).toBeNull();
46
+ });
47
+ it("leaves a target outside the base alone", () => {
48
+ expect(alias("../../../vite.config")).toBeNull();
49
+ expect(alias("../../../../elsewhere/x")).toBeNull();
50
+ });
51
+ it("leaves a climb that lands exactly on the base alone", () => {
52
+ expect(alias("../..")).toBeNull();
53
+ expect(alias("../../")).toBeNull();
54
+ });
55
+ });
56
+
57
+ describe("toAlias — extensions", () => {
58
+ it("preserves whatever extension the specifier carried", () => {
59
+ expect(alias("../../styles/tokens.css")).toBe("@/styles/tokens.css");
60
+ expect(alias("../Card.module.css")).toBe("@/components/Card.module.css");
61
+ expect(alias("../../assets/logo.svg")).toBe("@/assets/logo.svg");
62
+ expect(alias("../../data/seed.json")).toBe("@/data/seed.json");
63
+ });
64
+ it("does not add an extension to an extensionless specifier", () => {
65
+ expect(alias("../../lib/api")).toBe("@/lib/api");
66
+ });
67
+ });
68
+
69
+ describe("toAlias — prefix and base come from the caller", () => {
70
+ it("honours a non-@ prefix", () => {
71
+ expect(toAlias({ spec: "../../lib/api", filePath: FILE, prefix: "~", baseDir: BASE })).toBe(
72
+ "~/lib/api",
73
+ );
74
+ });
75
+ it("honours an app/ base", () => {
76
+ expect(
77
+ toAlias({
78
+ spec: "../../lib/api",
79
+ filePath: "/proj/app/components/Card/Card.tsx",
80
+ prefix: "@",
81
+ baseDir: "/proj/app",
82
+ }),
83
+ ).toBe("@/lib/api");
84
+ });
85
+ });
@@ -0,0 +1,116 @@
1
+ // Read a project's tsconfig.json the way `tsc` does: JSONC comments allowed and
2
+ // the `extends` chain merged — without normalizing option values.
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { createRequire } from "node:module";
5
+ import { dirname, isAbsolute, join, resolve } from "node:path";
6
+
7
+ const MAX_EXTENDS_DEPTH = 16;
8
+
9
+ /**
10
+ * Parse one tsconfig file into its raw JSON object.
11
+ *
12
+ * Prefers `ts.readConfigFile`, which accepts the JSONC dialect `tsc` accepts
13
+ * (comments, trailing commas). Falls back to `JSON.parse` so a project without
14
+ * TypeScript installed still gets the previous behavior instead of nothing.
15
+ *
16
+ * @param {string} path - Absolute path to a tsconfig file.
17
+ * @param {object | null} ts - The `typescript` module, or `null`.
18
+ * @returns {object | null} The raw config object, or `null` when unreadable.
19
+ */
20
+ function parseConfigFile(path, ts) {
21
+ if (ts) {
22
+ const { config, error } = ts.readConfigFile(path, (p) => {
23
+ try {
24
+ return readFileSync(p, "utf8");
25
+ } catch {
26
+ return undefined;
27
+ }
28
+ });
29
+ return error || !config ? null : config;
30
+ }
31
+ try {
32
+ return JSON.parse(readFileSync(path, "utf8"));
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Resolve an `extends` entry to an absolute file path.
40
+ *
41
+ * Handles the two forms `tsc` supports: a relative/absolute path (with the
42
+ * `.json` extension optional) and a bare package specifier such as
43
+ * `@tsconfig/vite-react/tsconfig.json`, resolved from the extending file's
44
+ * directory.
45
+ *
46
+ * @param {string} spec - The `extends` value.
47
+ * @param {string} fromDir - Directory of the config that declares it.
48
+ * @returns {string | null} Absolute path, or `null` when it cannot be resolved.
49
+ */
50
+ function resolveExtends(spec, fromDir) {
51
+ if (spec.startsWith(".") || isAbsolute(spec)) {
52
+ const base = resolve(fromDir, spec);
53
+ for (const candidate of [base, `${base}.json`, join(base, "tsconfig.json")]) {
54
+ if (existsSync(candidate)) return candidate;
55
+ }
56
+ return null;
57
+ }
58
+ try {
59
+ return createRequire(join(fromDir, "package.json")).resolve(spec);
60
+ } catch {
61
+ try {
62
+ return createRequire(join(fromDir, "package.json")).resolve(
63
+ join(spec, "tsconfig.json"),
64
+ );
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Read a project's tsconfig with its `extends` chain merged.
73
+ *
74
+ * `compilerOptions` are merged shallowly with the extending file winning, which
75
+ * matches `tsc` for the scalar options this CLI reads. Path-valued options
76
+ * (`baseUrl`, `paths`) are kept together with the directory of the file that
77
+ * declared them, because `tsc` resolves them relative to *that* file — not to
78
+ * the leaf config.
79
+ *
80
+ * Values are returned raw (`"bundler"`, `"react-jsx"`), never the numeric enums
81
+ * `ts.parseJsonConfigFileContent` would produce, so callers can compare strings.
82
+ *
83
+ * @param {object} params
84
+ * @param {string} params.root - Project root.
85
+ * @param {object | null} params.ts - The `typescript` module, or `null`.
86
+ * @param {string} [params.fileName] - Config file name. Default `"tsconfig.json"`.
87
+ * @returns {{ path: string, dir: string, compilerOptions: object, pathsBaseDir: string } | null}
88
+ * `null` when the file is absent or unparseable.
89
+ */
90
+ export function readTsconfig({ root, ts, fileName = "tsconfig.json" }) {
91
+ const path = resolve(root, fileName);
92
+ if (!existsSync(path)) return null;
93
+
94
+ const chain = [];
95
+ let current = path;
96
+ let depth = 0;
97
+ while (current && depth++ < MAX_EXTENDS_DEPTH) {
98
+ const config = parseConfigFile(current, ts);
99
+ if (!config) break;
100
+ chain.push({ dir: dirname(current), config });
101
+ const next = config.extends;
102
+ if (typeof next !== "string") break;
103
+ current = resolveExtends(next, dirname(current));
104
+ }
105
+ if (!chain.length) return null;
106
+
107
+ const compilerOptions = {};
108
+ let pathsBaseDir = dirname(path);
109
+ for (const { dir, config } of chain.reverse()) {
110
+ const co = config.compilerOptions;
111
+ if (!co || typeof co !== "object") continue;
112
+ if (co.paths || co.baseUrl) pathsBaseDir = dir;
113
+ Object.assign(compilerOptions, co);
114
+ }
115
+ return { path, dir: dirname(path), compilerOptions, pathsBaseDir };
116
+ }
@@ -0,0 +1,23 @@
1
+ // Resolve the *project's own* TypeScript install — the alias codemod parses app
2
+ // source, so it must agree with the compiler that type-checks it.
3
+ import { createRequire } from "node:module";
4
+ import { join } from "node:path";
5
+
6
+ /**
7
+ * Load `typescript` from the project's `node_modules`.
8
+ *
9
+ * Resolution is anchored at `root` (not at this file) so the CLI never falls
10
+ * back to a copy bundled with the SDK: parsing app source with a different
11
+ * compiler version than the one that type-checks it would let syntax the app
12
+ * accepts fail here.
13
+ *
14
+ * @param {string} root - Project root, the directory holding `node_modules`.
15
+ * @returns {object | null} The `typescript` module, or `null` when not installed.
16
+ */
17
+ export function loadTypeScript(root) {
18
+ try {
19
+ return createRequire(join(root, "package.json"))("typescript");
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
@@ -0,0 +1,156 @@
1
+ // `tempest gen icons` — write a static icon registry from the slugs an app's
2
+ // source mentions, for projects that want a versioned file instead of the
3
+ // `virtual:tempest-icons` module the Vite plugin generates.
4
+ import { readdir, readFile } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+
8
+ const NAME_PATTERNS = [
9
+ /\bname\s*=\s*["']([a-z0-9-]+)["']/g,
10
+ /\bname\s*=\s*\{\s*["']([a-z0-9-]+)["']\s*\}/g,
11
+ /\bname\s*:\s*["']([a-z0-9-]+)["']/g,
12
+ ];
13
+
14
+ const SOURCE_FILE = /\.[cm]?[jt]sx?$/;
15
+ const SKIP_DIRS = new Set(["node_modules", "dist", "build", "coverage"]);
16
+
17
+ /**
18
+ * Read the slug tables out of the installed SDK build.
19
+ *
20
+ * Deliberately reads `dist/` rather than embedding a copy: the CLI must agree with
21
+ * the `<Icon>` the app actually renders, and both come from the same install.
22
+ *
23
+ * @param {string} selfDir - Directory holding this CLI (`bin/`).
24
+ * @returns {Promise<{ known: Set<string>, aliases: Record<string, string> }>}
25
+ */
26
+ export async function loadIconTables(selfDir) {
27
+ const dist = join(selfDir, "..", "dist", "icons.js");
28
+ const mod = await import(pathToFileURL(dist).href);
29
+ return { known: new Set(mod.iconNames), aliases: mod.iconAliases };
30
+ }
31
+
32
+ /**
33
+ * Collect the icon slugs referenced literally in a source string.
34
+ *
35
+ * @param {string} code - File contents.
36
+ * @param {Set<string>} known - Real lucide slugs, aliases included.
37
+ * @returns {string[]} Validated slugs.
38
+ */
39
+ export function scanIconSlugs(code, known) {
40
+ const found = new Set();
41
+ for (const pattern of NAME_PATTERNS) {
42
+ pattern.lastIndex = 0;
43
+ let match;
44
+ while ((match = pattern.exec(code)) !== null) {
45
+ if (known.has(match[1])) found.add(match[1]);
46
+ }
47
+ }
48
+ return [...found];
49
+ }
50
+
51
+ /**
52
+ * Walk a directory for source files, skipping build output and dot directories.
53
+ *
54
+ * @param {string} dir - Absolute directory.
55
+ * @returns {Promise<string[]>} Absolute file paths.
56
+ */
57
+ export async function collectSourceFiles(dir) {
58
+ const out = [];
59
+ let entries;
60
+ try {
61
+ entries = await readdir(dir, { withFileTypes: true });
62
+ } catch {
63
+ return out;
64
+ }
65
+ for (const entry of entries) {
66
+ if (entry.isDirectory()) {
67
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith(".")) continue;
68
+ out.push(...(await collectSourceFiles(join(dir, entry.name))));
69
+ } else if (entry.isFile() && SOURCE_FILE.test(entry.name)) {
70
+ out.push(join(dir, entry.name));
71
+ }
72
+ }
73
+ return out;
74
+ }
75
+
76
+ /** `circle-alert` → `CircleAlert`; `a-arrow-down` → `AArrowDown`. */
77
+ function pascalCase(slug) {
78
+ return slug
79
+ .split("-")
80
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
81
+ .join("");
82
+ }
83
+
84
+ /**
85
+ * Export names that would shadow a restricted global if bound directly.
86
+ *
87
+ * Lucide ships an icon literally called `infinity`, whose export is `Infinity`.
88
+ * Binding that at module scope shadows the global, so the import is aliased.
89
+ */
90
+ const RESERVED_NAMES = new Set(["Infinity", "NaN", "undefined", "eval", "arguments"]);
91
+
92
+ /** The local binding to use for a lucide export name. */
93
+ function localName(name) {
94
+ return RESERVED_NAMES.has(name) ? `${name}Icon` : name;
95
+ }
96
+
97
+ /**
98
+ * Render the registry module.
99
+ *
100
+ * An alias slug imports its canonical component but keeps its own key, so a name
101
+ * persisted before a lucide rename still resolves with no extra request.
102
+ *
103
+ * @param {readonly string[]} slugs - Validated slugs.
104
+ * @param {Record<string, string>} aliases - Alias slug → canonical slug.
105
+ * @returns {string} TypeScript module source.
106
+ */
107
+ export function renderRegistry(slugs, aliases) {
108
+ const sorted = [...new Set(slugs)].sort();
109
+ const header = `// GENERATED by \`tempest gen icons\` — re-run after adding icons.
110
+ import { createIconRegistry } from "tempest-react-sdk/icons";
111
+ `;
112
+ if (!sorted.length) {
113
+ return `${header}
114
+ export const icons = createIconRegistry({});
115
+ `;
116
+ }
117
+ const componentOf = new Map(sorted.map((slug) => [slug, pascalCase(aliases[slug] ?? slug)]));
118
+ const named = [...new Set(componentOf.values())]
119
+ .sort()
120
+ .map((name) => (localName(name) === name ? name : `${name} as ${localName(name)}`))
121
+ .join(", ");
122
+ const entries = sorted
123
+ .map((slug) => ` "${slug}": ${localName(componentOf.get(slug))},`)
124
+ .join("\n");
125
+ return `${header}import { ${named} } from "lucide-react";
126
+
127
+ export const icons = createIconRegistry({
128
+ ${entries}
129
+ });
130
+ `;
131
+ }
132
+
133
+ /**
134
+ * Scan a directory tree and render the registry module for it.
135
+ *
136
+ * @param {object} params
137
+ * @param {string} params.dir - Absolute directory to scan.
138
+ * @param {Set<string>} params.known - Real lucide slugs.
139
+ * @param {Record<string, string>} params.aliases - Alias slug → canonical slug.
140
+ * @param {readonly string[]} [params.include] - Extra slugs the scan cannot see.
141
+ * @returns {Promise<{ source: string, slugs: string[], files: number }>}
142
+ */
143
+ export async function generateRegistry({ dir, known, aliases, include = [] }) {
144
+ const files = await collectSourceFiles(dir);
145
+ const slugs = new Set(include.filter((slug) => known.has(slug)));
146
+ for (const file of files) {
147
+ try {
148
+ const code = await readFile(file, "utf8");
149
+ for (const slug of scanIconSlugs(code, known)) slugs.add(slug);
150
+ } catch {
151
+ /* an unreadable file just contributes nothing */
152
+ }
153
+ }
154
+ const sorted = [...slugs].sort();
155
+ return { source: renderRegistry(sorted, aliases), slugs: sorted, files: files.length };
156
+ }
@@ -0,0 +1,125 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+
6
+ import { iconAliases, iconNames } from "@/icons";
7
+
8
+ import { generateRegistry, renderRegistry, scanIconSlugs } from "./generate.mjs";
9
+
10
+ const known = new Set(iconNames);
11
+
12
+ describe("scanIconSlugs", () => {
13
+ it("finds literal name props, braced or not", () => {
14
+ expect(
15
+ scanIconSlugs(`<Icon name="save" /><Icon name={"trash-2"} />`, known).sort(),
16
+ ).toEqual(["save", "trash-2"]);
17
+ });
18
+ it("finds an object field", () => {
19
+ expect(scanIconSlugs(`{ name: "house" }`, known)).toEqual(["house"]);
20
+ });
21
+ it("ignores a name that is not a lucide slug", () => {
22
+ expect(scanIconSlugs(`<Field name="email" />`, known)).toEqual([]);
23
+ });
24
+ it("ignores a dynamic name", () => {
25
+ expect(scanIconSlugs(`<Icon name={row.icon} />`, known)).toEqual([]);
26
+ });
27
+ });
28
+
29
+ describe("renderRegistry", () => {
30
+ it("emits a createIconRegistry call with static imports", () => {
31
+ const out = renderRegistry(["save", "trash-2"], iconAliases);
32
+ expect(out).toContain(`import { createIconRegistry } from "tempest-react-sdk/icons";`);
33
+ expect(out).toContain(`import { Save, Trash2 } from "lucide-react";`);
34
+ expect(out).toContain(` "save": Save,`);
35
+ });
36
+ it("imports the canonical component for an alias but keeps the alias key", () => {
37
+ const out = renderRegistry(["alert-circle"], iconAliases);
38
+ expect(out).toContain(`import { CircleAlert } from "lucide-react";`);
39
+ expect(out).toContain(` "alert-circle": CircleAlert,`);
40
+ });
41
+ it("emits an empty registry rather than an empty import", () => {
42
+ expect(renderRegistry([], iconAliases)).toContain("createIconRegistry({})");
43
+ });
44
+ it("is deterministic regardless of input order", () => {
45
+ expect(renderRegistry(["trash-2", "save"], iconAliases)).toBe(
46
+ renderRegistry(["save", "trash-2"], iconAliases),
47
+ );
48
+ });
49
+ });
50
+
51
+ describe("generateRegistry", () => {
52
+ let root;
53
+
54
+ beforeEach(() => {
55
+ root = mkdtempSync(join(tmpdir(), "tempest-gen-icons-"));
56
+ });
57
+
58
+ afterEach(() => {
59
+ rmSync(root, { recursive: true, force: true });
60
+ });
61
+
62
+ /** Write a source file under the fixture root. */
63
+ function write(rel, contents) {
64
+ const path = join(root, rel);
65
+ mkdirSync(join(path, ".."), { recursive: true });
66
+ writeFileSync(path, contents);
67
+ }
68
+
69
+ it("collects slugs across a nested tree", async () => {
70
+ write("pages/Home.tsx", `<Icon name="house" />`);
71
+ write("pages/admin/Users.tsx", `<Icon name="users" />`);
72
+ const { slugs, files } = await generateRegistry({ dir: root, known, aliases: iconAliases });
73
+ expect(slugs).toEqual(["house", "users"]);
74
+ expect(files).toBe(2);
75
+ });
76
+
77
+ it("skips node_modules, dist and dot directories", async () => {
78
+ write("node_modules/dep/index.ts", `<Icon name="bug" />`);
79
+ write("dist/out.js", `<Icon name="bomb" />`);
80
+ write(".cache/x.ts", `<Icon name="box" />`);
81
+ write("App.tsx", `<Icon name="house" />`);
82
+ const { slugs } = await generateRegistry({ dir: root, known, aliases: iconAliases });
83
+ expect(slugs).toEqual(["house"]);
84
+ });
85
+
86
+ it("adds include slugs and drops invalid ones", async () => {
87
+ write("App.tsx", "");
88
+ const { slugs } = await generateRegistry({
89
+ dir: root,
90
+ known,
91
+ aliases: iconAliases,
92
+ include: ["rocket", "not-an-icon"],
93
+ });
94
+ expect(slugs).toEqual(["rocket"]);
95
+ });
96
+
97
+ it("yields an empty registry for a tree with no icons", async () => {
98
+ write("App.tsx", `export const App = () => null;`);
99
+ const { slugs, source } = await generateRegistry({
100
+ dir: root,
101
+ known,
102
+ aliases: iconAliases,
103
+ });
104
+ expect(slugs).toEqual([]);
105
+ expect(source).toContain("createIconRegistry({})");
106
+ });
107
+
108
+ it("returns zero files for a directory that does not exist", async () => {
109
+ const { files, slugs } = await generateRegistry({
110
+ dir: join(root, "nope"),
111
+ known,
112
+ aliases: iconAliases,
113
+ });
114
+ expect(files).toBe(0);
115
+ expect(slugs).toEqual([]);
116
+ });
117
+ });
118
+
119
+ describe("renderRegistry — reserved names", () => {
120
+ it("aliases an export name that would shadow a restricted global", () => {
121
+ const out = renderRegistry(["infinity"], iconAliases);
122
+ expect(out).toContain(`import { Infinity as InfinityIcon } from "lucide-react";`);
123
+ expect(out).toContain(`"infinity": InfinityIcon,`);
124
+ });
125
+ });