@pattern-stack/frontend-patterns 0.0.6 → 0.1.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 (647) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/LICENSE +19 -0
  3. package/cli/cli/commands/generate-hooks.js +291 -0
  4. package/cli/cli/commands/init.js +25 -0
  5. package/cli/cli/commands/scaffold.js +201 -0
  6. package/cli/cli/index.js +113 -0
  7. package/cli/commands/generate-hooks.js +288 -0
  8. package/cli/commands/generate-hooks.ts +316 -0
  9. package/cli/commands/init.js +22 -0
  10. package/cli/commands/init.ts +33 -0
  11. package/cli/commands/scaffold.js +198 -0
  12. package/cli/commands/scaffold.ts +224 -0
  13. package/cli/index.js +3210 -0
  14. package/cli/index.ts +122 -0
  15. package/cli/src/codegen/openapi/bulk-hook-generator.js +252 -0
  16. package/cli/src/codegen/openapi/bulk-types.js +89 -0
  17. package/cli/src/codegen/openapi/client-generator.js +672 -0
  18. package/cli/src/codegen/openapi/confidence-scorer.js +204 -0
  19. package/cli/src/codegen/openapi/hook-config.js +66 -0
  20. package/cli/src/codegen/openapi/hook-generator.js +1057 -0
  21. package/cli/src/codegen/openapi/parser.js +279 -0
  22. package/cli/src/codegen/openapi/type-generator.js +339 -0
  23. package/dist/atoms/components/core/Avatar/Avatar.d.ts +41 -0
  24. package/dist/atoms/components/core/Avatar/Avatar.d.ts.map +1 -0
  25. package/dist/atoms/components/core/Avatar/index.d.ts +2 -0
  26. package/dist/atoms/components/core/Avatar/index.d.ts.map +1 -0
  27. package/dist/atoms/components/core/Badge/Badge.d.ts +38 -0
  28. package/dist/atoms/components/core/Badge/Badge.d.ts.map +1 -0
  29. package/dist/atoms/components/core/Badge/index.d.ts +2 -0
  30. package/dist/atoms/components/core/Badge/index.d.ts.map +1 -0
  31. package/dist/atoms/components/core/Button/Button.d.ts +28 -0
  32. package/dist/atoms/components/core/Button/Button.d.ts.map +1 -0
  33. package/dist/atoms/components/core/Button/index.d.ts +3 -0
  34. package/dist/atoms/components/core/Button/index.d.ts.map +1 -0
  35. package/dist/atoms/components/core/Card/Card.d.ts +41 -0
  36. package/dist/atoms/components/core/Card/Card.d.ts.map +1 -0
  37. package/dist/atoms/components/core/Card/index.d.ts +3 -0
  38. package/dist/atoms/components/core/Card/index.d.ts.map +1 -0
  39. package/dist/atoms/components/core/Checkbox/Checkbox.d.ts +28 -0
  40. package/dist/atoms/components/core/Checkbox/Checkbox.d.ts.map +1 -0
  41. package/dist/atoms/components/core/Checkbox/index.d.ts +3 -0
  42. package/dist/atoms/components/core/Checkbox/index.d.ts.map +1 -0
  43. package/dist/atoms/components/core/Input/Input.d.ts +37 -0
  44. package/dist/atoms/components/core/Input/Input.d.ts.map +1 -0
  45. package/dist/atoms/components/core/Input/index.d.ts +3 -0
  46. package/dist/atoms/components/core/Input/index.d.ts.map +1 -0
  47. package/dist/atoms/components/core/Label/Label.d.ts +23 -0
  48. package/dist/atoms/components/core/Label/Label.d.ts.map +1 -0
  49. package/dist/atoms/components/core/Label/index.d.ts +3 -0
  50. package/dist/atoms/components/core/Label/index.d.ts.map +1 -0
  51. package/dist/atoms/components/core/Select/Select.d.ts +42 -0
  52. package/dist/atoms/components/core/Select/Select.d.ts.map +1 -0
  53. package/dist/atoms/components/core/Select/index.d.ts +3 -0
  54. package/dist/atoms/components/core/Select/index.d.ts.map +1 -0
  55. package/dist/atoms/components/core/Spinner/Spinner.d.ts +25 -0
  56. package/dist/atoms/components/core/Spinner/Spinner.d.ts.map +1 -0
  57. package/dist/atoms/components/core/Spinner/index.d.ts +3 -0
  58. package/dist/atoms/components/core/Spinner/index.d.ts.map +1 -0
  59. package/dist/atoms/components/core/Switch/Switch.d.ts +35 -0
  60. package/dist/atoms/components/core/Switch/Switch.d.ts.map +1 -0
  61. package/dist/atoms/components/core/Switch/index.d.ts +2 -0
  62. package/dist/atoms/components/core/Switch/index.d.ts.map +1 -0
  63. package/dist/atoms/components/core/index.d.ts +11 -0
  64. package/dist/atoms/components/core/index.d.ts.map +1 -0
  65. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts +4 -0
  66. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts.map +1 -0
  67. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts +38 -0
  68. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts.map +1 -0
  69. package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts +9 -0
  70. package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts.map +1 -0
  71. package/dist/atoms/components/data/ActivityFeed/index.d.ts +4 -0
  72. package/dist/atoms/components/data/ActivityFeed/index.d.ts.map +1 -0
  73. package/dist/atoms/components/data/ActivityFeed/types.d.ts +26 -0
  74. package/dist/atoms/components/data/ActivityFeed/types.d.ts.map +1 -0
  75. package/dist/atoms/components/data/ActivityFeed/utils.d.ts +5 -0
  76. package/dist/atoms/components/data/ActivityFeed/utils.d.ts.map +1 -0
  77. package/dist/atoms/{composed → components/data}/Chart/Chart.d.ts +2 -2
  78. package/dist/atoms/components/data/Chart/Chart.d.ts.map +1 -0
  79. package/dist/atoms/components/data/Chart/index.d.ts.map +1 -0
  80. package/dist/atoms/components/data/DataBadge/DataBadge.d.ts +18 -0
  81. package/dist/atoms/components/data/DataBadge/DataBadge.d.ts.map +1 -0
  82. package/dist/atoms/components/data/DataBadge/index.d.ts.map +1 -0
  83. package/dist/atoms/components/data/DataTable/DataTable.d.ts +5 -0
  84. package/dist/atoms/components/data/DataTable/DataTable.d.ts.map +1 -0
  85. package/dist/atoms/components/data/DataTable/DataTable.types.d.ts +51 -0
  86. package/dist/atoms/components/data/DataTable/DataTable.types.d.ts.map +1 -0
  87. package/dist/atoms/components/data/DataTable/TableCellWithTooltip.d.ts.map +1 -0
  88. package/dist/atoms/components/data/DataTable/index.d.ts.map +1 -0
  89. package/dist/atoms/components/data/DetailedCard/DetailedCard.d.ts.map +1 -0
  90. package/dist/atoms/components/data/DetailedCard/index.d.ts.map +1 -0
  91. package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts +24 -0
  92. package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts.map +1 -0
  93. package/dist/atoms/components/data/EntityIcon/index.d.ts +2 -0
  94. package/dist/atoms/components/data/EntityIcon/index.d.ts.map +1 -0
  95. package/dist/atoms/{composed → components/data}/IconBadge/IconBadge.d.ts +2 -1
  96. package/dist/atoms/components/data/IconBadge/IconBadge.d.ts.map +1 -0
  97. package/dist/atoms/components/data/IconBadge/index.d.ts.map +1 -0
  98. package/dist/atoms/components/data/ListCard/ListCard.d.ts +32 -0
  99. package/dist/atoms/components/data/ListCard/ListCard.d.ts.map +1 -0
  100. package/dist/atoms/components/data/ListCard/index.d.ts +2 -0
  101. package/dist/atoms/components/data/ListCard/index.d.ts.map +1 -0
  102. package/dist/atoms/components/data/ProgressBar/ProgressBar.d.ts.map +1 -0
  103. package/dist/atoms/components/data/ProgressBar/index.d.ts.map +1 -0
  104. package/dist/atoms/{composed → components/data}/StatCard/StatCard.d.ts +1 -1
  105. package/dist/atoms/components/data/StatCard/StatCard.d.ts.map +1 -0
  106. package/dist/atoms/components/data/StatCard/index.d.ts.map +1 -0
  107. package/dist/atoms/components/data/Table/Table.d.ts +41 -0
  108. package/dist/atoms/components/data/Table/Table.d.ts.map +1 -0
  109. package/dist/atoms/components/data/Table/index.d.ts +2 -0
  110. package/dist/atoms/components/data/Table/index.d.ts.map +1 -0
  111. package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts +26 -0
  112. package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts.map +1 -0
  113. package/dist/atoms/components/data/TruncatedText/index.d.ts +2 -0
  114. package/dist/atoms/components/data/TruncatedText/index.d.ts.map +1 -0
  115. package/dist/atoms/components/data/index.d.ts +13 -0
  116. package/dist/atoms/components/data/index.d.ts.map +1 -0
  117. package/dist/atoms/components/domain/SalesPanel/SalesPanel.d.ts.map +1 -0
  118. package/dist/atoms/components/domain/SalesPanel/index.d.ts.map +1 -0
  119. package/dist/atoms/components/domain/SalesPanel/mockSalesData.d.ts.map +1 -0
  120. package/dist/atoms/components/domain/index.d.ts +2 -0
  121. package/dist/atoms/components/domain/index.d.ts.map +1 -0
  122. package/dist/atoms/components/feedback/Alert/Alert.d.ts.map +1 -0
  123. package/dist/atoms/components/feedback/Alert/index.d.ts.map +1 -0
  124. package/dist/atoms/components/feedback/EmptyState/EmptyState.d.ts.map +1 -0
  125. package/dist/atoms/components/feedback/EmptyState/index.d.ts.map +1 -0
  126. package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts +61 -0
  127. package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
  128. package/dist/atoms/components/feedback/ErrorBoundary/index.d.ts +2 -0
  129. package/dist/atoms/components/feedback/ErrorBoundary/index.d.ts.map +1 -0
  130. package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts +41 -0
  131. package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts.map +1 -0
  132. package/dist/atoms/components/feedback/Skeleton/index.d.ts +2 -0
  133. package/dist/atoms/components/feedback/Skeleton/index.d.ts.map +1 -0
  134. package/dist/atoms/components/feedback/Toast/Toast.d.ts.map +1 -0
  135. package/dist/atoms/components/feedback/Toast/index.d.ts.map +1 -0
  136. package/dist/atoms/components/feedback/index.d.ts +6 -0
  137. package/dist/atoms/components/feedback/index.d.ts.map +1 -0
  138. package/dist/atoms/components/forms/DateTimePicker/DateTimePicker.d.ts.map +1 -0
  139. package/dist/atoms/components/forms/DateTimePicker/index.d.ts.map +1 -0
  140. package/dist/atoms/components/forms/FileUpload/FileUpload.d.ts.map +1 -0
  141. package/dist/atoms/components/forms/FileUpload/index.d.ts.map +1 -0
  142. package/dist/atoms/components/forms/FormField/FormField.d.ts.map +1 -0
  143. package/dist/atoms/components/forms/FormField/index.d.ts.map +1 -0
  144. package/dist/atoms/components/forms/index.d.ts +4 -0
  145. package/dist/atoms/components/forms/index.d.ts.map +1 -0
  146. package/dist/atoms/components/index.d.ts +10 -0
  147. package/dist/atoms/components/index.d.ts.map +1 -0
  148. package/dist/atoms/components/layout/Accordion/Accordion.d.ts.map +1 -0
  149. package/dist/atoms/components/layout/Accordion/index.d.ts.map +1 -0
  150. package/dist/atoms/components/layout/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  151. package/dist/atoms/components/layout/Breadcrumb/index.d.ts.map +1 -0
  152. package/dist/atoms/components/layout/Dialog/index.d.ts +3 -0
  153. package/dist/atoms/components/layout/Dialog/index.d.ts.map +1 -0
  154. package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts +40 -0
  155. package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts.map +1 -0
  156. package/dist/atoms/components/layout/Dropdown/index.d.ts +3 -0
  157. package/dist/atoms/components/layout/Dropdown/index.d.ts.map +1 -0
  158. package/dist/atoms/components/layout/Modal/Modal.d.ts.map +1 -0
  159. package/dist/atoms/components/layout/Modal/index.d.ts.map +1 -0
  160. package/dist/atoms/components/layout/Tabs/index.d.ts +2 -0
  161. package/dist/atoms/components/layout/Tabs/index.d.ts.map +1 -0
  162. package/dist/atoms/components/layout/Tooltip/Tooltip.d.ts.map +1 -0
  163. package/dist/atoms/components/layout/Tooltip/index.d.ts +2 -0
  164. package/dist/atoms/components/layout/Tooltip/index.d.ts.map +1 -0
  165. package/dist/atoms/components/layout/index.d.ts +8 -0
  166. package/dist/atoms/components/layout/index.d.ts.map +1 -0
  167. package/dist/atoms/components/navigation/GlobalSearch/GlobalSearch.d.ts.map +1 -0
  168. package/dist/atoms/components/navigation/GlobalSearch/index.d.ts.map +1 -0
  169. package/dist/atoms/components/navigation/index.d.ts +2 -0
  170. package/dist/atoms/components/navigation/index.d.ts.map +1 -0
  171. package/dist/atoms/components/theme/ColorSwatch/ColorSwatch.d.ts.map +1 -0
  172. package/dist/atoms/components/theme/ColorSwatch/index.d.ts.map +1 -0
  173. package/dist/atoms/components/theme/DarkModeToggle.d.ts.map +1 -0
  174. package/dist/atoms/components/theme/PaletteSwitcher.d.ts.map +1 -0
  175. package/dist/atoms/components/theme/StyleGuide.d.ts.map +1 -0
  176. package/dist/atoms/components/theme/index.d.ts +5 -0
  177. package/dist/atoms/components/theme/index.d.ts.map +1 -0
  178. package/dist/atoms/components/user/UserAvatar/UserAvatar.d.ts.map +1 -0
  179. package/dist/atoms/components/user/UserAvatar/index.d.ts.map +1 -0
  180. package/dist/atoms/components/user/UserMenu/UserMenu.d.ts.map +1 -0
  181. package/dist/atoms/components/user/UserMenu/index.d.ts.map +1 -0
  182. package/dist/atoms/components/user/index.d.ts +3 -0
  183. package/dist/atoms/components/user/index.d.ts.map +1 -0
  184. package/dist/atoms/config/responsive.d.ts +147 -0
  185. package/dist/atoms/config/responsive.d.ts.map +1 -0
  186. package/dist/atoms/hooks/index.d.ts +5 -0
  187. package/dist/atoms/hooks/index.d.ts.map +1 -0
  188. package/dist/atoms/hooks/use-toast.d.ts +16 -0
  189. package/dist/atoms/hooks/use-toast.d.ts.map +1 -0
  190. package/dist/atoms/hooks/useResponsive.d.ts +42 -0
  191. package/dist/atoms/hooks/useResponsive.d.ts.map +1 -0
  192. package/dist/atoms/index.d.ts +4 -5
  193. package/dist/atoms/index.d.ts.map +1 -1
  194. package/dist/atoms/primitives/Badge.d.ts.map +1 -0
  195. package/dist/atoms/{ui → primitives}/ErrorBoundary.d.ts +1 -1
  196. package/dist/atoms/primitives/ErrorBoundary.d.ts.map +1 -0
  197. package/dist/atoms/primitives/Select.d.ts.map +1 -0
  198. package/dist/atoms/primitives/Switch.d.ts.map +1 -0
  199. package/dist/atoms/primitives/Tabs.d.ts.map +1 -0
  200. package/dist/atoms/primitives/avatar.d.ts.map +1 -0
  201. package/dist/atoms/{ui → primitives}/button.d.ts +2 -2
  202. package/dist/atoms/primitives/button.d.ts.map +1 -0
  203. package/dist/atoms/primitives/card.d.ts.map +1 -0
  204. package/dist/atoms/primitives/checkbox.d.ts +12 -0
  205. package/dist/atoms/primitives/checkbox.d.ts.map +1 -0
  206. package/dist/atoms/primitives/dialog.d.ts +34 -0
  207. package/dist/atoms/primitives/dialog.d.ts.map +1 -0
  208. package/dist/atoms/primitives/dropdown-menu.d.ts.map +1 -0
  209. package/dist/atoms/{ui → primitives}/index.d.ts +2 -0
  210. package/dist/atoms/primitives/index.d.ts.map +1 -0
  211. package/dist/atoms/primitives/input.d.ts.map +1 -0
  212. package/dist/atoms/primitives/label.d.ts.map +1 -0
  213. package/dist/atoms/primitives/skeleton.d.ts.map +1 -0
  214. package/dist/atoms/primitives/spinner.d.ts.map +1 -0
  215. package/dist/atoms/primitives/table.d.ts.map +1 -0
  216. package/dist/atoms/shared/index.d.ts +1 -0
  217. package/dist/atoms/shared/index.d.ts.map +1 -1
  218. package/dist/atoms/types/index.d.ts +1 -0
  219. package/dist/atoms/types/index.d.ts.map +1 -1
  220. package/dist/atoms/types/navigation.d.ts +1 -1
  221. package/dist/atoms/types/navigation.d.ts.map +1 -1
  222. package/dist/atoms/types/ui-config.d.ts +50 -0
  223. package/dist/atoms/types/ui-config.d.ts.map +1 -0
  224. package/dist/atoms/utils/color-manager.d.ts +68 -0
  225. package/dist/atoms/utils/color-manager.d.ts.map +1 -0
  226. package/dist/atoms/utils/debounce.d.ts +6 -0
  227. package/dist/atoms/utils/debounce.d.ts.map +1 -0
  228. package/dist/atoms/utils/field-detection.d.ts +15 -0
  229. package/dist/atoms/utils/field-detection.d.ts.map +1 -0
  230. package/dist/atoms/utils/icon-resolver.d.ts +5 -1
  231. package/dist/atoms/utils/icon-resolver.d.ts.map +1 -1
  232. package/dist/atoms/utils/index.d.ts +5 -0
  233. package/dist/atoms/utils/index.d.ts.map +1 -0
  234. package/dist/atoms/utils/ui-mapping.d.ts +17 -0
  235. package/dist/atoms/utils/ui-mapping.d.ts.map +1 -0
  236. package/dist/atoms/utils/utils.d.ts +3 -0
  237. package/dist/atoms/utils/utils.d.ts.map +1 -1
  238. package/dist/codegen/index.d.ts +7 -0
  239. package/dist/codegen/index.d.ts.map +1 -0
  240. package/dist/codegen/openapi/bulk-hook-generator.d.ts +40 -0
  241. package/dist/codegen/openapi/bulk-hook-generator.d.ts.map +1 -0
  242. package/dist/codegen/openapi/bulk-types.d.ts +142 -0
  243. package/dist/codegen/openapi/bulk-types.d.ts.map +1 -0
  244. package/dist/codegen/openapi/client-generator.d.ts +52 -0
  245. package/dist/codegen/openapi/client-generator.d.ts.map +1 -0
  246. package/dist/codegen/openapi/confidence-scorer.d.ts +30 -0
  247. package/dist/codegen/openapi/confidence-scorer.d.ts.map +1 -0
  248. package/dist/codegen/openapi/hook-config.d.ts +50 -0
  249. package/dist/codegen/openapi/hook-config.d.ts.map +1 -0
  250. package/dist/codegen/openapi/hook-generator.d.ts +108 -0
  251. package/dist/codegen/openapi/hook-generator.d.ts.map +1 -0
  252. package/dist/codegen/openapi/index.d.ts +27 -0
  253. package/dist/codegen/openapi/index.d.ts.map +1 -0
  254. package/dist/codegen/openapi/parser.d.ts +107 -0
  255. package/dist/codegen/openapi/parser.d.ts.map +1 -0
  256. package/dist/codegen/openapi/type-generator.d.ts +53 -0
  257. package/dist/codegen/openapi/type-generator.d.ts.map +1 -0
  258. package/dist/features/auth/components/LoginForm.d.ts.map +1 -1
  259. package/dist/features/auth/components/ProtectedRoute.d.ts +1 -1
  260. package/dist/features/auth/hooks/index.d.ts +1 -0
  261. package/dist/features/auth/hooks/index.d.ts.map +1 -1
  262. package/dist/features/auth/hooks/useAuthContext.d.ts +7 -0
  263. package/dist/features/auth/hooks/useAuthContext.d.ts.map +1 -0
  264. package/dist/features/auth/index.d.ts +1 -0
  265. package/dist/features/auth/index.d.ts.map +1 -1
  266. package/dist/features/auth/providers/MockAuthProvider.d.ts +9 -0
  267. package/dist/features/auth/providers/MockAuthProvider.d.ts.map +1 -0
  268. package/dist/features/auth/providers/index.d.ts +2 -0
  269. package/dist/features/auth/providers/index.d.ts.map +1 -0
  270. package/dist/features/auth/services/mock-auth-service.d.ts +17 -0
  271. package/dist/features/auth/services/mock-auth-service.d.ts.map +1 -0
  272. package/dist/frontend-patterns.css +4417 -1
  273. package/dist/generated/client/client.d.ts +23 -0
  274. package/dist/generated/client/client.d.ts.map +1 -0
  275. package/dist/generated/client/config.d.ts +10 -0
  276. package/dist/generated/client/config.d.ts.map +1 -0
  277. package/dist/generated/client/index.d.ts +12 -0
  278. package/dist/generated/client/index.d.ts.map +1 -0
  279. package/dist/generated/client/methods.d.ts +591 -0
  280. package/dist/generated/client/methods.d.ts.map +1 -0
  281. package/dist/generated/client/types.d.ts +37 -0
  282. package/dist/generated/client/types.d.ts.map +1 -0
  283. package/dist/generated/example.d.ts +8 -0
  284. package/dist/generated/example.d.ts.map +1 -0
  285. package/dist/generated/hooks/index.d.ts +11 -0
  286. package/dist/generated/hooks/index.d.ts.map +1 -0
  287. package/dist/generated/hooks/keys.d.ts +59 -0
  288. package/dist/generated/hooks/keys.d.ts.map +1 -0
  289. package/dist/generated/hooks/mutations.d.ts +551 -0
  290. package/dist/generated/hooks/mutations.d.ts.map +1 -0
  291. package/dist/generated/hooks/queries.d.ts +426 -0
  292. package/dist/generated/hooks/queries.d.ts.map +1 -0
  293. package/dist/generated/hooks/types.d.ts +318 -0
  294. package/dist/generated/hooks/types.d.ts.map +1 -0
  295. package/dist/generated/index.d.ts +13 -0
  296. package/dist/generated/index.d.ts.map +1 -0
  297. package/dist/generated/types/endpoints.d.ts +1364 -0
  298. package/dist/generated/types/endpoints.d.ts.map +1 -0
  299. package/dist/generated/types/index.d.ts +11 -0
  300. package/dist/generated/types/index.d.ts.map +1 -0
  301. package/dist/generated/types/parameters.d.ts +8 -0
  302. package/dist/generated/types/parameters.d.ts.map +1 -0
  303. package/dist/generated/types/responses.d.ts +8 -0
  304. package/dist/generated/types/responses.d.ts.map +1 -0
  305. package/dist/generated/types/schemas.d.ts +652 -0
  306. package/dist/generated/types/schemas.d.ts.map +1 -0
  307. package/dist/index.d.ts +8 -0
  308. package/dist/index.d.ts.map +1 -1
  309. package/dist/index.es.js +27049 -8420
  310. package/dist/index.es.js.map +1 -1
  311. package/dist/index.js +25314 -6664
  312. package/dist/index.js.map +1 -1
  313. package/dist/molecules/feedback/index.d.ts +2 -0
  314. package/dist/molecules/feedback/index.d.ts.map +1 -0
  315. package/dist/molecules/forms/SearchInput.d.ts.map +1 -1
  316. package/dist/molecules/layout/AppHeader/AppHeader.d.ts.map +1 -1
  317. package/dist/molecules/layout/BulkSelectionBar.d.ts +15 -0
  318. package/dist/molecules/layout/BulkSelectionBar.d.ts.map +1 -0
  319. package/dist/molecules/layout/NavigationContext.d.ts.map +1 -1
  320. package/dist/molecules/layout/index.d.ts +1 -0
  321. package/dist/molecules/layout/index.d.ts.map +1 -1
  322. package/dist/organisms/showcase/ComponentShowcasePage.d.ts.map +1 -1
  323. package/dist/templates/DataTemplate.d.ts +1 -1
  324. package/dist/templates/DataTemplate.d.ts.map +1 -1
  325. package/dist/templates/EnhancedDataTemplate.d.ts +188 -0
  326. package/dist/templates/EnhancedDataTemplate.d.ts.map +1 -0
  327. package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts +18 -0
  328. package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts.map +1 -0
  329. package/dist/templates/EnhancedDataTemplate.hooks.d.ts +22 -0
  330. package/dist/templates/EnhancedDataTemplate.hooks.d.ts.map +1 -0
  331. package/dist/templates/admin/AdminCRUDTemplate.d.ts.map +1 -1
  332. package/dist/templates/admin/AdminDashboardTemplate.d.ts +6 -9
  333. package/dist/templates/admin/AdminDashboardTemplate.d.ts.map +1 -1
  334. package/dist/templates/admin/AdminDetailTemplate.d.ts +1 -1
  335. package/dist/templates/admin/AdminDetailTemplate.d.ts.map +1 -1
  336. package/dist/templates/api/APIDataTemplate.d.ts +66 -0
  337. package/dist/templates/api/APIDataTemplate.d.ts.map +1 -0
  338. package/dist/templates/api/index.d.ts +8 -0
  339. package/dist/templates/api/index.d.ts.map +1 -0
  340. package/dist/templates/index.d.ts +2 -0
  341. package/dist/templates/index.d.ts.map +1 -1
  342. package/package.json +29 -8
  343. package/dist/atoms/composed/Accordion/Accordion.d.ts.map +0 -1
  344. package/dist/atoms/composed/Accordion/index.d.ts.map +0 -1
  345. package/dist/atoms/composed/Alert/Alert.d.ts.map +0 -1
  346. package/dist/atoms/composed/Alert/index.d.ts.map +0 -1
  347. package/dist/atoms/composed/Breadcrumb/Breadcrumb.d.ts.map +0 -1
  348. package/dist/atoms/composed/Breadcrumb/index.d.ts.map +0 -1
  349. package/dist/atoms/composed/Chart/Chart.d.ts.map +0 -1
  350. package/dist/atoms/composed/Chart/index.d.ts.map +0 -1
  351. package/dist/atoms/composed/ColorSwatch/ColorSwatch.d.ts.map +0 -1
  352. package/dist/atoms/composed/ColorSwatch/index.d.ts.map +0 -1
  353. package/dist/atoms/composed/DarkModeToggle.d.ts.map +0 -1
  354. package/dist/atoms/composed/DataBadge/DataBadge.d.ts +0 -13
  355. package/dist/atoms/composed/DataBadge/DataBadge.d.ts.map +0 -1
  356. package/dist/atoms/composed/DataBadge/index.d.ts.map +0 -1
  357. package/dist/atoms/composed/DataTable/DataTable.d.ts +0 -28
  358. package/dist/atoms/composed/DataTable/DataTable.d.ts.map +0 -1
  359. package/dist/atoms/composed/DataTable/TableCellWithTooltip.d.ts.map +0 -1
  360. package/dist/atoms/composed/DataTable/index.d.ts.map +0 -1
  361. package/dist/atoms/composed/DateTimePicker/DateTimePicker.d.ts.map +0 -1
  362. package/dist/atoms/composed/DateTimePicker/index.d.ts.map +0 -1
  363. package/dist/atoms/composed/DetailedCard/DetailedCard.d.ts.map +0 -1
  364. package/dist/atoms/composed/DetailedCard/index.d.ts.map +0 -1
  365. package/dist/atoms/composed/EmptyState/EmptyState.d.ts.map +0 -1
  366. package/dist/atoms/composed/EmptyState/index.d.ts.map +0 -1
  367. package/dist/atoms/composed/FileUpload/FileUpload.d.ts.map +0 -1
  368. package/dist/atoms/composed/FileUpload/index.d.ts.map +0 -1
  369. package/dist/atoms/composed/FormField/FormField.d.ts.map +0 -1
  370. package/dist/atoms/composed/FormField/index.d.ts.map +0 -1
  371. package/dist/atoms/composed/GlobalSearch/GlobalSearch.d.ts.map +0 -1
  372. package/dist/atoms/composed/GlobalSearch/index.d.ts.map +0 -1
  373. package/dist/atoms/composed/IconBadge/IconBadge.d.ts.map +0 -1
  374. package/dist/atoms/composed/IconBadge/index.d.ts.map +0 -1
  375. package/dist/atoms/composed/Modal/Modal.d.ts.map +0 -1
  376. package/dist/atoms/composed/Modal/index.d.ts.map +0 -1
  377. package/dist/atoms/composed/PaletteSwitcher.d.ts.map +0 -1
  378. package/dist/atoms/composed/ProgressBar/ProgressBar.d.ts.map +0 -1
  379. package/dist/atoms/composed/ProgressBar/index.d.ts.map +0 -1
  380. package/dist/atoms/composed/SalesPanel/SalesPanel.d.ts.map +0 -1
  381. package/dist/atoms/composed/SalesPanel/index.d.ts.map +0 -1
  382. package/dist/atoms/composed/SalesPanel/mockSalesData.d.ts.map +0 -1
  383. package/dist/atoms/composed/StatCard/StatCard.d.ts.map +0 -1
  384. package/dist/atoms/composed/StatCard/index.d.ts.map +0 -1
  385. package/dist/atoms/composed/StyleGuide.d.ts.map +0 -1
  386. package/dist/atoms/composed/Toast/Toast.d.ts.map +0 -1
  387. package/dist/atoms/composed/Toast/index.d.ts.map +0 -1
  388. package/dist/atoms/composed/Tooltip/Tooltip.d.ts.map +0 -1
  389. package/dist/atoms/composed/Tooltip/index.d.ts +0 -2
  390. package/dist/atoms/composed/Tooltip/index.d.ts.map +0 -1
  391. package/dist/atoms/composed/UserAvatar/UserAvatar.d.ts.map +0 -1
  392. package/dist/atoms/composed/UserAvatar/index.d.ts.map +0 -1
  393. package/dist/atoms/composed/UserMenu/UserMenu.d.ts.map +0 -1
  394. package/dist/atoms/composed/UserMenu/index.d.ts.map +0 -1
  395. package/dist/atoms/composed/index.d.ts +0 -26
  396. package/dist/atoms/composed/index.d.ts.map +0 -1
  397. package/dist/atoms/ui/Badge.d.ts.map +0 -1
  398. package/dist/atoms/ui/ErrorBoundary.d.ts.map +0 -1
  399. package/dist/atoms/ui/Select.d.ts.map +0 -1
  400. package/dist/atoms/ui/Switch.d.ts.map +0 -1
  401. package/dist/atoms/ui/Tabs.d.ts.map +0 -1
  402. package/dist/atoms/ui/avatar.d.ts.map +0 -1
  403. package/dist/atoms/ui/button.d.ts.map +0 -1
  404. package/dist/atoms/ui/card.d.ts.map +0 -1
  405. package/dist/atoms/ui/dropdown-menu.d.ts.map +0 -1
  406. package/dist/atoms/ui/index.d.ts.map +0 -1
  407. package/dist/atoms/ui/input.d.ts.map +0 -1
  408. package/dist/atoms/ui/label.d.ts.map +0 -1
  409. package/dist/atoms/ui/skeleton.d.ts.map +0 -1
  410. package/dist/atoms/ui/spinner.d.ts.map +0 -1
  411. package/dist/atoms/ui/table.d.ts.map +0 -1
  412. package/src/App.css +0 -42
  413. package/src/App.tsx +0 -64
  414. package/src/__tests__/README.md +0 -221
  415. package/src/__tests__/atoms/composed/databadge.test.tsx +0 -106
  416. package/src/__tests__/atoms/composed/statcard.test.tsx +0 -133
  417. package/src/__tests__/atoms/hooks/simple-hooks.test.ts +0 -44
  418. package/src/__tests__/atoms/ui/button.test.tsx +0 -68
  419. package/src/__tests__/atoms/utils/icon-resolver.test.tsx +0 -140
  420. package/src/__tests__/atoms/utils/simple.test.ts +0 -18
  421. package/src/__tests__/atoms/utils/utils.test.ts +0 -77
  422. package/src/__tests__/features/auth/simple-auth.test.tsx +0 -40
  423. package/src/__tests__/molecules/layout/simple-layout.test.tsx +0 -81
  424. package/src/__tests__/organisms/showcase/simple-showcase.test.tsx +0 -167
  425. package/src/__tests__/setup.ts +0 -51
  426. package/src/__tests__/utils.tsx +0 -123
  427. package/src/atoms/composed/Accordion/Accordion.tsx +0 -271
  428. package/src/atoms/composed/Accordion/index.ts +0 -1
  429. package/src/atoms/composed/Alert/Alert.tsx +0 -132
  430. package/src/atoms/composed/Alert/index.ts +0 -1
  431. package/src/atoms/composed/Breadcrumb/Breadcrumb.tsx +0 -83
  432. package/src/atoms/composed/Breadcrumb/index.ts +0 -1
  433. package/src/atoms/composed/Chart/Chart.tsx +0 -425
  434. package/src/atoms/composed/Chart/index.ts +0 -2
  435. package/src/atoms/composed/ColorSwatch/ColorSwatch.tsx +0 -72
  436. package/src/atoms/composed/ColorSwatch/index.ts +0 -1
  437. package/src/atoms/composed/DarkModeToggle.tsx +0 -66
  438. package/src/atoms/composed/DataBadge/DataBadge.tsx +0 -81
  439. package/src/atoms/composed/DataBadge/index.ts +0 -1
  440. package/src/atoms/composed/DataTable/DataTable.tsx +0 -394
  441. package/src/atoms/composed/DataTable/TableCellWithTooltip.tsx +0 -41
  442. package/src/atoms/composed/DataTable/index.ts +0 -2
  443. package/src/atoms/composed/DateTimePicker/DateTimePicker.tsx +0 -611
  444. package/src/atoms/composed/DateTimePicker/index.ts +0 -2
  445. package/src/atoms/composed/DetailedCard/DetailedCard.tsx +0 -181
  446. package/src/atoms/composed/DetailedCard/index.ts +0 -2
  447. package/src/atoms/composed/EmptyState/EmptyState.tsx +0 -90
  448. package/src/atoms/composed/EmptyState/index.ts +0 -1
  449. package/src/atoms/composed/FileUpload/FileUpload.tsx +0 -477
  450. package/src/atoms/composed/FileUpload/index.ts +0 -2
  451. package/src/atoms/composed/FormField/FormField.tsx +0 -92
  452. package/src/atoms/composed/FormField/index.ts +0 -1
  453. package/src/atoms/composed/GlobalSearch/GlobalSearch.tsx +0 -37
  454. package/src/atoms/composed/GlobalSearch/index.ts +0 -1
  455. package/src/atoms/composed/IconBadge/IconBadge.tsx +0 -95
  456. package/src/atoms/composed/IconBadge/index.ts +0 -2
  457. package/src/atoms/composed/Modal/Modal.tsx +0 -223
  458. package/src/atoms/composed/Modal/index.ts +0 -2
  459. package/src/atoms/composed/PaletteSwitcher.tsx +0 -386
  460. package/src/atoms/composed/ProgressBar/ProgressBar.tsx +0 -116
  461. package/src/atoms/composed/ProgressBar/index.ts +0 -1
  462. package/src/atoms/composed/SalesPanel/SalesPanel.tsx +0 -116
  463. package/src/atoms/composed/SalesPanel/index.ts +0 -1
  464. package/src/atoms/composed/SalesPanel/mockSalesData.ts +0 -151
  465. package/src/atoms/composed/StatCard/StatCard.tsx +0 -219
  466. package/src/atoms/composed/StatCard/index.ts +0 -1
  467. package/src/atoms/composed/StyleGuide.tsx +0 -717
  468. package/src/atoms/composed/Toast/Toast.tsx +0 -219
  469. package/src/atoms/composed/Toast/index.ts +0 -1
  470. package/src/atoms/composed/Tooltip/Tooltip.tsx +0 -213
  471. package/src/atoms/composed/Tooltip/index.ts +0 -1
  472. package/src/atoms/composed/UserAvatar/UserAvatar.tsx +0 -139
  473. package/src/atoms/composed/UserAvatar/index.ts +0 -1
  474. package/src/atoms/composed/UserMenu/UserMenu.tsx +0 -16
  475. package/src/atoms/composed/UserMenu/index.ts +0 -1
  476. package/src/atoms/composed/index.ts +0 -30
  477. package/src/atoms/hooks/useApi.ts +0 -80
  478. package/src/atoms/hooks/useHealth.ts +0 -17
  479. package/src/atoms/index.ts +0 -13
  480. package/src/atoms/services/api/client.ts +0 -134
  481. package/src/atoms/services/auth-service.ts +0 -248
  482. package/src/atoms/services/health.ts +0 -15
  483. package/src/atoms/services/index.ts +0 -3
  484. package/src/atoms/shared/config/constants.ts +0 -17
  485. package/src/atoms/shared/config/dashboard-sizes.ts +0 -111
  486. package/src/atoms/shared/config/environment.ts +0 -10
  487. package/src/atoms/shared/index.ts +0 -4
  488. package/src/atoms/shared/styles/color-palettes.css +0 -566
  489. package/src/atoms/types/auth.ts +0 -62
  490. package/src/atoms/types/entity-config.ts +0 -127
  491. package/src/atoms/types/generated.ts +0 -1469
  492. package/src/atoms/types/index.ts +0 -6
  493. package/src/atoms/types/loading.ts +0 -28
  494. package/src/atoms/types/navigation.ts +0 -43
  495. package/src/atoms/ui/Badge.tsx +0 -30
  496. package/src/atoms/ui/ErrorBoundary.tsx +0 -59
  497. package/src/atoms/ui/Select.tsx +0 -53
  498. package/src/atoms/ui/Switch.tsx +0 -42
  499. package/src/atoms/ui/Tabs.tsx +0 -118
  500. package/src/atoms/ui/avatar.tsx +0 -48
  501. package/src/atoms/ui/button.tsx +0 -70
  502. package/src/atoms/ui/card.tsx +0 -76
  503. package/src/atoms/ui/dropdown-menu.tsx +0 -199
  504. package/src/atoms/ui/index.ts +0 -39
  505. package/src/atoms/ui/input.tsx +0 -23
  506. package/src/atoms/ui/label.tsx +0 -23
  507. package/src/atoms/ui/skeleton.tsx +0 -13
  508. package/src/atoms/ui/spinner.tsx +0 -49
  509. package/src/atoms/ui/table.tsx +0 -116
  510. package/src/atoms/utils/animations.ts +0 -135
  511. package/src/atoms/utils/icon-resolver.tsx +0 -54
  512. package/src/atoms/utils/metric-engine.ts +0 -236
  513. package/src/atoms/utils/tooltip-helpers.ts +0 -140
  514. package/src/atoms/utils/utils.ts +0 -11
  515. package/src/features/auth/components/LoginForm.tsx +0 -168
  516. package/src/features/auth/components/LogoutButton.tsx +0 -19
  517. package/src/features/auth/components/ProtectedRoute.tsx +0 -60
  518. package/src/features/auth/components/index.ts +0 -4
  519. package/src/features/auth/hooks/index.ts +0 -2
  520. package/src/features/auth/hooks/useAuth.tsx +0 -205
  521. package/src/features/auth/hooks/usePermissions.ts +0 -35
  522. package/src/features/auth/index.ts +0 -2
  523. package/src/features/index.ts +0 -2
  524. package/src/index.css +0 -704
  525. package/src/index.ts +0 -13
  526. package/src/main.tsx +0 -48
  527. package/src/molecules/.gitkeep +0 -0
  528. package/src/molecules/forms/FormGroup.tsx +0 -75
  529. package/src/molecules/forms/SearchInput.tsx +0 -259
  530. package/src/molecules/forms/index.ts +0 -4
  531. package/src/molecules/index.ts +0 -4
  532. package/src/molecules/layout/AppHeader/AppHeader.tsx +0 -42
  533. package/src/molecules/layout/AppHeader/index.ts +0 -1
  534. package/src/molecules/layout/AppLayout.tsx +0 -29
  535. package/src/molecules/layout/DashboardWithSidePanel/DashboardWithSidePanel.tsx +0 -42
  536. package/src/molecules/layout/DashboardWithSidePanel/index.ts +0 -1
  537. package/src/molecules/layout/NavigationContext.tsx +0 -63
  538. package/src/molecules/layout/PageTemplate.tsx +0 -87
  539. package/src/molecules/layout/SectionHeader/SectionHeader.tsx +0 -87
  540. package/src/molecules/layout/SectionHeader/index.ts +0 -1
  541. package/src/molecules/layout/ShowcaseSection.tsx +0 -57
  542. package/src/molecules/layout/Sidebar.tsx +0 -131
  543. package/src/molecules/layout/SidebarButton/SidebarButton.tsx +0 -121
  544. package/src/molecules/layout/SidebarButton/index.ts +0 -1
  545. package/src/molecules/layout/SidebarContext.tsx +0 -31
  546. package/src/molecules/layout/index.ts +0 -10
  547. package/src/molecules/navigation/NavMenu.tsx +0 -188
  548. package/src/molecules/navigation/Pagination.tsx +0 -172
  549. package/src/molecules/navigation/index.ts +0 -4
  550. package/src/organisms/entity/CategoryBreakdownPanel.tsx +0 -427
  551. package/src/organisms/entity/EntityListPanel.tsx +0 -339
  552. package/src/organisms/entity/MetricsOverviewPanel.tsx +0 -236
  553. package/src/organisms/entity/TrendAnalysisPanel.tsx +0 -337
  554. package/src/organisms/entity/index.ts +0 -4
  555. package/src/organisms/index.ts +0 -9
  556. package/src/organisms/showcase/ComponentShowcasePage.tsx +0 -2496
  557. package/src/organisms/showcase/index.ts +0 -1
  558. package/src/pages/AdminShowcase/AdminCRUDShowcase.tsx +0 -242
  559. package/src/pages/AdminShowcase/AdminDashboardShowcase.tsx +0 -173
  560. package/src/pages/AdminShowcase/AdminDetailShowcase.tsx +0 -385
  561. package/src/pages/AdminShowcase/SalesPerformanceDashboard.tsx +0 -158
  562. package/src/pages/AdminShowcase/index.tsx +0 -4
  563. package/src/pages/ComponentShowcase/BadgesShowcase.tsx +0 -188
  564. package/src/pages/ComponentShowcase/CardsShowcase.tsx +0 -392
  565. package/src/pages/ComponentShowcase/PalettesShowcase.tsx +0 -207
  566. package/src/pages/ComponentShowcase/StatesShowcase.tsx +0 -485
  567. package/src/pages/ComponentShowcase/TablesShowcase.tsx +0 -134
  568. package/src/pages/ComponentShowcase/TypographyShowcase.tsx +0 -255
  569. package/src/pages/ComponentShowcase/index.tsx +0 -188
  570. package/src/pages/EntityShowcase/EntityManagementShowcase.tsx +0 -137
  571. package/src/pages/EntityShowcase/EntityPerformanceShowcase.tsx +0 -117
  572. package/src/pages/EntityShowcase/index.ts +0 -2
  573. package/src/pages/EntityTemplateExample.tsx +0 -229
  574. package/src/pages/TestEntityTemplate.tsx +0 -40
  575. package/src/pages/index.ts +0 -3
  576. package/src/templates/AuthTemplate.tsx +0 -216
  577. package/src/templates/ComponentShowcaseTemplate.tsx +0 -173
  578. package/src/templates/DashboardTemplate.tsx +0 -232
  579. package/src/templates/DataTemplate.tsx +0 -319
  580. package/src/templates/admin/AdminCRUDTemplate.tsx +0 -630
  581. package/src/templates/admin/AdminDashboardTemplate.tsx +0 -351
  582. package/src/templates/admin/AdminDetailTemplate.tsx +0 -563
  583. package/src/templates/admin/index.ts +0 -29
  584. package/src/templates/entity/EntityManagementTemplate.tsx +0 -430
  585. package/src/templates/entity/EntityPerformanceDashboardTemplate.tsx +0 -277
  586. package/src/templates/entity/configs/financial-config.ts +0 -141
  587. package/src/templates/entity/configs/index.ts +0 -1
  588. package/src/templates/entity/index.ts +0 -3
  589. package/src/templates/factory.tsx +0 -176
  590. package/src/templates/financial/FinancialDashboardTemplate.tsx +0 -326
  591. package/src/templates/index.ts +0 -41
  592. package/src/vite-env.d.ts +0 -1
  593. /package/dist/atoms/{composed → components/data}/Chart/index.d.ts +0 -0
  594. /package/dist/atoms/{composed → components/data}/DataBadge/index.d.ts +0 -0
  595. /package/dist/atoms/{composed → components/data}/DataTable/TableCellWithTooltip.d.ts +0 -0
  596. /package/dist/atoms/{composed → components/data}/DataTable/index.d.ts +0 -0
  597. /package/dist/atoms/{composed → components/data}/DetailedCard/DetailedCard.d.ts +0 -0
  598. /package/dist/atoms/{composed → components/data}/DetailedCard/index.d.ts +0 -0
  599. /package/dist/atoms/{composed → components/data}/IconBadge/index.d.ts +0 -0
  600. /package/dist/atoms/{composed → components/data}/ProgressBar/ProgressBar.d.ts +0 -0
  601. /package/dist/atoms/{composed → components/data}/ProgressBar/index.d.ts +0 -0
  602. /package/dist/atoms/{composed → components/data}/StatCard/index.d.ts +0 -0
  603. /package/dist/atoms/{composed → components/domain}/SalesPanel/SalesPanel.d.ts +0 -0
  604. /package/dist/atoms/{composed → components/domain}/SalesPanel/index.d.ts +0 -0
  605. /package/dist/atoms/{composed → components/domain}/SalesPanel/mockSalesData.d.ts +0 -0
  606. /package/dist/atoms/{composed → components/feedback}/Alert/Alert.d.ts +0 -0
  607. /package/dist/atoms/{composed → components/feedback}/Alert/index.d.ts +0 -0
  608. /package/dist/atoms/{composed → components/feedback}/EmptyState/EmptyState.d.ts +0 -0
  609. /package/dist/atoms/{composed → components/feedback}/EmptyState/index.d.ts +0 -0
  610. /package/dist/atoms/{composed → components/feedback}/Toast/Toast.d.ts +0 -0
  611. /package/dist/atoms/{composed → components/feedback}/Toast/index.d.ts +0 -0
  612. /package/dist/atoms/{composed → components/forms}/DateTimePicker/DateTimePicker.d.ts +0 -0
  613. /package/dist/atoms/{composed → components/forms}/DateTimePicker/index.d.ts +0 -0
  614. /package/dist/atoms/{composed → components/forms}/FileUpload/FileUpload.d.ts +0 -0
  615. /package/dist/atoms/{composed → components/forms}/FileUpload/index.d.ts +0 -0
  616. /package/dist/atoms/{composed → components/forms}/FormField/FormField.d.ts +0 -0
  617. /package/dist/atoms/{composed → components/forms}/FormField/index.d.ts +0 -0
  618. /package/dist/atoms/{composed → components/layout}/Accordion/Accordion.d.ts +0 -0
  619. /package/dist/atoms/{composed → components/layout}/Accordion/index.d.ts +0 -0
  620. /package/dist/atoms/{composed → components/layout}/Breadcrumb/Breadcrumb.d.ts +0 -0
  621. /package/dist/atoms/{composed → components/layout}/Breadcrumb/index.d.ts +0 -0
  622. /package/dist/atoms/{composed → components/layout}/Modal/Modal.d.ts +0 -0
  623. /package/dist/atoms/{composed → components/layout}/Modal/index.d.ts +0 -0
  624. /package/dist/atoms/{composed → components/layout}/Tooltip/Tooltip.d.ts +0 -0
  625. /package/dist/atoms/{composed → components/navigation}/GlobalSearch/GlobalSearch.d.ts +0 -0
  626. /package/dist/atoms/{composed → components/navigation}/GlobalSearch/index.d.ts +0 -0
  627. /package/dist/atoms/{composed → components/theme}/ColorSwatch/ColorSwatch.d.ts +0 -0
  628. /package/dist/atoms/{composed → components/theme}/ColorSwatch/index.d.ts +0 -0
  629. /package/dist/atoms/{composed → components/theme}/DarkModeToggle.d.ts +0 -0
  630. /package/dist/atoms/{composed → components/theme}/PaletteSwitcher.d.ts +0 -0
  631. /package/dist/atoms/{composed → components/theme}/StyleGuide.d.ts +0 -0
  632. /package/dist/atoms/{composed → components/user}/UserAvatar/UserAvatar.d.ts +0 -0
  633. /package/dist/atoms/{composed → components/user}/UserAvatar/index.d.ts +0 -0
  634. /package/dist/atoms/{composed → components/user}/UserMenu/UserMenu.d.ts +0 -0
  635. /package/dist/atoms/{composed → components/user}/UserMenu/index.d.ts +0 -0
  636. /package/dist/atoms/{ui → primitives}/Badge.d.ts +0 -0
  637. /package/dist/atoms/{ui → primitives}/Select.d.ts +0 -0
  638. /package/dist/atoms/{ui → primitives}/Switch.d.ts +0 -0
  639. /package/dist/atoms/{ui → primitives}/Tabs.d.ts +0 -0
  640. /package/dist/atoms/{ui → primitives}/avatar.d.ts +0 -0
  641. /package/dist/atoms/{ui → primitives}/card.d.ts +0 -0
  642. /package/dist/atoms/{ui → primitives}/dropdown-menu.d.ts +0 -0
  643. /package/dist/atoms/{ui → primitives}/input.d.ts +0 -0
  644. /package/dist/atoms/{ui → primitives}/label.d.ts +0 -0
  645. /package/dist/atoms/{ui → primitives}/skeleton.d.ts +0 -0
  646. /package/dist/atoms/{ui → primitives}/spinner.d.ts +0 -0
  647. /package/dist/atoms/{ui → primitives}/table.d.ts +0 -0
