@pattern-stack/frontend-patterns 0.1.3 → 0.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/CHANGELOG.md +69 -74
  2. package/README.md +17 -2
  3. package/cli/commands/generate-hooks.ts +15 -6
  4. package/cli/commands/scaffold.ts +1 -1
  5. package/cli/index.ts +1 -3
  6. package/cli/src/codegen/openapi/__tests__/naming-utils.test.js +367 -0
  7. package/cli/src/codegen/openapi/client-generator.js +90 -35
  8. package/cli/src/codegen/openapi/confidence-scorer.js +89 -200
  9. package/cli/src/codegen/openapi/hook-config.js +45 -63
  10. package/cli/src/codegen/openapi/hook-generator.js +253 -547
  11. package/cli/src/codegen/openapi/naming-constants.js +98 -0
  12. package/cli/src/codegen/openapi/naming-utils.js +149 -0
  13. package/cli/src/codegen/openapi/parser.js +9 -14
  14. package/cli/src/codegen/openapi/type-generator.js +6 -16
  15. package/dist/atoms/components/core/Avatar/Avatar.d.ts +6 -6
  16. package/dist/atoms/components/core/Avatar/Avatar.d.ts.map +1 -1
  17. package/dist/atoms/components/core/Avatar/index.d.ts +1 -1
  18. package/dist/atoms/components/core/Badge/Badge.d.ts +6 -6
  19. package/dist/atoms/components/core/Badge/Badge.d.ts.map +1 -1
  20. package/dist/atoms/components/core/Badge/index.d.ts +1 -1
  21. package/dist/atoms/components/core/Button/Button.d.ts +3 -3
  22. package/dist/atoms/components/core/Button/Button.d.ts.map +1 -1
  23. package/dist/atoms/components/core/Button/index.d.ts +2 -2
  24. package/dist/atoms/components/core/Card/Card.d.ts +2 -2
  25. package/dist/atoms/components/core/Card/Card.d.ts.map +1 -1
  26. package/dist/atoms/components/core/Card/index.d.ts +2 -2
  27. package/dist/atoms/components/core/Card/index.d.ts.map +1 -1
  28. package/dist/atoms/components/core/Checkbox/Checkbox.d.ts +4 -4
  29. package/dist/atoms/components/core/Checkbox/Checkbox.d.ts.map +1 -1
  30. package/dist/atoms/components/core/Checkbox/index.d.ts +2 -2
  31. package/dist/atoms/components/core/Input/Input.d.ts +2 -2
  32. package/dist/atoms/components/core/Input/Input.d.ts.map +1 -1
  33. package/dist/atoms/components/core/Input/index.d.ts +2 -2
  34. package/dist/atoms/components/core/Label/Label.d.ts +3 -4
  35. package/dist/atoms/components/core/Label/Label.d.ts.map +1 -1
  36. package/dist/atoms/components/core/Label/index.d.ts +2 -2
  37. package/dist/atoms/components/core/Select/Select.d.ts +5 -5
  38. package/dist/atoms/components/core/Select/Select.d.ts.map +1 -1
  39. package/dist/atoms/components/core/Select/index.d.ts +2 -2
  40. package/dist/atoms/components/core/Select/index.d.ts.map +1 -1
  41. package/dist/atoms/components/core/Spinner/Spinner.d.ts +4 -4
  42. package/dist/atoms/components/core/Spinner/Spinner.d.ts.map +1 -1
  43. package/dist/atoms/components/core/Spinner/index.d.ts +2 -2
  44. package/dist/atoms/components/core/Switch/Switch.d.ts +4 -4
  45. package/dist/atoms/components/core/Switch/Switch.d.ts.map +1 -1
  46. package/dist/atoms/components/core/Switch/index.d.ts +1 -1
  47. package/dist/atoms/components/core/index.d.ts +10 -10
  48. package/dist/atoms/components/core/index.d.ts.map +1 -1
  49. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts +2 -2
  50. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts.map +1 -1
  51. package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts +3 -3
  52. package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts.map +1 -1
  53. package/dist/atoms/components/data/ActivityFeed/index.d.ts +3 -3
  54. package/dist/atoms/components/data/ActivityFeed/index.d.ts.map +1 -1
  55. package/dist/atoms/components/data/ActivityFeed/types.d.ts +3 -3
  56. package/dist/atoms/components/data/ActivityFeed/types.d.ts.map +1 -1
  57. package/dist/atoms/components/data/ActivityFeed/utils.d.ts +2 -2
  58. package/dist/atoms/components/data/ActivityFeed/utils.d.ts.map +1 -1
  59. package/dist/atoms/components/data/Chart/Chart.d.ts +52 -5
  60. package/dist/atoms/components/data/Chart/Chart.d.ts.map +1 -1
  61. package/dist/atoms/components/data/Chart/index.d.ts +2 -2
  62. package/dist/atoms/components/data/Chart/index.d.ts.map +1 -1
  63. package/dist/atoms/components/data/DataBadge/DataBadge.d.ts +6 -6
  64. package/dist/atoms/components/data/DataBadge/DataBadge.d.ts.map +1 -1
  65. package/dist/atoms/components/data/DataBadge/index.d.ts +1 -1
  66. package/dist/atoms/components/data/DataTable/DataTable.d.ts +4 -4
  67. package/dist/atoms/components/data/DataTable/DataTable.d.ts.map +1 -1
  68. package/dist/atoms/components/data/DataTable/DataTable.types.d.ts +4 -4
  69. package/dist/atoms/components/data/DataTable/DataTable.types.d.ts.map +1 -1
  70. package/dist/atoms/components/data/DataTable/TableCellWithTooltip.d.ts +1 -1
  71. package/dist/atoms/components/data/DataTable/index.d.ts +2 -2
  72. package/dist/atoms/components/data/DetailedCard/DetailedCard.d.ts +4 -4
  73. package/dist/atoms/components/data/DetailedCard/DetailedCard.d.ts.map +1 -1
  74. package/dist/atoms/components/data/DetailedCard/index.d.ts +2 -2
  75. package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts +3 -3
  76. package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts.map +1 -1
  77. package/dist/atoms/components/data/EntityIcon/index.d.ts +1 -1
  78. package/dist/atoms/components/data/IconBadge/IconBadge.d.ts +6 -6
  79. package/dist/atoms/components/data/IconBadge/IconBadge.d.ts.map +1 -1
  80. package/dist/atoms/components/data/IconBadge/index.d.ts +2 -2
  81. package/dist/atoms/components/data/ListCard/ListCard.d.ts +9 -9
  82. package/dist/atoms/components/data/ListCard/ListCard.d.ts.map +1 -1
  83. package/dist/atoms/components/data/ListCard/index.d.ts +1 -1
  84. package/dist/atoms/components/data/ProgressBar/ProgressBar.d.ts +5 -5
  85. package/dist/atoms/components/data/ProgressBar/ProgressBar.d.ts.map +1 -1
  86. package/dist/atoms/components/data/ProgressBar/index.d.ts +1 -1
  87. package/dist/atoms/components/data/StatCard/StatCard.d.ts +3 -3
  88. package/dist/atoms/components/data/StatCard/StatCard.d.ts.map +1 -1
  89. package/dist/atoms/components/data/StatCard/index.d.ts +1 -1
  90. package/dist/atoms/components/data/Table/Table.d.ts +2 -2
  91. package/dist/atoms/components/data/Table/Table.d.ts.map +1 -1
  92. package/dist/atoms/components/data/Table/index.d.ts +1 -1
  93. package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts +2 -2
  94. package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts.map +1 -1
  95. package/dist/atoms/components/data/TruncatedText/index.d.ts +1 -1
  96. package/dist/atoms/components/data/index.d.ts +12 -12
  97. package/dist/atoms/components/data/index.d.ts.map +1 -1
  98. package/dist/atoms/components/domain/SalesPanel/SalesPanel.d.ts +15 -15
  99. package/dist/atoms/components/domain/SalesPanel/SalesPanel.d.ts.map +1 -1
  100. package/dist/atoms/components/domain/SalesPanel/index.d.ts +1 -1
  101. package/dist/atoms/components/domain/SalesPanel/index.d.ts.map +1 -1
  102. package/dist/atoms/components/domain/index.d.ts +1 -1
  103. package/dist/atoms/components/feedback/Alert/Alert.d.ts +4 -4
  104. package/dist/atoms/components/feedback/Alert/Alert.d.ts.map +1 -1
  105. package/dist/atoms/components/feedback/Alert/index.d.ts +1 -1
  106. package/dist/atoms/components/feedback/EmptyState/EmptyState.d.ts +3 -3
  107. package/dist/atoms/components/feedback/EmptyState/EmptyState.d.ts.map +1 -1
  108. package/dist/atoms/components/feedback/EmptyState/index.d.ts +1 -1
  109. package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts +1 -1
  110. package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
  111. package/dist/atoms/components/feedback/ErrorBoundary/index.d.ts +1 -1
  112. package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts +30 -4
  113. package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts.map +1 -1
  114. package/dist/atoms/components/feedback/Skeleton/index.d.ts +1 -1
  115. package/dist/atoms/components/feedback/Toast/Toast.d.ts +4 -4
  116. package/dist/atoms/components/feedback/Toast/Toast.d.ts.map +1 -1
  117. package/dist/atoms/components/feedback/Toast/index.d.ts +1 -1
  118. package/dist/atoms/components/feedback/Toast/index.d.ts.map +1 -1
  119. package/dist/atoms/components/feedback/index.d.ts +5 -5
  120. package/dist/atoms/components/feedback/index.d.ts.map +1 -1
  121. package/dist/atoms/components/forms/DateTimePicker/DateTimePicker.d.ts +6 -6
  122. package/dist/atoms/components/forms/DateTimePicker/DateTimePicker.d.ts.map +1 -1
  123. package/dist/atoms/components/forms/DateTimePicker/index.d.ts +2 -2
  124. package/dist/atoms/components/forms/FileUpload/FileUpload.d.ts +3 -3
  125. package/dist/atoms/components/forms/FileUpload/FileUpload.d.ts.map +1 -1
  126. package/dist/atoms/components/forms/FileUpload/index.d.ts +2 -2
  127. package/dist/atoms/components/forms/FormField/FormField.d.ts +2 -2
  128. package/dist/atoms/components/forms/FormField/FormField.d.ts.map +1 -1
  129. package/dist/atoms/components/forms/FormField/index.d.ts +1 -1
  130. package/dist/atoms/components/forms/index.d.ts +3 -3
  131. package/dist/atoms/components/index.d.ts +9 -9
  132. package/dist/atoms/components/layout/Accordion/Accordion.d.ts +3 -3
  133. package/dist/atoms/components/layout/Accordion/Accordion.d.ts.map +1 -1
  134. package/dist/atoms/components/layout/Accordion/index.d.ts +1 -1
  135. package/dist/atoms/components/layout/Accordion/index.d.ts.map +1 -1
  136. package/dist/atoms/components/layout/Breadcrumb/Breadcrumb.d.ts +2 -3
  137. package/dist/atoms/components/layout/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  138. package/dist/atoms/components/layout/Breadcrumb/index.d.ts +1 -1
  139. package/dist/atoms/components/layout/Breadcrumb/index.d.ts.map +1 -1
  140. package/dist/atoms/components/layout/Dialog/Dialog.d.ts +45 -0
  141. package/dist/atoms/components/layout/Dialog/Dialog.d.ts.map +1 -0
  142. package/dist/atoms/components/layout/Dialog/index.d.ts +2 -2
  143. package/dist/atoms/components/layout/Dialog/index.d.ts.map +1 -1
  144. package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts +9 -9
  145. package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts.map +1 -1
  146. package/dist/atoms/components/layout/Dropdown/index.d.ts +2 -2
  147. package/dist/atoms/components/layout/Dropdown/index.d.ts.map +1 -1
  148. package/dist/atoms/components/layout/Modal/Modal.d.ts +6 -6
  149. package/dist/atoms/components/layout/Modal/Modal.d.ts.map +1 -1
  150. package/dist/atoms/components/layout/Modal/index.d.ts +2 -2
  151. package/dist/atoms/components/layout/Tabs/Tabs.d.ts +46 -0
  152. package/dist/atoms/components/layout/Tabs/Tabs.d.ts.map +1 -0
  153. package/dist/atoms/components/layout/Tabs/index.d.ts +1 -1
  154. package/dist/atoms/components/layout/Tooltip/Tooltip.d.ts +6 -6
  155. package/dist/atoms/components/layout/Tooltip/Tooltip.d.ts.map +1 -1
  156. package/dist/atoms/components/layout/Tooltip/index.d.ts +1 -1
  157. package/dist/atoms/components/layout/index.d.ts +7 -7
  158. package/dist/atoms/components/layout/index.d.ts.map +1 -1
  159. package/dist/atoms/components/navigation/GlobalSearch/GlobalSearch.d.ts +2 -3
  160. package/dist/atoms/components/navigation/GlobalSearch/GlobalSearch.d.ts.map +1 -1
  161. package/dist/atoms/components/navigation/GlobalSearch/index.d.ts +1 -1
  162. package/dist/atoms/components/navigation/GlobalSearch/index.d.ts.map +1 -1
  163. package/dist/atoms/components/navigation/index.d.ts +1 -1
  164. package/dist/atoms/components/theme/ColorSwatch/ColorSwatch.d.ts +2 -2
  165. package/dist/atoms/components/theme/ColorSwatch/ColorSwatch.d.ts.map +1 -1
  166. package/dist/atoms/components/theme/ColorSwatch/index.d.ts +1 -1
  167. package/dist/atoms/components/theme/DarkModeToggle.d.ts.map +1 -1
  168. package/dist/atoms/components/theme/PaletteSwitcher.d.ts +1 -1
  169. package/dist/atoms/components/theme/PaletteSwitcher.d.ts.map +1 -1
  170. package/dist/atoms/components/theme/StyleGuide.d.ts +1 -1
  171. package/dist/atoms/components/theme/StyleGuide.d.ts.map +1 -1
  172. package/dist/atoms/components/theme/index.d.ts +4 -4
  173. package/dist/atoms/components/user/UserAvatar/UserAvatar.d.ts +2 -3
  174. package/dist/atoms/components/user/UserAvatar/UserAvatar.d.ts.map +1 -1
  175. package/dist/atoms/components/user/UserAvatar/index.d.ts +1 -1
  176. package/dist/atoms/components/user/UserAvatar/index.d.ts.map +1 -1
  177. package/dist/atoms/components/user/UserMenu/UserMenu.d.ts +2 -3
  178. package/dist/atoms/components/user/UserMenu/UserMenu.d.ts.map +1 -1
  179. package/dist/atoms/components/user/UserMenu/index.d.ts +1 -1
  180. package/dist/atoms/components/user/UserMenu/index.d.ts.map +1 -1
  181. package/dist/atoms/components/user/index.d.ts +2 -2
  182. package/dist/atoms/config/responsive.d.ts +16 -16
  183. package/dist/atoms/config/responsive.d.ts.map +1 -1
  184. package/dist/atoms/hooks/index.d.ts +4 -4
  185. package/dist/atoms/hooks/use-toast.d.ts +1 -1
  186. package/dist/atoms/hooks/use-toast.d.ts.map +1 -1
  187. package/dist/atoms/hooks/useApi.d.ts +2 -2
  188. package/dist/atoms/hooks/useApi.d.ts.map +1 -1
  189. package/dist/atoms/hooks/useResponsive.d.ts +1 -1
  190. package/dist/atoms/hooks/useResponsive.d.ts.map +1 -1
  191. package/dist/atoms/index.d.ts +6 -7
  192. package/dist/atoms/index.d.ts.map +1 -1
  193. package/dist/atoms/primitives/Badge.d.ts +6 -6
  194. package/dist/atoms/primitives/Badge.d.ts.map +1 -1
  195. package/dist/atoms/primitives/ErrorBoundary.d.ts +3 -3
  196. package/dist/atoms/primitives/ErrorBoundary.d.ts.map +1 -1
  197. package/dist/atoms/primitives/Select.d.ts +9 -7
  198. package/dist/atoms/primitives/Select.d.ts.map +1 -1
  199. package/dist/atoms/primitives/Switch.d.ts +4 -3
  200. package/dist/atoms/primitives/Switch.d.ts.map +1 -1
  201. package/dist/atoms/primitives/Tabs.d.ts +10 -10
  202. package/dist/atoms/primitives/Tabs.d.ts.map +1 -1
  203. package/dist/atoms/primitives/avatar.d.ts.map +1 -1
  204. package/dist/atoms/primitives/button.d.ts +2 -5
  205. package/dist/atoms/primitives/button.d.ts.map +1 -1
  206. package/dist/atoms/primitives/button.variants.d.ts +7 -0
  207. package/dist/atoms/primitives/button.variants.d.ts.map +1 -0
  208. package/dist/atoms/primitives/card.d.ts +3 -2
  209. package/dist/atoms/primitives/card.d.ts.map +1 -1
  210. package/dist/atoms/primitives/checkbox.d.ts +3 -3
  211. package/dist/atoms/primitives/checkbox.d.ts.map +1 -1
  212. package/dist/atoms/primitives/dialog.d.ts +4 -4
  213. package/dist/atoms/primitives/dialog.d.ts.map +1 -1
  214. package/dist/atoms/primitives/dropdown-menu.d.ts.map +1 -1
  215. package/dist/atoms/primitives/index.d.ts +16 -16
  216. package/dist/atoms/primitives/index.d.ts.map +1 -1
  217. package/dist/atoms/primitives/input.d.ts.map +1 -1
  218. package/dist/atoms/primitives/label.d.ts +4 -3
  219. package/dist/atoms/primitives/label.d.ts.map +1 -1
  220. package/dist/atoms/primitives/skeleton.d.ts.map +1 -1
  221. package/dist/atoms/primitives/spinner.d.ts +5 -5
  222. package/dist/atoms/primitives/spinner.d.ts.map +1 -1
  223. package/dist/atoms/primitives/table.d.ts.map +1 -1
  224. package/dist/atoms/services/api/client.d.ts +11 -2
  225. package/dist/atoms/services/api/client.d.ts.map +1 -1
  226. package/dist/atoms/services/auth-service.d.ts +1 -1
  227. package/dist/atoms/services/auth-service.d.ts.map +1 -1
  228. package/dist/atoms/services/health.d.ts +2 -2
  229. package/dist/atoms/services/index.d.ts +3 -3
  230. package/dist/atoms/shared/config/dashboard-sizes.d.ts +17 -17
  231. package/dist/atoms/shared/config/dashboard-sizes.d.ts.map +1 -1
  232. package/dist/atoms/shared/config/environment.d.ts.map +1 -1
  233. package/dist/atoms/shared/index.d.ts +4 -4
  234. package/dist/atoms/shared/index.d.ts.map +1 -1
  235. package/dist/atoms/types/auth.d.ts +11 -1
  236. package/dist/atoms/types/auth.d.ts.map +1 -1
  237. package/dist/atoms/types/entity-config.d.ts +9 -9
  238. package/dist/atoms/types/entity-config.d.ts.map +1 -1
  239. package/dist/atoms/types/generated.d.ts.map +1 -1
  240. package/dist/atoms/types/index.d.ts +6 -6
  241. package/dist/atoms/types/loading.d.ts +1 -1
  242. package/dist/atoms/types/navigation.d.ts +1 -1
  243. package/dist/atoms/types/navigation.d.ts.map +1 -1
  244. package/dist/atoms/types/ui-config.d.ts +8 -8
  245. package/dist/atoms/types/ui-config.d.ts.map +1 -1
  246. package/dist/atoms/utils/animations.d.ts +7 -7
  247. package/dist/atoms/utils/animations.d.ts.map +1 -1
  248. package/dist/atoms/utils/color-manager.d.ts +1 -1
  249. package/dist/atoms/utils/debounce.d.ts +1 -1
  250. package/dist/atoms/utils/debounce.d.ts.map +1 -1
  251. package/dist/atoms/utils/field-detection.d.ts +2 -2
  252. package/dist/atoms/utils/field-detection.d.ts.map +1 -1
  253. package/dist/atoms/utils/icon-map.d.ts +68 -0
  254. package/dist/atoms/utils/icon-map.d.ts.map +1 -0
  255. package/dist/atoms/utils/icon-resolver.d.ts +7 -67
  256. package/dist/atoms/utils/icon-resolver.d.ts.map +1 -1
  257. package/dist/atoms/utils/index.d.ts +4 -4
  258. package/dist/atoms/utils/metric-engine.d.ts +2 -10
  259. package/dist/atoms/utils/metric-engine.d.ts.map +1 -1
  260. package/dist/atoms/utils/tooltip-helpers.d.ts +1 -1
  261. package/dist/atoms/utils/tooltip-helpers.d.ts.map +1 -1
  262. package/dist/atoms/utils/ui-mapping.d.ts +6 -4
  263. package/dist/atoms/utils/ui-mapping.d.ts.map +1 -1
  264. package/dist/atoms/utils/utils.d.ts +7 -6
  265. package/dist/atoms/utils/utils.d.ts.map +1 -1
  266. package/dist/codegen/openapi/bulk-types.d.ts +4 -4
  267. package/dist/codegen/openapi/bulk-types.d.ts.map +1 -1
  268. package/dist/features/auth/components/LoginForm.d.ts.map +1 -1
  269. package/dist/features/auth/components/LogoutButton.d.ts.map +1 -1
  270. package/dist/features/auth/components/ProtectedRoute.d.ts +2 -2
  271. package/dist/features/auth/components/ProtectedRoute.d.ts.map +1 -1
  272. package/dist/features/auth/components/index.d.ts +3 -3
  273. package/dist/features/auth/hooks/auth-context.d.ts +3 -0
  274. package/dist/features/auth/hooks/auth-context.d.ts.map +1 -0
  275. package/dist/features/auth/hooks/index.d.ts +4 -3
  276. package/dist/features/auth/hooks/index.d.ts.map +1 -1
  277. package/dist/features/auth/hooks/use-auth.d.ts +3 -0
  278. package/dist/features/auth/hooks/use-auth.d.ts.map +1 -0
  279. package/dist/features/auth/hooks/useAuth.d.ts +3 -4
  280. package/dist/features/auth/hooks/useAuth.d.ts.map +1 -1
  281. package/dist/features/auth/hooks/useAuthContext.d.ts +1 -1
  282. package/dist/features/auth/hooks/useAuthContext.d.ts.map +1 -1
  283. package/dist/features/auth/hooks/usePermissions.d.ts +3 -3
  284. package/dist/features/auth/index.d.ts +3 -3
  285. package/dist/features/auth/providers/MockAuthProvider.d.ts +3 -4
  286. package/dist/features/auth/providers/MockAuthProvider.d.ts.map +1 -1
  287. package/dist/features/auth/providers/index.d.ts +2 -1
  288. package/dist/features/auth/providers/index.d.ts.map +1 -1
  289. package/dist/features/auth/providers/mock-auth-context.d.ts +3 -0
  290. package/dist/features/auth/providers/mock-auth-context.d.ts.map +1 -0
  291. package/dist/features/auth/providers/use-mock-auth.d.ts +3 -0
  292. package/dist/features/auth/providers/use-mock-auth.d.ts.map +1 -0
  293. package/dist/features/auth/services/mock-auth-service.d.ts +3 -3
  294. package/dist/features/auth/services/mock-auth-service.d.ts.map +1 -1
  295. package/dist/features/index.d.ts +1 -1
  296. package/dist/frontend-patterns.css +713 -576
  297. package/dist/index.d.ts +17 -17
  298. package/dist/index.d.ts.map +1 -1
  299. package/dist/index.es.js +21400 -21788
  300. package/dist/index.es.js.map +1 -1
  301. package/dist/index.js +21404 -21792
  302. package/dist/index.js.map +1 -1
  303. package/dist/molecules/forms/FormGroup.d.ts +2 -2
  304. package/dist/molecules/forms/FormGroup.d.ts.map +1 -1
  305. package/dist/molecules/forms/SearchInput.d.ts +1 -1
  306. package/dist/molecules/forms/SearchInput.d.ts.map +1 -1
  307. package/dist/molecules/forms/index.d.ts +2 -2
  308. package/dist/molecules/forms/index.d.ts.map +1 -1
  309. package/dist/molecules/index.d.ts +3 -3
  310. package/dist/molecules/layout/AppHeader/AppHeader.d.ts +1 -1
  311. package/dist/molecules/layout/AppHeader/AppHeader.d.ts.map +1 -1
  312. package/dist/molecules/layout/AppHeader/index.d.ts +1 -1
  313. package/dist/molecules/layout/BulkSelectionBar.d.ts +2 -2
  314. package/dist/molecules/layout/BulkSelectionBar.d.ts.map +1 -1
  315. package/dist/molecules/layout/DashboardWithSidePanel/DashboardWithSidePanel.d.ts +1 -1
  316. package/dist/molecules/layout/DashboardWithSidePanel/index.d.ts +1 -1
  317. package/dist/molecules/layout/NavigationContext.d.ts +3 -9
  318. package/dist/molecules/layout/NavigationContext.d.ts.map +1 -1
  319. package/dist/molecules/layout/PageTemplate.d.ts +1 -1
  320. package/dist/molecules/layout/PageTemplate.d.ts.map +1 -1
  321. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts +4 -4
  322. package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts.map +1 -1
  323. package/dist/molecules/layout/SectionHeader/index.d.ts +1 -1
  324. package/dist/molecules/layout/ShowcaseSection.d.ts +4 -4
  325. package/dist/molecules/layout/ShowcaseSection.d.ts.map +1 -1
  326. package/dist/molecules/layout/Sidebar.d.ts.map +1 -1
  327. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts +1 -1
  328. package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts.map +1 -1
  329. package/dist/molecules/layout/SidebarButton/index.d.ts +1 -1
  330. package/dist/molecules/layout/SidebarContext.d.ts +1 -8
  331. package/dist/molecules/layout/SidebarContext.d.ts.map +1 -1
  332. package/dist/molecules/layout/index.d.ts +14 -11
  333. package/dist/molecules/layout/index.d.ts.map +1 -1
  334. package/dist/molecules/layout/navigation-context.d.ts +9 -0
  335. package/dist/molecules/layout/navigation-context.d.ts.map +1 -0
  336. package/dist/molecules/layout/sidebar-context.d.ts +7 -0
  337. package/dist/molecules/layout/sidebar-context.d.ts.map +1 -0
  338. package/dist/molecules/layout/use-navigation.d.ts +2 -0
  339. package/dist/molecules/layout/use-navigation.d.ts.map +1 -0
  340. package/dist/molecules/layout/use-sidebar.d.ts +2 -0
  341. package/dist/molecules/layout/use-sidebar.d.ts.map +1 -0
  342. package/dist/molecules/navigation/NavMenu.d.ts +2 -2
  343. package/dist/molecules/navigation/NavMenu.d.ts.map +1 -1
  344. package/dist/molecules/navigation/Pagination.d.ts +2 -2
  345. package/dist/molecules/navigation/index.d.ts +2 -2
  346. package/dist/organisms/index.d.ts +1 -1
  347. package/dist/organisms/showcase/ComponentShowcasePage.d.ts +1 -1
  348. package/dist/organisms/showcase/ComponentShowcasePage.d.ts.map +1 -1
  349. package/dist/templates/AuthTemplate.d.ts +4 -4
  350. package/dist/templates/AuthTemplate.d.ts.map +1 -1
  351. package/dist/templates/ComponentShowcaseTemplate.d.ts +7 -7
  352. package/dist/templates/ComponentShowcaseTemplate.d.ts.map +1 -1
  353. package/dist/templates/DashboardTemplate.d.ts +3 -3
  354. package/dist/templates/DashboardTemplate.d.ts.map +1 -1
  355. package/dist/templates/DataTemplate.d.ts +3 -3
  356. package/dist/templates/DataTemplate.d.ts.map +1 -1
  357. package/dist/templates/EnhancedDataTemplate.d.ts +11 -11
  358. package/dist/templates/EnhancedDataTemplate.d.ts.map +1 -1
  359. package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts +2 -2
  360. package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts.map +1 -1
  361. package/dist/templates/EnhancedDataTemplate.hooks.d.ts +4 -4
  362. package/dist/templates/EnhancedDataTemplate.hooks.d.ts.map +1 -1
  363. package/dist/templates/admin/AdminCRUDTemplate.d.ts +4 -4
  364. package/dist/templates/admin/AdminCRUDTemplate.d.ts.map +1 -1
  365. package/dist/templates/admin/AdminDashboardTemplate.d.ts +7 -7
  366. package/dist/templates/admin/AdminDashboardTemplate.d.ts.map +1 -1
  367. package/dist/templates/admin/AdminDetailTemplate.d.ts +4 -4
  368. package/dist/templates/admin/AdminDetailTemplate.d.ts.map +1 -1
  369. package/dist/templates/admin/index.d.ts +3 -3
  370. package/dist/templates/admin/index.d.ts.map +1 -1
  371. package/dist/templates/api/APIDataTemplate.d.ts +14 -9
  372. package/dist/templates/api/APIDataTemplate.d.ts.map +1 -1
  373. package/dist/templates/api/create-api-data-template.d.ts +4 -0
  374. package/dist/templates/api/create-api-data-template.d.ts.map +1 -0
  375. package/dist/templates/api/index.d.ts +3 -2
  376. package/dist/templates/api/index.d.ts.map +1 -1
  377. package/dist/templates/factory.d.ts +3 -3
  378. package/dist/templates/factory.d.ts.map +1 -1
  379. package/dist/templates/index.d.ts +8 -8
  380. package/dist/templates/index.d.ts.map +1 -1
  381. package/package.json +10 -7
  382. package/LICENSE +0 -19
  383. package/cli/cli/commands/generate-hooks.js +0 -291
  384. package/cli/cli/commands/init.js +0 -25
  385. package/cli/cli/commands/scaffold.js +0 -201
  386. package/cli/cli/index.js +0 -113
  387. package/cli/commands/generate-hooks.js +0 -291
  388. package/cli/commands/init.js +0 -25
  389. package/cli/commands/scaffold.js +0 -201
  390. package/cli/index.js +0 -6665
  391. package/cli/src/codegen/openapi/bulk-hook-generator.js +0 -252
  392. package/cli/src/codegen/openapi/bulk-types.js +0 -89
  393. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts +0 -38
  394. package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts.map +0 -1
  395. package/dist/codegen/index.d.ts +0 -7
  396. package/dist/codegen/index.d.ts.map +0 -1
  397. package/dist/codegen/openapi/bulk-hook-generator.d.ts +0 -40
  398. package/dist/codegen/openapi/bulk-hook-generator.d.ts.map +0 -1
  399. package/dist/codegen/openapi/client-generator.d.ts +0 -52
  400. package/dist/codegen/openapi/client-generator.d.ts.map +0 -1
  401. package/dist/codegen/openapi/confidence-scorer.d.ts +0 -30
  402. package/dist/codegen/openapi/confidence-scorer.d.ts.map +0 -1
  403. package/dist/codegen/openapi/hook-config.d.ts +0 -50
  404. package/dist/codegen/openapi/hook-config.d.ts.map +0 -1
  405. package/dist/codegen/openapi/hook-generator.d.ts +0 -108
  406. package/dist/codegen/openapi/hook-generator.d.ts.map +0 -1
  407. package/dist/codegen/openapi/index.d.ts +0 -27
  408. package/dist/codegen/openapi/index.d.ts.map +0 -1
  409. package/dist/codegen/openapi/parser.d.ts +0 -107
  410. package/dist/codegen/openapi/parser.d.ts.map +0 -1
  411. package/dist/codegen/openapi/type-generator.d.ts +0 -53
  412. package/dist/codegen/openapi/type-generator.d.ts.map +0 -1
  413. package/dist/generated/client/client.d.ts +0 -23
  414. package/dist/generated/client/client.d.ts.map +0 -1
  415. package/dist/generated/client/config.d.ts +0 -10
  416. package/dist/generated/client/config.d.ts.map +0 -1
  417. package/dist/generated/client/index.d.ts +0 -12
  418. package/dist/generated/client/index.d.ts.map +0 -1
  419. package/dist/generated/client/methods.d.ts +0 -591
  420. package/dist/generated/client/methods.d.ts.map +0 -1
  421. package/dist/generated/client/types.d.ts +0 -37
  422. package/dist/generated/client/types.d.ts.map +0 -1
  423. package/dist/generated/example.d.ts +0 -8
  424. package/dist/generated/example.d.ts.map +0 -1
  425. package/dist/generated/hooks/index.d.ts +0 -11
  426. package/dist/generated/hooks/index.d.ts.map +0 -1
  427. package/dist/generated/hooks/keys.d.ts +0 -59
  428. package/dist/generated/hooks/keys.d.ts.map +0 -1
  429. package/dist/generated/hooks/mutations.d.ts +0 -551
  430. package/dist/generated/hooks/mutations.d.ts.map +0 -1
  431. package/dist/generated/hooks/queries.d.ts +0 -426
  432. package/dist/generated/hooks/queries.d.ts.map +0 -1
  433. package/dist/generated/hooks/types.d.ts +0 -318
  434. package/dist/generated/hooks/types.d.ts.map +0 -1
  435. package/dist/generated/index.d.ts +0 -13
  436. package/dist/generated/index.d.ts.map +0 -1
  437. package/dist/generated/types/endpoints.d.ts +0 -1364
  438. package/dist/generated/types/endpoints.d.ts.map +0 -1
  439. package/dist/generated/types/index.d.ts +0 -11
  440. package/dist/generated/types/index.d.ts.map +0 -1
  441. package/dist/generated/types/parameters.d.ts +0 -8
  442. package/dist/generated/types/parameters.d.ts.map +0 -1
  443. package/dist/generated/types/responses.d.ts +0 -8
  444. package/dist/generated/types/responses.d.ts.map +0 -1
  445. package/dist/generated/types/schemas.d.ts +0 -652
  446. package/dist/generated/types/schemas.d.ts.map +0 -1
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * API Client Generator
4
3
  *
@@ -7,10 +6,11 @@
7
6
  *
8
7
  * Part of FRO-12: API Client Generator
9
8
  */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.APIClientGenerator = void 0;
12
- exports.generateAPIClient = generateAPIClient;
13
- class APIClientGenerator {
9
+ import { singularize, pluralize, isPlural } from './naming-utils.js';
10
+ import { AUTH_ACTIONS, HEALTH_ENDPOINTS, USER_PROFILE_ENDPOINTS, SINGLETON_RESOURCES, COLLECTION_ACTIONS } from './naming-constants.js';
11
+
12
+ export class APIClientGenerator {
13
+ options;
14
14
  constructor(options = {}) {
15
15
  this.options = {
16
16
  clientType: options.clientType || 'axios',
@@ -42,7 +42,7 @@ class APIClientGenerator {
42
42
  generateAxiosClient() {
43
43
  return `/**
44
44
  * Axios API Client
45
- *
45
+ *
46
46
  * Auto-generated API client with interceptors and error handling
47
47
  */
48
48
 
@@ -149,7 +149,7 @@ export class APIClient {
149
149
  generateFetchClient() {
150
150
  return `/**
151
151
  * Fetch API Client
152
- *
152
+ *
153
153
  * Auto-generated API client using native fetch with error handling
154
154
  */
155
155
 
@@ -169,7 +169,7 @@ export class APIClient {
169
169
  ): Promise<T> {
170
170
  try {
171
171
  const fullUrl = this.buildUrl(url, options.params)
172
-
172
+
173
173
  const fetchOptions: RequestInit = {
174
174
  method,
175
175
  headers: {
@@ -208,7 +208,7 @@ export class APIClient {
208
208
 
209
209
  private buildUrl(path: string, params?: Record<string, any>): string {
210
210
  const url = new URL(path, this.config.baseUrl)
211
-
211
+
212
212
  if (params) {
213
213
  Object.entries(params).forEach(([key, value]) => {
214
214
  if (value !== undefined && value !== null) {
@@ -328,7 +328,7 @@ export class APIClient {
328
328
  private shouldRetry(error: AxiosError): boolean {
329
329
  const retryCount = (error.config as any)?._retryCount || 0
330
330
  const maxRetries = this.config.retries || ${this.options.retries}
331
-
331
+
332
332
  return (
333
333
  retryCount < maxRetries &&
334
334
  (!error.response || error.response.status >= 500) &&
@@ -338,11 +338,11 @@ export class APIClient {
338
338
 
339
339
  private async retryRequest(config: any): Promise<any> {
340
340
  config._retryCount = (config._retryCount || 0) + 1
341
-
341
+
342
342
  // Exponential backoff
343
343
  const delay = Math.pow(2, config._retryCount) * 1000
344
344
  await new Promise(resolve => setTimeout(resolve, delay))
345
-
345
+
346
346
  return this.client.request(config)
347
347
  }`;
348
348
  }
@@ -503,7 +503,7 @@ export class APIClient {
503
503
  const authTypes = this.generateAuthTypes();
504
504
  return `/**
505
505
  * API Client Types
506
- *
506
+ *
507
507
  * Configuration and utility types for the generated API client
508
508
  */
509
509
 
@@ -559,7 +559,7 @@ export interface APIError {
559
559
  generateConfiguration() {
560
560
  return `/**
561
561
  * API Client Configuration
562
- *
562
+ *
563
563
  * Default configuration and factory functions
564
564
  */
565
565
 
@@ -583,7 +583,7 @@ export const defaultConfig: Partial<APIClientConfig> = {
583
583
  generateIndexFile() {
584
584
  return `/**
585
585
  * Generated API Client
586
- *
586
+ *
587
587
  * Auto-generated from OpenAPI specification
588
588
  */
589
589
 
@@ -591,34 +591,90 @@ export * from './client'
591
591
  export * from './methods'
592
592
  export * from './types'
593
593
  export * from './config'
594
- export { createAPIClient, defaultConfig } from './config'
595
-
596
- // Singleton instance for convenient usage
597
- export const apiClient = createAPIClient({
598
- baseUrl: process.env.VITE_API_URL || '${this.options.baseUrl || 'http://localhost:8080'}',
599
- timeout: ${this.options.timeout},
600
- defaultHeaders: {
601
- 'Content-Type': 'application/json'
602
- }
603
- })`;
594
+ export { createAPIClient, defaultConfig } from './config'`;
604
595
  }
605
596
  generateFileHeader(title) {
606
597
  return `/**
607
598
  * ${title}
608
- *
599
+ *
609
600
  * Auto-generated from OpenAPI specification
610
601
  * Do not edit manually
611
602
  */`;
612
603
  }
613
604
  getMethodName(endpoint) {
614
- if (endpoint.operationId) {
615
- return this.camelCase(endpoint.operationId);
605
+ // Use semantic naming instead of raw operationId
606
+ return this.generateSemanticMethodName(endpoint);
607
+ }
608
+ generateSemanticMethodName(endpoint) {
609
+ // Extract resource from path
610
+ const pathSegments = endpoint.path.split('/').filter(s => s && !s.startsWith('{') && !['api', 'v1', 'v2'].includes(s));
611
+ const urlSegments = endpoint.path.split('/');
612
+ const hasPathParam = endpoint.path.includes('{');
613
+ const lastSegment = pathSegments[pathSegments.length - 1]?.replace(/-/g, '_') || 'resource';
614
+ const prevSegment = pathSegments[pathSegments.length - 2]?.replace(/-/g, '_');
615
+
616
+ // Auth endpoints - use action name directly
617
+ if (AUTH_ACTIONS.includes(lastSegment.toLowerCase())) {
618
+ return this.camelCase(lastSegment);
619
+ }
620
+
621
+ // Health/status singletons
622
+ if (HEALTH_ENDPOINTS.includes(lastSegment.toLowerCase())) {
623
+ return this.camelCase(lastSegment);
624
+ }
625
+
626
+ // User profile singletons
627
+ if (USER_PROFILE_ENDPOINTS.includes(lastSegment.toLowerCase())) {
628
+ return this.camelCase(`get_current_user`);
629
+ }
630
+
631
+ // Metadata endpoints - include parent resource to avoid collision
632
+ if (lastSegment.toLowerCase() === 'metadata' && prevSegment) {
633
+ return hasPathParam
634
+ ? this.camelCase(`get_${singularize(prevSegment)}_metadata`)
635
+ : this.camelCase(`get_${prevSegment}_metadata`);
636
+ }
637
+
638
+ // Collection actions (e.g., /activities/search)
639
+ if (COLLECTION_ACTIONS.includes(lastSegment.toLowerCase()) && prevSegment) {
640
+ return this.camelCase(`${lastSegment}_${prevSegment}`);
641
+ }
642
+
643
+ // Determine resource name - for nested paths, include context
644
+ let resource = lastSegment;
645
+ if (pathSegments.length > 2 && hasPathParam) {
646
+ // e.g., /accounts/{id}/stages/allowed → get_account_allowed_stages
647
+ const parentResource = pathSegments.find((s, i) => {
648
+ const nextSeg = urlSegments[urlSegments.findIndex(u => u === s) + 1];
649
+ return nextSeg?.startsWith('{');
650
+ });
651
+ if (parentResource && parentResource !== lastSegment) {
652
+ resource = `${singularize(parentResource)}_${lastSegment}`;
653
+ }
654
+ }
655
+
656
+ // Generate name based on HTTP method
657
+ switch (endpoint.method) {
658
+ case 'get':
659
+ return hasPathParam
660
+ ? this.camelCase(`get_${singularize(resource)}`)
661
+ : this.camelCase(`list_${resource}`);
662
+ case 'post':
663
+ // Check for custom actions like /accounts/{id}/stage
664
+ const lastUrl = urlSegments[urlSegments.length - 1];
665
+ const prevUrl = urlSegments[urlSegments.length - 2];
666
+ if (!lastUrl.startsWith('{') && prevUrl?.startsWith('{')) {
667
+ return this.camelCase(`${lastUrl}_${singularize(prevSegment || resource)}`);
668
+ }
669
+ return this.camelCase(`create_${singularize(resource)}`);
670
+ case 'put':
671
+ case 'patch':
672
+ return this.camelCase(`update_${singularize(resource)}`);
673
+ case 'delete':
674
+ return this.camelCase(`delete_${singularize(resource)}`);
675
+ default:
676
+ return this.camelCase(`${endpoint.method}_${resource}`);
616
677
  }
617
- const pathParts = endpoint.path
618
- .split('/')
619
- .filter(part => part && !part.startsWith('{'))
620
- .map(part => this.capitalize(part));
621
- return this.camelCase(`${endpoint.method}_${pathParts.join('_')}`);
622
678
  }
623
679
  generatePathWithParams(endpoint) {
624
680
  return endpoint.path.replace(/{([^}]+)}/g, '${$1}');
@@ -664,9 +720,8 @@ export const apiClient = createAPIClient({
664
720
  return str.charAt(0).toUpperCase() + str.slice(1);
665
721
  }
666
722
  }
667
- exports.APIClientGenerator = APIClientGenerator;
668
723
  // Factory function
669
- function generateAPIClient(parsedAPI, options) {
724
+ export function generateAPIClient(parsedAPI, options) {
670
725
  const generator = new APIClientGenerator(options);
671
726
  return generator.generate(parsedAPI);
672
727
  }
@@ -1,204 +1,93 @@
1
- "use strict";
2
1
  /**
3
- * Confidence scoring for generated hook names
4
- * Helps identify names that may need human review
2
+ * Confidence Scorer (Stub)
3
+ *
4
+ * Scores generated hook names for quality/confidence.
5
+ * This is a minimal stub that returns high confidence for all names.
5
6
  */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ConfidenceScorer = void 0;
8
- class ConfidenceScorer {
9
- /**
10
- * Score a generated hook name based on various quality indicators
11
- */
12
- scoreHookName(generatedName, originalOperationId, path, method) {
13
- const issues = [];
14
- const suggestions = [];
15
- let score = 100;
16
- // Check for camelCase issues
17
- if (!this.isProperCamelCase(generatedName)) {
18
- score -= 20;
19
- issues.push('Improper camelCase formatting');
20
- }
21
- // Check for consecutive uppercase letters (like "useAssignRolesusersUserRoles")
22
- if (this.hasConsecutiveUppercase(generatedName)) {
23
- score -= 30;
24
- issues.push('Consecutive uppercase letters suggest concatenation issues');
25
- suggestions.push(this.suggestFixForConsecutiveUppercase(generatedName));
26
- }
27
- // Check for overly long names
28
- const nameLength = generatedName.length;
29
- if (nameLength > 30) {
30
- score -= 20;
31
- issues.push(`Name is too long (${nameLength} chars)`);
32
- }
33
- // Check for repeated words
34
- if (this.hasRepeatedWords(generatedName)) {
35
- score -= 25;
36
- issues.push('Contains repeated word segments');
37
- }
38
- // Check if it matches common patterns
39
- if (this.matchesCommonPattern(generatedName, method)) {
40
- score += 10;
41
- score = Math.min(score, 100); // Cap at 100
42
- }
43
- // Check for word boundaries issues
44
- if (this.hasWordBoundaryIssues(generatedName)) {
45
- score -= 15;
46
- issues.push('Potential word boundary issues');
47
- }
48
- // Determine confidence level
49
- let confidence;
50
- if (score >= 80) {
51
- confidence = 'high';
52
- }
53
- else if (score >= 60) {
54
- confidence = 'medium';
55
- }
56
- else {
57
- confidence = 'low';
58
- }
59
- return {
60
- name: generatedName,
61
- confidence,
62
- score,
63
- issues,
64
- suggestions: suggestions.filter(s => s !== generatedName)
65
- };
66
- }
67
- isProperCamelCase(name) {
68
- // Should start with lowercase 'use'
69
- if (!name.startsWith('use'))
70
- return false;
71
- // Check for proper camelCase pattern
72
- const afterUse = name.substring(3);
73
- return /^[A-Z][a-zA-Z0-9]*$/.test(afterUse);
74
- }
75
- hasConsecutiveUppercase(name) {
76
- // Look for patterns like "RolesUsers" which suggest poor concatenation
77
- return /[A-Z]{2,}[a-z]/.test(name) || /[a-z][A-Z]{2,}/.test(name);
78
- }
79
- hasRepeatedWords(name) {
80
- // Convert camelCase to words
81
- const words = this.camelCaseToWords(name).map(w => w.toLowerCase());
82
- const uniqueWords = new Set(words);
83
- // If we have significantly fewer unique words, there's repetition
84
- return words.length > uniqueWords.size + 1; // Allow one repeat
85
- }
86
- matchesCommonPattern(name, method) {
87
- const commonPatterns = {
88
- get: /^use[A-Z][a-zA-Z]+$/,
89
- post: /^useCreate[A-Z][a-zA-Z]+$/,
90
- put: /^useUpdate[A-Z][a-zA-Z]+$/,
91
- patch: /^useUpdate[A-Z][a-zA-Z]+$/,
92
- delete: /^useDelete[A-Z][a-zA-Z]+$/
93
- };
94
- const pattern = commonPatterns[method];
95
- return pattern ? pattern.test(name) : false;
96
- }
97
- hasWordBoundaryIssues(name) {
98
- // Look for lowercase letters followed by uppercase without proper boundaries
99
- // Exclude common patterns like "useCreate", "useUpdate", etc.
100
- const afterUse = name.substring(3);
101
- const knownPrefixes = ['Create', 'Update', 'Delete', 'Get', 'List', 'Fetch', 'Assign', 'Reassign'];
102
- for (const prefix of knownPrefixes) {
103
- if (afterUse.startsWith(prefix)) {
104
- const remaining = afterUse.substring(prefix.length);
105
- // Check for patterns like "Rolesusers" or "Budgettransactions"
106
- if (/[a-z]{2,}[A-Z]/.test(remaining)) {
107
- return true;
108
- }
109
- }
110
- }
111
- // Check for lowercase word running into uppercase (3+ lowercase chars)
112
- if (/[a-z]{3,}[A-Z]/.test(afterUse)) {
113
- return true;
114
- }
115
- // Check for patterns like "RolesusersUser" where we have clear word concatenation
116
- if (/[A-Z][a-z]+[a-z][A-Z]/.test(afterUse)) {
117
- return true;
118
- }
119
- return false;
120
- }
121
- suggestFixForConsecutiveUppercase(name) {
122
- // Try to fix patterns like "useAssignRolesusersUserRoles"
123
- // This is a simple heuristic - the review process will catch if it's wrong
124
- let suggestion = name;
125
- // Specific fixes for known patterns
126
- const knownFixes = {
127
- 'useAssignRolesusersUserRoles': 'useAssignUserRoles',
128
- 'useReassignBudgettransactionsReassignBudget': 'useReassignTransactionBudget',
129
- 'useCategorySubcategories': 'useCreateSubcategory'
130
- };
131
- if (knownFixes[name]) {
132
- return knownFixes[name];
133
- }
134
- // Fix patterns where lowercase runs into uppercase (like "Rolesusers")
135
- suggestion = suggestion.replace(/([a-z]{2,})([A-Z])/g, (match, p1, p2) => {
136
- // If the lowercase part is a known word ending, add proper boundary
137
- if (p1.endsWith('roles') || p1.endsWith('users') || p1.endsWith('budget')) {
138
- return p1 + p2;
139
- }
140
- return match;
141
- });
142
- // Try to extract the main action and resource
143
- const parts = this.camelCaseToWords(suggestion);
144
- if (parts.length > 4) {
145
- // Likely too many parts, try to simplify
146
- // Keep: use + action + main resource
147
- const action = parts[1]; // After 'use'
148
- const resources = parts.slice(2);
149
- // Find the most significant resource (usually the last one that's not a duplicate)
150
- const uniqueResources = [...new Set(resources.map(r => r.toLowerCase()))];
151
- if (uniqueResources.length === 1) {
152
- return `use${action}${resources[resources.length - 1]}`;
153
- }
154
- }
155
- return suggestion;
156
- }
157
- camelCaseToWords(str) {
158
- // Split camelCase into words
159
- return str
160
- .replace(/([a-z])([A-Z])/g, '$1 $2')
161
- .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
162
- .split(' ')
163
- .filter(w => w.length > 0);
164
- }
165
- /**
166
- * Generate a confidence report for review
167
- */
168
- generateReport(scoredNames) {
169
- const byConfidence = {
170
- high: scoredNames.filter(s => s.confidence === 'high'),
171
- medium: scoredNames.filter(s => s.confidence === 'medium'),
172
- low: scoredNames.filter(s => s.confidence === 'low')
173
- };
174
- let report = '# Hook Name Generation Report\n\n';
175
- report += `Generated ${scoredNames.length} hooks\n\n`;
176
- report += `- High confidence: ${byConfidence.high.length}\n`;
177
- report += `- Medium confidence: ${byConfidence.medium.length}\n`;
178
- report += `- Low confidence: ${byConfidence.low.length}\n\n`;
179
- if (byConfidence.low.length > 0) {
180
- report += '## Low Confidence Names (Review Recommended)\n\n';
181
- for (const scored of byConfidence.low) {
182
- report += `### ${scored.name}\n`;
183
- report += `- Score: ${scored.score}/100\n`;
184
- report += `- Issues: ${scored.issues.join(', ')}\n`;
185
- if (scored.suggestions.length > 0) {
186
- report += `- Suggestions: ${scored.suggestions.join(', ')}\n`;
187
- }
188
- report += '\n';
189
- }
190
- }
191
- if (byConfidence.medium.length > 0) {
192
- report += '## Medium Confidence Names (Optional Review)\n\n';
193
- for (const scored of byConfidence.medium) {
194
- report += `- ${scored.name} (${scored.score}/100)\n`;
195
- if (scored.issues.length > 0) {
196
- report += ` Issues: ${scored.issues.join(', ')}\n`;
197
- }
198
- }
199
- report += '\n';
200
- }
201
- return report;
7
+
8
+ export class ConfidenceScorer {
9
+ constructor() {
10
+ this.scoringRules = [];
11
+ }
12
+
13
+ /**
14
+ * Score a generated hook name
15
+ * @returns {{ hookName: string, operationId: string, confidence: string, score: number, suggestions: string[] }}
16
+ */
17
+ scoreHookName(hookName, operationId, path, method) {
18
+ // Simple heuristic: shorter names are better
19
+ const lengthScore = Math.max(0, 100 - hookName.length);
20
+
21
+ // Check for common anti-patterns
22
+ const hasApiV1 = hookName.toLowerCase().includes('apiv1');
23
+ const hasUnderscore = hookName.includes('_');
24
+ const isVeryLong = hookName.length > 40;
25
+
26
+ let score = lengthScore;
27
+ if (hasApiV1) score -= 30;
28
+ if (hasUnderscore) score -= 10;
29
+ if (isVeryLong) score -= 20;
30
+
31
+ // Normalize to 0-100
32
+ score = Math.max(0, Math.min(100, score));
33
+
34
+ // Determine confidence level
35
+ let confidence;
36
+ if (score >= 70) confidence = 'high';
37
+ else if (score >= 40) confidence = 'medium';
38
+ else confidence = 'low';
39
+
40
+ return {
41
+ hookName,
42
+ operationId,
43
+ path,
44
+ method,
45
+ confidence,
46
+ score,
47
+ suggestions: confidence === 'low' ? [this.suggestBetterName(path, method)] : []
48
+ };
49
+ }
50
+
51
+ suggestBetterName(path, method) {
52
+ // Extract resource from path
53
+ const segments = path.split('/').filter(s => s && !s.startsWith('{') && !['api', 'v1'].includes(s));
54
+ const resource = segments[segments.length - 1]?.replace(/-/g, '') || 'resource';
55
+
56
+ // Capitalize first letter
57
+ const capitalizedResource = resource.charAt(0).toUpperCase() + resource.slice(1);
58
+
59
+ switch (method) {
60
+ case 'get':
61
+ return path.includes('{') ? `useGet${capitalizedResource}` : `use${capitalizedResource}`;
62
+ case 'post':
63
+ return `useCreate${capitalizedResource}`;
64
+ case 'put':
65
+ case 'patch':
66
+ return `useUpdate${capitalizedResource}`;
67
+ case 'delete':
68
+ return `useDelete${capitalizedResource}`;
69
+ default:
70
+ return `use${capitalizedResource}`;
202
71
  }
72
+ }
73
+
74
+ generateReport(scoredNames) {
75
+ const high = scoredNames.filter(s => s.confidence === 'high').length;
76
+ const medium = scoredNames.filter(s => s.confidence === 'medium').length;
77
+ const low = scoredNames.filter(s => s.confidence === 'low').length;
78
+
79
+ return `
80
+ Hook Name Quality Report
81
+ ========================
82
+ Total hooks: ${scoredNames.length}
83
+ High confidence: ${high} (${Math.round(high/scoredNames.length*100)}%)
84
+ Medium confidence: ${medium} (${Math.round(medium/scoredNames.length*100)}%)
85
+ Low confidence: ${low} (${Math.round(low/scoredNames.length*100)}%)
86
+
87
+ ${low > 0 ? 'Low confidence hooks that may need review:\n' +
88
+ scoredNames.filter(s => s.confidence === 'low')
89
+ .map(s => ` - ${s.hookName} → suggested: ${s.suggestions[0]}`)
90
+ .join('\n') : 'All hooks have acceptable names!'}
91
+ `;
92
+ }
203
93
  }
204
- exports.ConfidenceScorer = ConfidenceScorer;
@@ -1,66 +1,48 @@
1
- "use strict";
2
1
  /**
3
- * Hook generation configuration system
4
- * Stores learned patterns and manual overrides for hook name generation
2
+ * Hook Configuration Manager (Stub)
3
+ *
4
+ * Provides name overrides and pattern configuration for hook generation.
5
+ * This is a minimal stub to unblock the hook generator.
5
6
  */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.HookConfigManager = void 0;
8
- const fs_1 = require("fs");
9
- const path_1 = require("path");
10
- const DEFAULT_CONFIG = {
11
- version: '1.0.0',
12
- nameOverrides: {},
13
- reviewedNames: [],
14
- patterns: {
15
- removeDoubleWords: true,
16
- smartCasing: true,
17
- deduplicateSegments: true
18
- }
19
- };
20
- class HookConfigManager {
21
- constructor(configPath = './hooks.config.json') {
22
- this.config = DEFAULT_CONFIG;
23
- this.configPath = (0, path_1.resolve)(configPath);
24
- }
25
- async load() {
26
- try {
27
- const content = await fs_1.promises.readFile(this.configPath, 'utf8');
28
- this.config = { ...DEFAULT_CONFIG, ...JSON.parse(content) };
29
- }
30
- catch (error) {
31
- // File doesn't exist, use defaults
32
- this.config = DEFAULT_CONFIG;
33
- }
34
- }
35
- async save() {
36
- const content = JSON.stringify(this.config, null, 2);
37
- await fs_1.promises.writeFile(this.configPath, content, 'utf8');
38
- }
39
- getOverride(operationId) {
40
- return this.config.nameOverrides[operationId];
41
- }
42
- addOverride(override) {
43
- this.config.nameOverrides[override.original] = override.override;
44
- this.config.reviewedNames.push({
45
- ...override,
46
- approvedAt: new Date().toISOString()
47
- });
48
- }
49
- getPatterns() {
50
- return this.config.patterns;
51
- }
52
- updateStatistics(stats) {
53
- this.config.statistics = {
54
- ...this.config.statistics,
55
- ...stats,
56
- lastUpdated: new Date().toISOString()
57
- };
58
- }
59
- getReviewedNames() {
60
- return this.config.reviewedNames;
61
- }
62
- hasBeenReviewed(operationId) {
63
- return operationId in this.config.nameOverrides;
64
- }
7
+
8
+ export class HookConfigManager {
9
+ constructor(configPath) {
10
+ this.configPath = configPath;
11
+ this.overrides = {};
12
+ this.patterns = {
13
+ deduplicateSegments: true
14
+ };
15
+ this.reviewedNames = [];
16
+ this.statistics = {};
17
+ }
18
+
19
+ async load() {
20
+ // No-op for stub - would load from config file
21
+ return;
22
+ }
23
+
24
+ async save() {
25
+ // No-op for stub - would save to config file
26
+ return;
27
+ }
28
+
29
+ getOverride(operationId) {
30
+ return this.overrides[operationId] || null;
31
+ }
32
+
33
+ getPatterns() {
34
+ return this.patterns;
35
+ }
36
+
37
+ getReviewedNames() {
38
+ return this.reviewedNames;
39
+ }
40
+
41
+ updateStatistics(stats) {
42
+ this.statistics = { ...this.statistics, ...stats };
43
+ }
44
+
45
+ setOverride(operationId, hookName) {
46
+ this.overrides[operationId] = hookName;
47
+ }
65
48
  }
66
- exports.HookConfigManager = HookConfigManager;