@@ -0,0 +1,1057 @@
1
+ "use strict";
2
+ /**
3
+ * React Hook Generator
4
+ *
5
+ * Generates React hooks with TanStack Query integration for API endpoints
6
+ * with proper TypeScript typing and error/loading states.
7
+ *
8
+ * Part of FRO-3: React Hook Generator
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ReactHookGenerator = void 0;
12
+ exports.generateHooks = generateHooks;
13
+ const hook_config_1 = require("./hook-config");
14
+ const confidence_scorer_1 = require("./confidence-scorer");
15
+ const bulk_hook_generator_1 = require("./bulk-hook-generator");
16
+ const bulk_types_1 = require("./bulk-types");
17
+ class ReactHookGenerator {
18
+ constructor(options = {}) {
19
+ this.scoredNames = [];
20
+ this.resourceConfigs = new Map();
21
+ this.options = {
22
+ queryKeyPrefix: options.queryKeyPrefix || 'api',
23
+ includeInfiniteQueries: options.includeInfiniteQueries !== false,
24
+ includeOptimisticUpdates: options.includeOptimisticUpdates !== false,
25
+ includeMutationHelpers: options.includeMutationHelpers ?? true,
26
+ authenticationRequired: options.authenticationRequired ?? true,
27
+ errorHandling: options.errorHandling || 'throw',
28
+ configPath: options.configPath || './hooks.config.json',
29
+ enableConfidenceScoring: options.enableConfidenceScoring ?? true
30
+ };
31
+ this.configManager = new hook_config_1.HookConfigManager(this.options.configPath);
32
+ this.confidenceScorer = new confidence_scorer_1.ConfidenceScorer();
33
+ this.bulkHookGenerator = new bulk_hook_generator_1.BulkHookGenerator();
34
+ }
35
+ /**
36
+ * Detect resource operations from endpoints
37
+ */
38
+ detectResourceOperations(endpoints) {
39
+ const resourceMap = new Map();
40
+ endpoints.forEach(endpoint => {
41
+ const resourceName = this.extractResourceName(endpoint.path);
42
+ if (!resourceName)
43
+ return;
44
+ const config = resourceMap.get(resourceName) || this.createDefaultConfig(resourceName);
45
+ // Check if this is a bulk operation
46
+ const requestBody = endpoint.requestBody;
47
+ if ((0, bulk_types_1.isBulkOperation)(endpoint.path, endpoint.method, requestBody)) {
48
+ const bulkType = detectBulkOperationType(endpoint.path, endpoint.method);
49
+ switch (bulkType) {
50
+ case 'delete':
51
+ config.operations.bulkDelete = {
52
+ path: endpoint.path,
53
+ method: endpoint.method
54
+ };
55
+ break;
56
+ case 'update':
57
+ config.operations.bulkUpdate = {
58
+ path: endpoint.path,
59
+ method: endpoint.method
60
+ };
61
+ break;
62
+ case 'create':
63
+ config.operations.bulkCreate = {
64
+ path: endpoint.path,
65
+ method: endpoint.method
66
+ };
67
+ break;
68
+ case 'mixed':
69
+ default:
70
+ if (!config.operations.customBulk) {
71
+ config.operations.customBulk = [];
72
+ }
73
+ config.operations.customBulk.push({
74
+ name: this.getOperationName(endpoint),
75
+ path: endpoint.path,
76
+ method: endpoint.method,
77
+ operationType: bulkType || 'mixed'
78
+ });
79
+ break;
80
+ }
81
+ }
82
+ else {
83
+ // Standard CRUD operations
84
+ switch (endpoint.method.toLowerCase()) {
85
+ case 'get':
86
+ if (endpoint.path.includes('{')) {
87
+ // Single resource fetch
88
+ }
89
+ else {
90
+ config.operations.list = { path: endpoint.path, method: endpoint.method };
91
+ }
92
+ break;
93
+ case 'post':
94
+ config.operations.create = { path: endpoint.path, method: endpoint.method };
95
+ break;
96
+ case 'put':
97
+ case 'patch':
98
+ config.operations.update = { path: endpoint.path, method: endpoint.method };
99
+ break;
100
+ case 'delete':
101
+ config.operations.delete = { path: endpoint.path, method: endpoint.method };
102
+ break;
103
+ }
104
+ }
105
+ resourceMap.set(resourceName, config);
106
+ });
107
+ return resourceMap;
108
+ }
109
+ /**
110
+ * Extract resource name from path
111
+ */
112
+ extractResourceName(path) {
113
+ // Remove API version prefix
114
+ const cleanPath = path.replace(/^\/api\/v\d+\//, '/');
115
+ const segments = cleanPath.split('/').filter(Boolean);
116
+ // Find the first non-parameter segment
117
+ for (const segment of segments) {
118
+ if (!segment.startsWith('{')) {
119
+ return segment.replace(/-/g, '_');
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Create default API config for a resource
126
+ */
127
+ createDefaultConfig(resourceName) {
128
+ return {
129
+ baseURL: '',
130
+ resourceName,
131
+ operations: {}
132
+ };
133
+ }
134
+ async generate(parsedAPI) {
135
+ const endpoints = parsedAPI.endpoints;
136
+ // Load configuration
137
+ await this.configManager.load();
138
+ // Detect resource operations
139
+ this.resourceConfigs = this.detectResourceOperations(endpoints);
140
+ // Reset scored names for this generation
141
+ this.scoredNames = [];
142
+ const result = {
143
+ queries: this.generateQueryHooks(endpoints),
144
+ mutations: this.generateMutationHooks(endpoints),
145
+ keys: this.generateQueryKeys(endpoints),
146
+ types: this.generateHookTypes(endpoints),
147
+ index: this.generateIndexFile(),
148
+ report: undefined
149
+ };
150
+ // Generate confidence report if scoring is enabled
151
+ if (this.options.enableConfidenceScoring && this.scoredNames.length > 0) {
152
+ console.log(`Generated ${this.scoredNames.length} scored hook names`);
153
+ result.report = this.confidenceScorer.generateReport(this.scoredNames);
154
+ // Update statistics
155
+ const stats = {
156
+ totalGenerated: this.scoredNames.length,
157
+ highConfidence: this.scoredNames.filter(s => s.confidence === 'high').length,
158
+ mediumConfidence: this.scoredNames.filter(s => s.confidence === 'medium').length,
159
+ lowConfidence: this.scoredNames.filter(s => s.confidence === 'low').length,
160
+ humanReviewed: this.configManager.getReviewedNames().length
161
+ };
162
+ this.configManager.updateStatistics(stats);
163
+ // Save updated configuration
164
+ await this.configManager.save();
165
+ }
166
+ return result;
167
+ }
168
+ generateQueryHooks(endpoints) {
169
+ const hooks = [];
170
+ hooks.push(this.generateFileHeader('Query Hooks'));
171
+ hooks.push('');
172
+ hooks.push("import { useQuery, useInfiniteQuery, type UseQueryOptions, type UseInfiniteQueryOptions } from '@tanstack/react-query'");
173
+ hooks.push("import { apiClient } from '../client'");
174
+ hooks.push("import { queryKeys } from './keys'");
175
+ hooks.push("import * as Types from './types'");
176
+ hooks.push('');
177
+ // Filter GET endpoints for queries
178
+ const queryEndpoints = endpoints.filter(endpoint => endpoint.method === 'get');
179
+ // Track generated hook names to avoid duplicates
180
+ const generatedHooks = new Map();
181
+ for (const endpoint of queryEndpoints) {
182
+ let hookName = this.generateQueryHookName(endpoint);
183
+ // If we've already generated this hook, add suffix to differentiate
184
+ if (generatedHooks.has(hookName)) {
185
+ const existingEndpoint = generatedHooks.get(hookName);
186
+ // Determine which endpoint should get a suffix based on the path
187
+ const existingIsSimpler = existingEndpoint.path.split('/').filter(s => !s.startsWith('{')).length <
188
+ endpoint.path.split('/').filter(s => !s.startsWith('{')).length;
189
+ if (existingIsSimpler) {
190
+ // Current endpoint needs a suffix
191
+ const suffix = endpoint.path.includes('/{subcategory_id}') ? 'Single' : 'List';
192
+ hookName = `${hookName}${suffix}`;
193
+ }
194
+ else {
195
+ // Need to rename the existing hook that we already added
196
+ const existingSuffix = existingEndpoint.path.includes('/{subcategory_id}') ? 'Single' : 'List';
197
+ const existingHookName = hookName;
198
+ const newExistingHookName = `${existingHookName}${existingSuffix}`;
199
+ // Find and update the existing hook in our output
200
+ for (let i = hooks.length - 1; i >= 0; i--) {
201
+ if (hooks[i].includes(`function ${existingHookName}(`)) {
202
+ hooks[i] = hooks[i].replace(`function ${existingHookName}(`, `function ${newExistingHookName}(`);
203
+ // Also update the JSDoc if it references the hook name
204
+ if (i > 0 && hooks[i - 1].includes(`${existingHookName}`)) {
205
+ hooks[i - 1] = hooks[i - 1].replace(existingHookName, newExistingHookName);
206
+ }
207
+ break;
208
+ }
209
+ }
210
+ // Update our tracking map
211
+ generatedHooks.delete(existingHookName);
212
+ generatedHooks.set(newExistingHookName, existingEndpoint);
213
+ }
214
+ }
215
+ generatedHooks.set(hookName, endpoint);
216
+ const hook = this.generateQueryHook(endpoint, hookName);
217
+ hooks.push(hook);
218
+ hooks.push('');
219
+ // Generate infinite query version if applicable
220
+ if (this.options.includeInfiniteQueries && this.isListEndpoint(endpoint)) {
221
+ const infiniteHook = this.generateInfiniteQueryHook(endpoint, hookName);
222
+ hooks.push(infiniteHook);
223
+ hooks.push('');
224
+ }
225
+ }
226
+ return hooks.join('\n');
227
+ }
228
+ generateQueryHook(endpoint, hookName) {
229
+ const operationName = this.getOperationName(endpoint);
230
+ const hasParams = this.hasRequiredParams(endpoint);
231
+ const lines = [];
232
+ // Generate JSDoc
233
+ lines.push('/**');
234
+ if (endpoint.summary) {
235
+ lines.push(` * ${endpoint.summary}`);
236
+ }
237
+ if (endpoint.description) {
238
+ lines.push(` * ${endpoint.description}`);
239
+ }
240
+ lines.push(` * @param ${hasParams ? 'params' : 'options'} ${hasParams ? 'Request parameters' : 'Query options'}`);
241
+ lines.push(' */');
242
+ // Generate hook signature
243
+ const paramType = hasParams ? this.generateParamType(endpoint) : '';
244
+ const params = hasParams ? `params: ${paramType}, options?: UseQueryOptions<any, any, any>` : 'options?: UseQueryOptions<any, any, any>';
245
+ lines.push(`export function ${hookName}(${params}) {`);
246
+ // Generate hook body
247
+ // Extract the query key name from the hook name (remove 'use' prefix)
248
+ const queryKeyName = hookName.replace(/^use/, '');
249
+ const queryKeyNameCamelCase = queryKeyName.charAt(0).toLowerCase() + queryKeyName.slice(1);
250
+ const queryKeyCall = hasParams ?
251
+ `queryKeys.${queryKeyNameCamelCase}(params)` :
252
+ `queryKeys.${queryKeyNameCamelCase}()`;
253
+ const apiCall = hasParams ?
254
+ `() => apiClient.${this.camelCase(operationName)}(params)` :
255
+ `() => apiClient.${this.camelCase(operationName)}()`;
256
+ lines.push(' return useQuery({');
257
+ lines.push(` queryKey: ${queryKeyCall},`);
258
+ lines.push(` queryFn: ${apiCall},`);
259
+ // Note: Authentication is handled by the API client interceptors
260
+ // If you need to disable queries when not authenticated, use:
261
+ // enabled: !!user && (options?.enabled ?? true) in your component
262
+ lines.push(' ...options');
263
+ lines.push(' })');
264
+ lines.push('}');
265
+ return lines.join('\n');
266
+ }
267
+ generateInfiniteQueryHook(endpoint, baseHookName) {
268
+ const hookName = baseHookName.replace('use', 'useInfinite');
269
+ const operationName = this.getOperationName(endpoint);
270
+ const lines = [];
271
+ lines.push('/**');
272
+ lines.push(` * Infinite query version of ${baseHookName}`);
273
+ lines.push(' */');
274
+ const paramType = this.generateParamType(endpoint);
275
+ // Extract the query key name from the hook name (remove 'use' prefix)
276
+ const queryKeyName = baseHookName.replace(/^use/, '');
277
+ const queryKeyNameCamelCase = queryKeyName.charAt(0).toLowerCase() + queryKeyName.slice(1);
278
+ lines.push(`export function ${hookName}(params: ${paramType}, options?: UseInfiniteQueryOptions<any, any, any, any, any>) {`);
279
+ lines.push(' return useInfiniteQuery({');
280
+ lines.push(` queryKey: [...queryKeys.${queryKeyNameCamelCase}(), params],`);
281
+ lines.push(` queryFn: ({ pageParam = 1 }) => apiClient.${this.camelCase(operationName)}({ ...params, page: pageParam }),`);
282
+ lines.push(' getNextPageParam: (lastPage, allPages) => {');
283
+ lines.push(' // Implement pagination logic based on your API response structure');
284
+ lines.push(' return lastPage?.hasNextPage ? allPages.length + 1 : undefined');
285
+ lines.push(' },');
286
+ lines.push(' initialPageParam: 1,');
287
+ lines.push(' ...options');
288
+ lines.push(' })');
289
+ lines.push('}');
290
+ return lines.join('\n');
291
+ }
292
+ generateMutationHooks(endpoints) {
293
+ const hooks = [];
294
+ hooks.push(this.generateFileHeader('Mutation Hooks'));
295
+ hooks.push('');
296
+ hooks.push("import { useMutation, useQueryClient, type UseMutationOptions } from '@tanstack/react-query'");
297
+ hooks.push("import { apiClient } from '../client'");
298
+ hooks.push("import { queryKeys } from './keys'");
299
+ hooks.push("import * as Types from './types'");
300
+ hooks.push("import type { BulkOperationRequest, BulkOperationResponse, BulkOperationProgress, BulkMutationOptions } from '../bulk-types'");
301
+ hooks.push('');
302
+ // Filter non-GET endpoints for mutations
303
+ const mutationEndpoints = endpoints.filter(endpoint => endpoint.method !== 'get');
304
+ // Track generated hook names to avoid duplicates
305
+ const generatedHooks = new Map();
306
+ for (const endpoint of mutationEndpoints) {
307
+ // Check if this is a bulk operation
308
+ const requestBody = endpoint.requestBody;
309
+ const isBulk = (0, bulk_types_1.isBulkOperation)(endpoint.path, endpoint.method, requestBody);
310
+ let hookName = this.generateMutationHookName(endpoint);
311
+ // If we've already generated this hook, add suffix to differentiate
312
+ if (generatedHooks.has(hookName)) {
313
+ const existingEndpoint = generatedHooks.get(hookName);
314
+ // Add method suffix to differentiate
315
+ const methodSuffix = endpoint.method.charAt(0).toUpperCase() + endpoint.method.slice(1);
316
+ hookName = `${hookName}${methodSuffix}`;
317
+ }
318
+ generatedHooks.set(hookName, endpoint);
319
+ // Generate appropriate hook based on type
320
+ const hook = isBulk
321
+ ? this.bulkHookGenerator.generateBulkMutationHook(endpoint, hookName, this.getOperationName(endpoint))
322
+ : this.generateMutationHook(endpoint, hookName);
323
+ hooks.push(hook);
324
+ hooks.push('');
325
+ }
326
+ return hooks.join('\n');
327
+ }
328
+ generateMutationHook(endpoint, hookName) {
329
+ const operationName = this.getOperationName(endpoint);
330
+ const lines = [];
331
+ // Generate JSDoc
332
+ lines.push('/**');
333
+ if (endpoint.summary) {
334
+ lines.push(` * ${endpoint.summary}`);
335
+ }
336
+ if (endpoint.description) {
337
+ lines.push(` * ${endpoint.description}`);
338
+ }
339
+ lines.push(' */');
340
+ // Generate hook signature
341
+ const mutationType = this.generateMutationType(endpoint);
342
+ lines.push(`export function ${hookName}(options?: UseMutationOptions<any, any, ${mutationType}>) {`);
343
+ lines.push(' const queryClient = useQueryClient()');
344
+ lines.push('');
345
+ lines.push(' return useMutation({');
346
+ // Generate mutation function
347
+ const hasParams = this.hasRequiredParams(endpoint);
348
+ if (hasParams) {
349
+ lines.push(` mutationFn: ({ pathParams, ...data }) => apiClient.${this.camelCase(operationName)}(pathParams, data),`);
350
+ }
351
+ else {
352
+ lines.push(` mutationFn: (data) => apiClient.${this.camelCase(operationName)}(data),`);
353
+ }
354
+ // Generate optimistic updates and cache invalidation
355
+ if (this.options.includeOptimisticUpdates) {
356
+ lines.push(this.generateOptimisticUpdate(endpoint));
357
+ }
358
+ lines.push(this.generateCacheInvalidation(endpoint));
359
+ lines.push(' ...options');
360
+ lines.push(' })');
361
+ lines.push('}');
362
+ return lines.join('\n');
363
+ }
364
+ generateOptimisticUpdate(endpoint) {
365
+ const method = endpoint.method.toLowerCase();
366
+ const resource = endpoint.tags?.[0] || 'default';
367
+ const hasPathParams = endpoint.parameters.some(p => p.in === 'path');
368
+ switch (method) {
369
+ case 'post':
370
+ return ` onMutate: async (data: any) => {
371
+ // Cancel outgoing refetches
372
+ await queryClient.cancelQueries({ queryKey: queryKeys.${resource}() })
373
+
374
+ // Snapshot previous value
375
+ const previousData = queryClient.getQueryData(queryKeys.${resource}())
376
+
377
+ // Optimistically update cache
378
+ queryClient.setQueryData(queryKeys.${resource}(), (old: any) => {
379
+ if (Array.isArray(old)) {
380
+ return [...old, data]
381
+ }
382
+ return old
383
+ })
384
+
385
+ return { previousData }
386
+ },
387
+ onError: (err: any, data: any, context: any) => {
388
+ // Rollback on error
389
+ if (context?.previousData !== undefined) {
390
+ queryClient.setQueryData(queryKeys.${resource}(), context.previousData)
391
+ }
392
+ },`;
393
+ case 'put':
394
+ case 'patch':
395
+ if (hasPathParams) {
396
+ return ` onMutate: async (data: any) => {
397
+ await queryClient.cancelQueries({ queryKey: queryKeys.${resource}() })
398
+
399
+ const previousData = queryClient.getQueryData(queryKeys.${resource}())
400
+
401
+ // Update specific item in cache
402
+ queryClient.setQueryData(queryKeys.${resource}(), (old: any) => {
403
+ if (Array.isArray(old)) {
404
+ return old.map((item: any) =>
405
+ item.id === data.pathParams?.id || item.id === data.pathParams?.${resource.slice(0, -1)}_id
406
+ ? { ...item, ...data }
407
+ : item
408
+ )
409
+ }
410
+ return old
411
+ })
412
+
413
+ return { previousData }
414
+ },
415
+ onError: (err: any, data: any, context: any) => {
416
+ if (context?.previousData !== undefined) {
417
+ queryClient.setQueryData(queryKeys.${resource}(), context.previousData)
418
+ }
419
+ },`;
420
+ }
421
+ return ` onMutate: async (data: any) => {
422
+ await queryClient.cancelQueries({ queryKey: queryKeys.${resource}() })
423
+
424
+ const previousData = queryClient.getQueryData(queryKeys.${resource}())
425
+
426
+ // Update cache with new data
427
+ queryClient.setQueryData(queryKeys.${resource}(), data)
428
+
429
+ return { previousData }
430
+ },
431
+ onError: (err: any, data: any, context: any) => {
432
+ if (context?.previousData !== undefined) {
433
+ queryClient.setQueryData(queryKeys.${resource}(), context.previousData)
434
+ }
435
+ },`;
436
+ case 'delete':
437
+ return ` onMutate: async (data: any) => {
438
+ await queryClient.cancelQueries({ queryKey: queryKeys.${resource}() })
439
+
440
+ const previousData = queryClient.getQueryData(queryKeys.${resource}())
441
+
442
+ // Remove item from cache
443
+ queryClient.setQueryData(queryKeys.${resource}(), (old: any) => {
444
+ if (Array.isArray(old)) {
445
+ const idToDelete = data.pathParams?.id || data.pathParams?.${resource.slice(0, -1)}_id || data
446
+ return old.filter((item: any) => item.id !== idToDelete)
447
+ }
448
+ return old
449
+ })
450
+
451
+ return { previousData }
452
+ },
453
+ onError: (err: any, data: any, context: any) => {
454
+ if (context?.previousData !== undefined) {
455
+ queryClient.setQueryData(queryKeys.${resource}(), context.previousData)
456
+ }
457
+ },`;
458
+ default:
459
+ return '';
460
+ }
461
+ }
462
+ generateCacheInvalidation(endpoint) {
463
+ const relatedTags = this.getRelatedQueryTags(endpoint);
464
+ return ` onSettled: () => {
465
+ // Invalidate related queries
466
+ ${relatedTags.map(tag => `queryClient.invalidateQueries({ queryKey: queryKeys.${tag}() })`).join('\n ')}
467
+ },`;
468
+ }
469
+ generateQueryKeys(endpoints) {
470
+ const keys = [];
471
+ keys.push(this.generateFileHeader('Query Keys'));
472
+ keys.push('');
473
+ keys.push('/**');
474
+ keys.push(' * Centralized query key factory');
475
+ keys.push(' * Ensures consistent cache key generation across the application');
476
+ keys.push(' */');
477
+ keys.push('');
478
+ keys.push('export const queryKeys = {');
479
+ keys.push(` all: ['${this.options.queryKeyPrefix}'] as const,`);
480
+ keys.push('');
481
+ // Group endpoints by resource/tag
482
+ const groupedEndpoints = this.groupEndpointsByResource(endpoints);
483
+ for (const [resource, resourceEndpoints] of Object.entries(groupedEndpoints)) {
484
+ keys.push(` // ${resource} keys`);
485
+ keys.push(` ${resource}: () => [...queryKeys.all, '${resource}'] as const,`);
486
+ // Track generated key names to avoid duplicates
487
+ const generatedKeys = new Map();
488
+ for (const endpoint of resourceEndpoints) {
489
+ if (endpoint.method !== 'get')
490
+ continue;
491
+ const operationName = this.getOperationName(endpoint);
492
+ let keyName = this.camelCase(operationName.replace(/^get/, ''));
493
+ // If we've already generated this key, add suffix to differentiate
494
+ if (generatedKeys.has(keyName)) {
495
+ const existingEndpoint = generatedKeys.get(keyName);
496
+ // Determine which endpoint should get a suffix based on the path
497
+ // The one with a single resource gets the plain name, the one with sub-resources gets a suffix
498
+ const existingIsSimpler = existingEndpoint.path.split('/').filter(s => !s.startsWith('{')).length <
499
+ endpoint.path.split('/').filter(s => !s.startsWith('{')).length;
500
+ if (existingIsSimpler) {
501
+ // Current endpoint needs a suffix
502
+ const suffix = endpoint.path.includes('/{subcategory_id}') ? 'Single' : 'List';
503
+ keyName = `${keyName}${suffix}`;
504
+ }
505
+ else {
506
+ // Update the existing key with a suffix
507
+ const existingSuffix = existingEndpoint.path.includes('/{subcategory_id}') ? 'Single' : 'List';
508
+ const existingKeyName = keyName;
509
+ const newExistingKeyName = `${existingKeyName}${existingSuffix}`;
510
+ // Find and update the existing key in our output
511
+ for (let i = keys.length - 1; i >= 0; i--) {
512
+ if (keys[i].includes(`${existingKeyName}:`)) {
513
+ // Replace both the function name and the cache key string
514
+ keys[i] = keys[i]
515
+ .replace(`${existingKeyName}:`, `${newExistingKeyName}:`)
516
+ .replace(`'${existingKeyName}'`, `'${newExistingKeyName}'`);
517
+ break;
518
+ }
519
+ }
520
+ // Update our tracking map
521
+ generatedKeys.delete(existingKeyName);
522
+ generatedKeys.set(newExistingKeyName, existingEndpoint);
523
+ }
524
+ }
525
+ generatedKeys.set(keyName, endpoint);
526
+ if (this.hasRequiredParams(endpoint)) {
527
+ keys.push(` ${keyName}: (params: any) => [...queryKeys.${resource}(), '${keyName}', params] as const,`);
528
+ }
529
+ else {
530
+ keys.push(` ${keyName}: () => [...queryKeys.${resource}(), '${keyName}'] as const,`);
531
+ }
532
+ }
533
+ keys.push('');
534
+ }
535
+ keys.push('}');
536
+ return keys.join('\n');
537
+ }
538
+ generateHookTypes(endpoints) {
539
+ const types = [];
540
+ types.push(this.generateFileHeader('Hook Types'));
541
+ types.push('');
542
+ types.push('// Re-export bulk operation types for convenience');
543
+ types.push("export type { BulkOperationRequest, BulkOperationResponse, BulkOperationProgress, BulkMutationOptions } from '../bulk-types'");
544
+ types.push('');
545
+ // Track generated type names to avoid duplicates
546
+ const generatedTypes = new Set();
547
+ // Generate parameter and response types for hooks
548
+ for (const endpoint of endpoints) {
549
+ const operationName = this.getOperationName(endpoint);
550
+ if (this.hasRequiredParams(endpoint)) {
551
+ const typeName = `${this.capitalize(operationName)}Params`;
552
+ if (!generatedTypes.has(typeName)) {
553
+ generatedTypes.add(typeName);
554
+ const paramType = this.generateParamType(endpoint);
555
+ types.push(`export interface ${typeName} ${paramType}`);
556
+ types.push('');
557
+ }
558
+ }
559
+ if (endpoint.method !== 'get') {
560
+ const typeName = `${this.capitalize(operationName)}Data`;
561
+ if (!generatedTypes.has(typeName)) {
562
+ generatedTypes.add(typeName);
563
+ const mutationType = this.generateMutationType(endpoint);
564
+ types.push(`export interface ${typeName} ${mutationType}`);
565
+ types.push('');
566
+ }
567
+ }
568
+ }
569
+ return types.join('\n');
570
+ }
571
+ generateIndexFile() {
572
+ const exports = [];
573
+ exports.push(this.generateFileHeader('Generated React Hooks'));
574
+ exports.push('');
575
+ exports.push('// Query hooks');
576
+ exports.push("export * from './queries'");
577
+ exports.push('');
578
+ exports.push('// Mutation hooks');
579
+ exports.push("export * from './mutations'");
580
+ exports.push('');
581
+ exports.push('// Query keys');
582
+ exports.push("export { queryKeys } from './keys'");
583
+ exports.push('');
584
+ exports.push('// Hook types');
585
+ exports.push("export * from './types'");
586
+ return exports.join('\n');
587
+ }
588
+ generateFileHeader(title) {
589
+ return `/**
590
+ * ${title}
591
+ *
592
+ * Auto-generated React hooks from OpenAPI specification
593
+ * Do not edit manually - regenerate using the hook generator
594
+ */`;
595
+ }
596
+ generateQueryHookName(endpoint) {
597
+ const operationName = this.getOperationName(endpoint);
598
+ return `use${this.capitalize(operationName)}`;
599
+ }
600
+ generateMutationHookName(endpoint) {
601
+ const operationName = this.getOperationName(endpoint);
602
+ // Check if this is a bulk operation
603
+ const resourceName = this.extractResourceName(endpoint.path);
604
+ if (resourceName) {
605
+ const bulkHookName = this.bulkHookGenerator.generateBulkMutationHookName(endpoint, resourceName);
606
+ if (bulkHookName) {
607
+ return bulkHookName;
608
+ }
609
+ }
610
+ return `use${this.capitalize(operationName)}`;
611
+ }
612
+ getOperationName(endpoint) {
613
+ // Check if we have a manual override in config
614
+ if (endpoint.operationId) {
615
+ const override = this.configManager.getOverride(endpoint.operationId);
616
+ if (override) {
617
+ return override;
618
+ }
619
+ }
620
+ // Generate the name using existing logic
621
+ let operationName;
622
+ if (endpoint.operationId) {
623
+ operationName = this.cleanOperationId(endpoint.operationId, endpoint);
624
+ }
625
+ else {
626
+ operationName = this.generateCleanName(endpoint);
627
+ }
628
+ // Apply deduplication if enabled
629
+ const patterns = this.configManager.getPatterns();
630
+ if (patterns.deduplicateSegments) {
631
+ operationName = this.removeDuplicateSegments(operationName);
632
+ }
633
+ // Score the generated name if confidence scoring is enabled
634
+ if (this.options.enableConfidenceScoring && endpoint.operationId) {
635
+ const hookName = endpoint.method === 'get'
636
+ ? `use${this.capitalize(operationName)}`
637
+ : `use${this.capitalize(this.getMethodPrefix(endpoint.method))}${this.capitalize(operationName)}`;
638
+ const scored = this.confidenceScorer.scoreHookName(hookName, endpoint.operationId, endpoint.path, endpoint.method);
639
+ // Debug logging
640
+ if (scored.confidence === 'low') {
641
+ console.log(`Low confidence hook: ${hookName} (score: ${scored.score})`);
642
+ }
643
+ this.scoredNames.push(scored);
644
+ // If we have a suggestion with higher confidence, use it
645
+ if (scored.confidence === 'low' && scored.suggestions.length > 0) {
646
+ const suggestion = scored.suggestions[0];
647
+ // Extract just the operation name from the suggestion
648
+ const prefix = `use${this.capitalize(this.getMethodPrefix(endpoint.method))}`;
649
+ if (suggestion.startsWith(prefix)) {
650
+ operationName = this.camelCase(suggestion.substring(prefix.length));
651
+ }
652
+ else if (suggestion.startsWith('use')) {
653
+ operationName = this.camelCase(suggestion.substring(3));
654
+ }
655
+ }
656
+ }
657
+ return operationName;
658
+ }
659
+ cleanOperationId(operationId, endpoint) {
660
+ // Parse the operation ID into components
661
+ const parsed = this.parseOperationId(operationId, endpoint);
662
+ // Generate name based on parsed components
663
+ return this.generateNameFromParsed(parsed, endpoint);
664
+ }
665
+ /**
666
+ * Parse operation ID into structured components
667
+ */
668
+ parseOperationId(operationId, endpoint) {
669
+ // Clean common patterns
670
+ const cleaned = operationId
671
+ .replace(/_api_v\d+_/g, '_') // Remove API version
672
+ .replace(/_(get|post|put|patch|delete)$/i, ''); // Remove HTTP suffix
673
+ // Split into parts
674
+ const parts = cleaned.split('_').filter(Boolean);
675
+ // Extract prefix (action) if exists
676
+ const prefix = this.extractPrefix(parts, { ...endpoint, operationId });
677
+ // Extract resources from path
678
+ const resources = this.extractResourcesFromPath(endpoint.path);
679
+ // Check if it's a custom action
680
+ const segments = endpoint.path.split('/');
681
+ const lastSegment = segments[segments.length - 1];
682
+ const isCustomAction = !lastSegment.startsWith('{') && segments[segments.length - 2]?.startsWith('{');
683
+ return {
684
+ action: prefix?.action || '',
685
+ resource: resources.primary || '',
686
+ subResource: resources.sub?.[0] || '',
687
+ method: endpoint.method,
688
+ isCustomAction,
689
+ customActionName: isCustomAction ? lastSegment.replace(/-/g, '_') : undefined,
690
+ originalId: operationId,
691
+ prefix: prefix?.fullPrefix || '',
692
+ resources
693
+ };
694
+ }
695
+ /**
696
+ * Extract meaningful prefix from operation ID parts
697
+ */
698
+ extractPrefix(parts, endpoint) {
699
+ if (parts.length === 0)
700
+ return null;
701
+ // For extracting the prefix, use the original operation ID
702
+ const originalId = endpoint.operationId || '';
703
+ // Check if first part is a known action
704
+ const knownActions = [
705
+ 'login', 'logout', 'register', 'signup', 'signin',
706
+ 'assign', 'reassign', 'create', 'update', 'delete',
707
+ 'get', 'list', 'health', 'status', 'verify', 'validate'
708
+ ];
709
+ const firstPart = parts[0].toLowerCase();
710
+ if (knownActions.includes(firstPart)) {
711
+ // Special handling for compound names like "get_health_status" or "get_current_user_info"
712
+ if (firstPart === 'get' && originalId.startsWith('get_')) {
713
+ // Extract everything between get_ and _api_v
714
+ const match = originalId.match(/^get_(.+?)_api_v\d+/);
715
+ if (match) {
716
+ const compoundName = match[1];
717
+ if (compoundName === 'health_status' || compoundName === 'current_user_info') {
718
+ return {
719
+ action: firstPart,
720
+ fullPrefix: `${firstPart}_${compoundName}`
721
+ };
722
+ }
723
+ }
724
+ }
725
+ // Look for compound actions like "assign_roles" or "reassign_budget"
726
+ if (parts.length > 1 && ['assign', 'reassign'].includes(firstPart)) {
727
+ // Special case for reassign_transaction_budget
728
+ if (firstPart === 'reassign' && parts[1] === 'transaction' && parts[2] === 'budget') {
729
+ return {
730
+ action: 'reassign',
731
+ fullPrefix: 'reassign_budget'
732
+ };
733
+ }
734
+ return {
735
+ action: firstPart,
736
+ fullPrefix: `${parts[0]}_${parts[1]}`
737
+ };
738
+ }
739
+ return {
740
+ action: firstPart,
741
+ fullPrefix: parts[0]
742
+ };
743
+ }
744
+ return null;
745
+ }
746
+ /**
747
+ * Extract resources from API path
748
+ */
749
+ extractResourcesFromPath(path) {
750
+ // Remove API version prefix
751
+ const cleanPath = path.replace(/^\/api\/v\d+\//, '/');
752
+ const segments = cleanPath.split('/').filter(Boolean);
753
+ const resources = [];
754
+ let lastHasParam = false;
755
+ for (let i = 0; i < segments.length; i++) {
756
+ if (!segments[i].startsWith('{')) {
757
+ resources.push(segments[i].replace(/-/g, '_'));
758
+ }
759
+ else if (i === segments.length - 1) {
760
+ lastHasParam = true;
761
+ }
762
+ }
763
+ return {
764
+ primary: resources[0] || '',
765
+ sub: resources.slice(1),
766
+ lastHasParam
767
+ };
768
+ }
769
+ /**
770
+ * Generate clean hook name from parsed components
771
+ */
772
+ generateNameFromParsed(parsed, endpoint) {
773
+ // Special cases first
774
+ if (parsed.prefix === 'login')
775
+ return 'login';
776
+ if (parsed.prefix === 'logout')
777
+ return 'logout';
778
+ // Handle compound GET operations (e.g., get_health_status, get_current_user_info)
779
+ if (parsed.prefix && parsed.prefix.startsWith('get_') && parsed.prefix.includes('_')) {
780
+ const withoutGet = parsed.prefix.substring(4); // Remove "get_"
781
+ // Return the compound name without "get_" prefix
782
+ if (withoutGet === 'health_status' || withoutGet === 'current_user_info') {
783
+ return withoutGet;
784
+ }
785
+ }
786
+ // Handle custom actions with meaningful prefixes
787
+ if (parsed.prefix && this.isMeaningfulPrefix(parsed.prefix, parsed.resources)) {
788
+ return this.formatWithPrefix(parsed);
789
+ }
790
+ // Standard REST conventions
791
+ return this.formatStandardOperation(parsed, endpoint);
792
+ }
793
+ /**
794
+ * Check if prefix adds meaningful context
795
+ */
796
+ isMeaningfulPrefix(prefix, resources) {
797
+ const action = prefix.split('_')[0];
798
+ // Not meaningful if it just repeats the resource
799
+ if (prefix === resources.primary)
800
+ return false;
801
+ if (prefix === `get_${resources.primary}`)
802
+ return false;
803
+ if (prefix === `list_${resources.primary}`)
804
+ return false;
805
+ // Meaningful if it's a custom action
806
+ return ['assign', 'reassign', 'verify', 'validate', 'sync', 'refresh'].includes(action);
807
+ }
808
+ /**
809
+ * Format name with meaningful prefix
810
+ */
811
+ formatWithPrefix(parsed) {
812
+ const { prefix, resources, originalId, isCustomAction, customActionName } = parsed;
813
+ const prefixParts = prefix.split('_');
814
+ const action = prefixParts[0];
815
+ const subject = prefixParts.slice(1).join('_');
816
+ // Special handling for custom actions
817
+ if (isCustomAction && customActionName) {
818
+ // For reassign_budget on transactions
819
+ if (action === 'reassign' && subject === 'budget') {
820
+ return `reassign_${this.singularize(resources.primary)}_budget`;
821
+ }
822
+ }
823
+ // Handle deduplication - don't repeat if subject matches sub-resource
824
+ if (subject && resources.sub.length > 0) {
825
+ const subResource = resources.sub[0];
826
+ // If subject matches the sub-resource, don't duplicate
827
+ if (subject === subResource || subject === this.pluralize(subResource)) {
828
+ return `${action}_${this.singularize(resources.primary)}_${subResource}`;
829
+ }
830
+ }
831
+ // Standard format: action_resource_subresource
832
+ if (resources.sub.length > 0 && !isCustomAction) {
833
+ return `${action}_${this.singularize(resources.primary)}_${resources.sub[0]}`;
834
+ }
835
+ return `${action}_${this.singularize(resources.primary)}`;
836
+ }
837
+ /**
838
+ * Format standard REST operation
839
+ */
840
+ formatStandardOperation(parsed, endpoint) {
841
+ const { resources, method } = parsed;
842
+ const hasParams = endpoint.path.includes('{');
843
+ const isListOperation = method === 'get' && !hasParams;
844
+ // Handle sub-resources
845
+ if (resources.sub.length > 0) {
846
+ const primary = this.singularize(resources.primary);
847
+ const sub = resources.sub[0];
848
+ switch (method) {
849
+ case 'get':
850
+ return isListOperation ? `${primary}_${this.pluralize(sub)}` : `${primary}_${sub}`;
851
+ case 'post':
852
+ return `create_${primary}_${this.singularize(sub)}`;
853
+ case 'put':
854
+ case 'patch':
855
+ return `set_${primary}_${sub}`;
856
+ case 'delete':
857
+ return `remove_${primary}_${sub}`;
858
+ }
859
+ }
860
+ // Handle primary resource only
861
+ switch (method) {
862
+ case 'get':
863
+ return isListOperation ? this.pluralize(resources.primary) : this.singularize(resources.primary);
864
+ case 'post':
865
+ return `create_${this.singularize(resources.primary)}`;
866
+ case 'put':
867
+ case 'patch':
868
+ return `update_${this.singularize(resources.primary)}`;
869
+ case 'delete':
870
+ return `delete_${this.singularize(resources.primary)}`;
871
+ default:
872
+ return this.singularize(resources.primary);
873
+ }
874
+ }
875
+ generateCleanName(endpoint) {
876
+ const pathParts = endpoint.path
877
+ .split('/')
878
+ .filter(part => part && !part.startsWith('{'));
879
+ if (pathParts.length === 0)
880
+ return endpoint.method;
881
+ // Get the main resource (usually the last non-parameter segment)
882
+ const resource = pathParts[pathParts.length - 1];
883
+ const cleanResource = resource.replace(/-/g, '_');
884
+ // Check if it's a custom action (last segment after a parameter)
885
+ const segments = endpoint.path.split('/');
886
+ const lastSegment = segments[segments.length - 1];
887
+ const hasCustomAction = !lastSegment.startsWith('{') && segments[segments.length - 2]?.startsWith('{');
888
+ if (hasCustomAction) {
889
+ // Custom action: use resource + action
890
+ const mainResource = pathParts[pathParts.length - 2] || pathParts[pathParts.length - 1];
891
+ const action = lastSegment.replace(/-/g, '_');
892
+ return `${mainResource}_${action}`;
893
+ }
894
+ // For nested resources (e.g., /categories/{id}/subcategories),
895
+ // just use the last resource name
896
+ if (pathParts.length > 2 && segments.some(s => s.startsWith('{'))) {
897
+ // This is a nested resource, just use the last part
898
+ return cleanResource;
899
+ }
900
+ // Standard CRUD operations
901
+ switch (endpoint.method) {
902
+ case 'get':
903
+ // Check if it's a list or single resource
904
+ const isList = !endpoint.path.includes('{');
905
+ // Only pluralize if it's a list and not already plural
906
+ if (isList && !cleanResource.endsWith('s') && !cleanResource.endsWith('ies')) {
907
+ return this.pluralize(cleanResource);
908
+ }
909
+ return cleanResource;
910
+ case 'post':
911
+ return `create_${cleanResource}`;
912
+ case 'put':
913
+ case 'patch':
914
+ return `update_${cleanResource}`;
915
+ case 'delete':
916
+ return `delete_${cleanResource}`;
917
+ default:
918
+ return `${endpoint.method}_${cleanResource}`;
919
+ }
920
+ }
921
+ pluralize(word) {
922
+ // Don't pluralize if already plural
923
+ if (word.endsWith('s') && !word.endsWith('ss') && !word.endsWith('us') && !word.endsWith('is')) {
924
+ return word;
925
+ }
926
+ // Simple pluralization rules
927
+ if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].includes(word.slice(-2))) {
928
+ return word.slice(0, -1) + 'ies';
929
+ }
930
+ if (word.endsWith('ss') || word.endsWith('x') || word.endsWith('ch') || word.endsWith('sh')) {
931
+ return word + 'es';
932
+ }
933
+ if (word.endsWith('us')) {
934
+ return word.slice(0, -2) + 'i';
935
+ }
936
+ if (word.endsWith('is')) {
937
+ return word.slice(0, -2) + 'es';
938
+ }
939
+ return word + 's';
940
+ }
941
+ singularize(word) {
942
+ // Simple singularization rules
943
+ if (word.endsWith('ies')) {
944
+ return word.slice(0, -3) + 'y';
945
+ }
946
+ if (word.endsWith('ses') || word.endsWith('xes') || word.endsWith('ches') || word.endsWith('shes')) {
947
+ return word.slice(0, -2);
948
+ }
949
+ if (word.endsWith('s') && !word.endsWith('ss')) {
950
+ return word.slice(0, -1);
951
+ }
952
+ return word;
953
+ }
954
+ hasRequiredParams(endpoint) {
955
+ return endpoint.parameters.some(p => p.required) ||
956
+ endpoint.parameters.some(p => p.in === 'path');
957
+ }
958
+ generateParamType(endpoint) {
959
+ const pathParams = endpoint.parameters.filter(p => p.in === 'path');
960
+ const queryParams = endpoint.parameters.filter(p => p.in === 'query');
961
+ const properties = [];
962
+ pathParams.forEach(param => {
963
+ properties.push(`${param.name}: ${this.getParameterType(param)}`);
964
+ });
965
+ queryParams.forEach(param => {
966
+ const optional = param.required ? '' : '?';
967
+ properties.push(`${param.name}${optional}: ${this.getParameterType(param)}`);
968
+ });
969
+ return `{ ${properties.join('; ')} }`;
970
+ }
971
+ generateMutationType(endpoint) {
972
+ const hasPathParams = endpoint.parameters.some(p => p.in === 'path');
973
+ if (hasPathParams) {
974
+ const pathType = this.generateParamType(endpoint);
975
+ return `{ pathParams: ${pathType}; [key: string]: any }`;
976
+ }
977
+ return '{ [key: string]: any }';
978
+ }
979
+ getParameterType(param) {
980
+ switch (param.schema.type) {
981
+ case 'string': return 'string';
982
+ case 'number':
983
+ case 'integer': return 'number';
984
+ case 'boolean': return 'boolean';
985
+ default: return 'any';
986
+ }
987
+ }
988
+ isListEndpoint(endpoint) {
989
+ // Only GET requests can be list endpoints
990
+ if (endpoint.method.toLowerCase() !== 'get')
991
+ return false;
992
+ // If it has path parameters, it's likely fetching a single resource
993
+ if (endpoint.path.includes('{'))
994
+ return false;
995
+ // Check if the response is an array
996
+ if (endpoint.responses?.['200']?.schema?.type === 'array')
997
+ return true;
998
+ // Check if summary/description indicates it's a list
999
+ const description = `${endpoint.summary || ''} ${endpoint.description || ''}`.toLowerCase();
1000
+ return description.includes('list') ||
1001
+ description.includes('get all') ||
1002
+ description.includes('fetch all');
1003
+ }
1004
+ groupEndpointsByResource(endpoints) {
1005
+ const groups = {};
1006
+ for (const endpoint of endpoints) {
1007
+ const resource = endpoint.tags?.[0] || 'default';
1008
+ if (!groups[resource]) {
1009
+ groups[resource] = [];
1010
+ }
1011
+ groups[resource].push(endpoint);
1012
+ }
1013
+ return groups;
1014
+ }
1015
+ getRelatedQueryTags(endpoint) {
1016
+ const resource = endpoint.tags?.[0] || 'default';
1017
+ return [resource, 'all'];
1018
+ }
1019
+ camelCase(str) {
1020
+ return str.replace(/[-_](.)/g, (_, char) => char.toUpperCase())
1021
+ .replace(/^./, char => char.toLowerCase());
1022
+ }
1023
+ capitalize(str) {
1024
+ // Convert snake_case to PascalCase
1025
+ return str.split('_')
1026
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
1027
+ .join('');
1028
+ }
1029
+ getMethodPrefix(method) {
1030
+ const prefixes = {
1031
+ post: 'create',
1032
+ put: 'update',
1033
+ patch: 'update',
1034
+ delete: 'delete'
1035
+ };
1036
+ return prefixes[method.toLowerCase()] || method.toLowerCase();
1037
+ }
1038
+ removeDuplicateSegments(operationName) {
1039
+ const parts = operationName.split('_');
1040
+ const seen = new Set();
1041
+ const result = [];
1042
+ for (const part of parts) {
1043
+ const lower = part.toLowerCase();
1044
+ if (!seen.has(lower)) {
1045
+ seen.add(lower);
1046
+ result.push(part);
1047
+ }
1048
+ }
1049
+ return result.join('_');
1050
+ }
1051
+ }
1052
+ exports.ReactHookGenerator = ReactHookGenerator;
1053
+ // Factory function
1054
+ async function generateHooks(parsedAPI, options) {
1055
+ const generator = new ReactHookGenerator(options);
1056
+ return generator.generate(parsedAPI);
1057
+ }