@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.
- package/CHANGELOG.md +69 -74
- package/README.md +17 -2
- package/cli/commands/generate-hooks.ts +15 -6
- package/cli/commands/scaffold.ts +1 -1
- package/cli/index.ts +1 -3
- package/cli/src/codegen/openapi/__tests__/naming-utils.test.js +367 -0
- package/cli/src/codegen/openapi/client-generator.js +90 -35
- package/cli/src/codegen/openapi/confidence-scorer.js +89 -200
- package/cli/src/codegen/openapi/hook-config.js +45 -63
- package/cli/src/codegen/openapi/hook-generator.js +253 -547
- package/cli/src/codegen/openapi/naming-constants.js +98 -0
- package/cli/src/codegen/openapi/naming-utils.js +149 -0
- package/cli/src/codegen/openapi/parser.js +9 -14
- package/cli/src/codegen/openapi/type-generator.js +6 -16
- package/dist/atoms/components/core/Avatar/Avatar.d.ts +6 -6
- package/dist/atoms/components/core/Avatar/Avatar.d.ts.map +1 -1
- package/dist/atoms/components/core/Avatar/index.d.ts +1 -1
- package/dist/atoms/components/core/Badge/Badge.d.ts +6 -6
- package/dist/atoms/components/core/Badge/Badge.d.ts.map +1 -1
- package/dist/atoms/components/core/Badge/index.d.ts +1 -1
- package/dist/atoms/components/core/Button/Button.d.ts +3 -3
- package/dist/atoms/components/core/Button/Button.d.ts.map +1 -1
- package/dist/atoms/components/core/Button/index.d.ts +2 -2
- package/dist/atoms/components/core/Card/Card.d.ts +2 -2
- package/dist/atoms/components/core/Card/Card.d.ts.map +1 -1
- package/dist/atoms/components/core/Card/index.d.ts +2 -2
- package/dist/atoms/components/core/Card/index.d.ts.map +1 -1
- package/dist/atoms/components/core/Checkbox/Checkbox.d.ts +4 -4
- package/dist/atoms/components/core/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/atoms/components/core/Checkbox/index.d.ts +2 -2
- package/dist/atoms/components/core/Input/Input.d.ts +2 -2
- package/dist/atoms/components/core/Input/Input.d.ts.map +1 -1
- package/dist/atoms/components/core/Input/index.d.ts +2 -2
- package/dist/atoms/components/core/Label/Label.d.ts +3 -4
- package/dist/atoms/components/core/Label/Label.d.ts.map +1 -1
- package/dist/atoms/components/core/Label/index.d.ts +2 -2
- package/dist/atoms/components/core/Select/Select.d.ts +5 -5
- package/dist/atoms/components/core/Select/Select.d.ts.map +1 -1
- package/dist/atoms/components/core/Select/index.d.ts +2 -2
- package/dist/atoms/components/core/Select/index.d.ts.map +1 -1
- package/dist/atoms/components/core/Spinner/Spinner.d.ts +4 -4
- package/dist/atoms/components/core/Spinner/Spinner.d.ts.map +1 -1
- package/dist/atoms/components/core/Spinner/index.d.ts +2 -2
- package/dist/atoms/components/core/Switch/Switch.d.ts +4 -4
- package/dist/atoms/components/core/Switch/Switch.d.ts.map +1 -1
- package/dist/atoms/components/core/Switch/index.d.ts +1 -1
- package/dist/atoms/components/core/index.d.ts +10 -10
- package/dist/atoms/components/core/index.d.ts.map +1 -1
- package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts +2 -2
- package/dist/atoms/components/data/ActivityFeed/ActivityFeed.d.ts.map +1 -1
- package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts +3 -3
- package/dist/atoms/components/data/ActivityFeed/ActivityFeedItem.d.ts.map +1 -1
- package/dist/atoms/components/data/ActivityFeed/index.d.ts +3 -3
- package/dist/atoms/components/data/ActivityFeed/index.d.ts.map +1 -1
- package/dist/atoms/components/data/ActivityFeed/types.d.ts +3 -3
- package/dist/atoms/components/data/ActivityFeed/types.d.ts.map +1 -1
- package/dist/atoms/components/data/ActivityFeed/utils.d.ts +2 -2
- package/dist/atoms/components/data/ActivityFeed/utils.d.ts.map +1 -1
- package/dist/atoms/components/data/Chart/Chart.d.ts +52 -5
- package/dist/atoms/components/data/Chart/Chart.d.ts.map +1 -1
- package/dist/atoms/components/data/Chart/index.d.ts +2 -2
- package/dist/atoms/components/data/Chart/index.d.ts.map +1 -1
- package/dist/atoms/components/data/DataBadge/DataBadge.d.ts +6 -6
- package/dist/atoms/components/data/DataBadge/DataBadge.d.ts.map +1 -1
- package/dist/atoms/components/data/DataBadge/index.d.ts +1 -1
- package/dist/atoms/components/data/DataTable/DataTable.d.ts +4 -4
- package/dist/atoms/components/data/DataTable/DataTable.d.ts.map +1 -1
- package/dist/atoms/components/data/DataTable/DataTable.types.d.ts +4 -4
- package/dist/atoms/components/data/DataTable/DataTable.types.d.ts.map +1 -1
- package/dist/atoms/components/data/DataTable/TableCellWithTooltip.d.ts +1 -1
- package/dist/atoms/components/data/DataTable/index.d.ts +2 -2
- package/dist/atoms/components/data/DetailedCard/DetailedCard.d.ts +4 -4
- package/dist/atoms/components/data/DetailedCard/DetailedCard.d.ts.map +1 -1
- package/dist/atoms/components/data/DetailedCard/index.d.ts +2 -2
- package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts +3 -3
- package/dist/atoms/components/data/EntityIcon/EntityIcon.d.ts.map +1 -1
- package/dist/atoms/components/data/EntityIcon/index.d.ts +1 -1
- package/dist/atoms/components/data/IconBadge/IconBadge.d.ts +6 -6
- package/dist/atoms/components/data/IconBadge/IconBadge.d.ts.map +1 -1
- package/dist/atoms/components/data/IconBadge/index.d.ts +2 -2
- package/dist/atoms/components/data/ListCard/ListCard.d.ts +9 -9
- package/dist/atoms/components/data/ListCard/ListCard.d.ts.map +1 -1
- package/dist/atoms/components/data/ListCard/index.d.ts +1 -1
- package/dist/atoms/components/data/ProgressBar/ProgressBar.d.ts +5 -5
- package/dist/atoms/components/data/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/atoms/components/data/ProgressBar/index.d.ts +1 -1
- package/dist/atoms/components/data/StatCard/StatCard.d.ts +3 -3
- package/dist/atoms/components/data/StatCard/StatCard.d.ts.map +1 -1
- package/dist/atoms/components/data/StatCard/index.d.ts +1 -1
- package/dist/atoms/components/data/Table/Table.d.ts +2 -2
- package/dist/atoms/components/data/Table/Table.d.ts.map +1 -1
- package/dist/atoms/components/data/Table/index.d.ts +1 -1
- package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts +2 -2
- package/dist/atoms/components/data/TruncatedText/TruncatedText.d.ts.map +1 -1
- package/dist/atoms/components/data/TruncatedText/index.d.ts +1 -1
- package/dist/atoms/components/data/index.d.ts +12 -12
- package/dist/atoms/components/data/index.d.ts.map +1 -1
- package/dist/atoms/components/domain/SalesPanel/SalesPanel.d.ts +15 -15
- package/dist/atoms/components/domain/SalesPanel/SalesPanel.d.ts.map +1 -1
- package/dist/atoms/components/domain/SalesPanel/index.d.ts +1 -1
- package/dist/atoms/components/domain/SalesPanel/index.d.ts.map +1 -1
- package/dist/atoms/components/domain/index.d.ts +1 -1
- package/dist/atoms/components/feedback/Alert/Alert.d.ts +4 -4
- package/dist/atoms/components/feedback/Alert/Alert.d.ts.map +1 -1
- package/dist/atoms/components/feedback/Alert/index.d.ts +1 -1
- package/dist/atoms/components/feedback/EmptyState/EmptyState.d.ts +3 -3
- package/dist/atoms/components/feedback/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/atoms/components/feedback/EmptyState/index.d.ts +1 -1
- package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts +1 -1
- package/dist/atoms/components/feedback/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
- package/dist/atoms/components/feedback/ErrorBoundary/index.d.ts +1 -1
- package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts +30 -4
- package/dist/atoms/components/feedback/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/atoms/components/feedback/Skeleton/index.d.ts +1 -1
- package/dist/atoms/components/feedback/Toast/Toast.d.ts +4 -4
- package/dist/atoms/components/feedback/Toast/Toast.d.ts.map +1 -1
- package/dist/atoms/components/feedback/Toast/index.d.ts +1 -1
- package/dist/atoms/components/feedback/Toast/index.d.ts.map +1 -1
- package/dist/atoms/components/feedback/index.d.ts +5 -5
- package/dist/atoms/components/feedback/index.d.ts.map +1 -1
- package/dist/atoms/components/forms/DateTimePicker/DateTimePicker.d.ts +6 -6
- package/dist/atoms/components/forms/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/atoms/components/forms/DateTimePicker/index.d.ts +2 -2
- package/dist/atoms/components/forms/FileUpload/FileUpload.d.ts +3 -3
- package/dist/atoms/components/forms/FileUpload/FileUpload.d.ts.map +1 -1
- package/dist/atoms/components/forms/FileUpload/index.d.ts +2 -2
- package/dist/atoms/components/forms/FormField/FormField.d.ts +2 -2
- package/dist/atoms/components/forms/FormField/FormField.d.ts.map +1 -1
- package/dist/atoms/components/forms/FormField/index.d.ts +1 -1
- package/dist/atoms/components/forms/index.d.ts +3 -3
- package/dist/atoms/components/index.d.ts +9 -9
- package/dist/atoms/components/layout/Accordion/Accordion.d.ts +3 -3
- package/dist/atoms/components/layout/Accordion/Accordion.d.ts.map +1 -1
- package/dist/atoms/components/layout/Accordion/index.d.ts +1 -1
- package/dist/atoms/components/layout/Accordion/index.d.ts.map +1 -1
- package/dist/atoms/components/layout/Breadcrumb/Breadcrumb.d.ts +2 -3
- package/dist/atoms/components/layout/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/atoms/components/layout/Breadcrumb/index.d.ts +1 -1
- package/dist/atoms/components/layout/Breadcrumb/index.d.ts.map +1 -1
- package/dist/atoms/components/layout/Dialog/Dialog.d.ts +45 -0
- package/dist/atoms/components/layout/Dialog/Dialog.d.ts.map +1 -0
- package/dist/atoms/components/layout/Dialog/index.d.ts +2 -2
- package/dist/atoms/components/layout/Dialog/index.d.ts.map +1 -1
- package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts +9 -9
- package/dist/atoms/components/layout/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/atoms/components/layout/Dropdown/index.d.ts +2 -2
- package/dist/atoms/components/layout/Dropdown/index.d.ts.map +1 -1
- package/dist/atoms/components/layout/Modal/Modal.d.ts +6 -6
- package/dist/atoms/components/layout/Modal/Modal.d.ts.map +1 -1
- package/dist/atoms/components/layout/Modal/index.d.ts +2 -2
- package/dist/atoms/components/layout/Tabs/Tabs.d.ts +46 -0
- package/dist/atoms/components/layout/Tabs/Tabs.d.ts.map +1 -0
- package/dist/atoms/components/layout/Tabs/index.d.ts +1 -1
- package/dist/atoms/components/layout/Tooltip/Tooltip.d.ts +6 -6
- package/dist/atoms/components/layout/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/atoms/components/layout/Tooltip/index.d.ts +1 -1
- package/dist/atoms/components/layout/index.d.ts +7 -7
- package/dist/atoms/components/layout/index.d.ts.map +1 -1
- package/dist/atoms/components/navigation/GlobalSearch/GlobalSearch.d.ts +2 -3
- package/dist/atoms/components/navigation/GlobalSearch/GlobalSearch.d.ts.map +1 -1
- package/dist/atoms/components/navigation/GlobalSearch/index.d.ts +1 -1
- package/dist/atoms/components/navigation/GlobalSearch/index.d.ts.map +1 -1
- package/dist/atoms/components/navigation/index.d.ts +1 -1
- package/dist/atoms/components/theme/ColorSwatch/ColorSwatch.d.ts +2 -2
- package/dist/atoms/components/theme/ColorSwatch/ColorSwatch.d.ts.map +1 -1
- package/dist/atoms/components/theme/ColorSwatch/index.d.ts +1 -1
- package/dist/atoms/components/theme/DarkModeToggle.d.ts.map +1 -1
- package/dist/atoms/components/theme/PaletteSwitcher.d.ts +1 -1
- package/dist/atoms/components/theme/PaletteSwitcher.d.ts.map +1 -1
- package/dist/atoms/components/theme/StyleGuide.d.ts +1 -1
- package/dist/atoms/components/theme/StyleGuide.d.ts.map +1 -1
- package/dist/atoms/components/theme/index.d.ts +4 -4
- package/dist/atoms/components/user/UserAvatar/UserAvatar.d.ts +2 -3
- package/dist/atoms/components/user/UserAvatar/UserAvatar.d.ts.map +1 -1
- package/dist/atoms/components/user/UserAvatar/index.d.ts +1 -1
- package/dist/atoms/components/user/UserAvatar/index.d.ts.map +1 -1
- package/dist/atoms/components/user/UserMenu/UserMenu.d.ts +2 -3
- package/dist/atoms/components/user/UserMenu/UserMenu.d.ts.map +1 -1
- package/dist/atoms/components/user/UserMenu/index.d.ts +1 -1
- package/dist/atoms/components/user/UserMenu/index.d.ts.map +1 -1
- package/dist/atoms/components/user/index.d.ts +2 -2
- package/dist/atoms/config/responsive.d.ts +16 -16
- package/dist/atoms/config/responsive.d.ts.map +1 -1
- package/dist/atoms/hooks/index.d.ts +4 -4
- package/dist/atoms/hooks/use-toast.d.ts +1 -1
- package/dist/atoms/hooks/use-toast.d.ts.map +1 -1
- package/dist/atoms/hooks/useApi.d.ts +2 -2
- package/dist/atoms/hooks/useApi.d.ts.map +1 -1
- package/dist/atoms/hooks/useResponsive.d.ts +1 -1
- package/dist/atoms/hooks/useResponsive.d.ts.map +1 -1
- package/dist/atoms/index.d.ts +6 -7
- package/dist/atoms/index.d.ts.map +1 -1
- package/dist/atoms/primitives/Badge.d.ts +6 -6
- package/dist/atoms/primitives/Badge.d.ts.map +1 -1
- package/dist/atoms/primitives/ErrorBoundary.d.ts +3 -3
- package/dist/atoms/primitives/ErrorBoundary.d.ts.map +1 -1
- package/dist/atoms/primitives/Select.d.ts +9 -7
- package/dist/atoms/primitives/Select.d.ts.map +1 -1
- package/dist/atoms/primitives/Switch.d.ts +4 -3
- package/dist/atoms/primitives/Switch.d.ts.map +1 -1
- package/dist/atoms/primitives/Tabs.d.ts +10 -10
- package/dist/atoms/primitives/Tabs.d.ts.map +1 -1
- package/dist/atoms/primitives/avatar.d.ts.map +1 -1
- package/dist/atoms/primitives/button.d.ts +2 -5
- package/dist/atoms/primitives/button.d.ts.map +1 -1
- package/dist/atoms/primitives/button.variants.d.ts +7 -0
- package/dist/atoms/primitives/button.variants.d.ts.map +1 -0
- package/dist/atoms/primitives/card.d.ts +3 -2
- package/dist/atoms/primitives/card.d.ts.map +1 -1
- package/dist/atoms/primitives/checkbox.d.ts +3 -3
- package/dist/atoms/primitives/checkbox.d.ts.map +1 -1
- package/dist/atoms/primitives/dialog.d.ts +4 -4
- package/dist/atoms/primitives/dialog.d.ts.map +1 -1
- package/dist/atoms/primitives/dropdown-menu.d.ts.map +1 -1
- package/dist/atoms/primitives/index.d.ts +16 -16
- package/dist/atoms/primitives/index.d.ts.map +1 -1
- package/dist/atoms/primitives/input.d.ts.map +1 -1
- package/dist/atoms/primitives/label.d.ts +4 -3
- package/dist/atoms/primitives/label.d.ts.map +1 -1
- package/dist/atoms/primitives/skeleton.d.ts.map +1 -1
- package/dist/atoms/primitives/spinner.d.ts +5 -5
- package/dist/atoms/primitives/spinner.d.ts.map +1 -1
- package/dist/atoms/primitives/table.d.ts.map +1 -1
- package/dist/atoms/services/api/client.d.ts +11 -2
- package/dist/atoms/services/api/client.d.ts.map +1 -1
- package/dist/atoms/services/auth-service.d.ts +1 -1
- package/dist/atoms/services/auth-service.d.ts.map +1 -1
- package/dist/atoms/services/health.d.ts +2 -2
- package/dist/atoms/services/index.d.ts +3 -3
- package/dist/atoms/shared/config/dashboard-sizes.d.ts +17 -17
- package/dist/atoms/shared/config/dashboard-sizes.d.ts.map +1 -1
- package/dist/atoms/shared/config/environment.d.ts.map +1 -1
- package/dist/atoms/shared/index.d.ts +4 -4
- package/dist/atoms/shared/index.d.ts.map +1 -1
- package/dist/atoms/types/auth.d.ts +11 -1
- package/dist/atoms/types/auth.d.ts.map +1 -1
- package/dist/atoms/types/entity-config.d.ts +9 -9
- package/dist/atoms/types/entity-config.d.ts.map +1 -1
- package/dist/atoms/types/generated.d.ts.map +1 -1
- package/dist/atoms/types/index.d.ts +6 -6
- package/dist/atoms/types/loading.d.ts +1 -1
- package/dist/atoms/types/navigation.d.ts +1 -1
- package/dist/atoms/types/navigation.d.ts.map +1 -1
- package/dist/atoms/types/ui-config.d.ts +8 -8
- package/dist/atoms/types/ui-config.d.ts.map +1 -1
- package/dist/atoms/utils/animations.d.ts +7 -7
- package/dist/atoms/utils/animations.d.ts.map +1 -1
- package/dist/atoms/utils/color-manager.d.ts +1 -1
- package/dist/atoms/utils/debounce.d.ts +1 -1
- package/dist/atoms/utils/debounce.d.ts.map +1 -1
- package/dist/atoms/utils/field-detection.d.ts +2 -2
- package/dist/atoms/utils/field-detection.d.ts.map +1 -1
- package/dist/atoms/utils/icon-map.d.ts +68 -0
- package/dist/atoms/utils/icon-map.d.ts.map +1 -0
- package/dist/atoms/utils/icon-resolver.d.ts +7 -67
- package/dist/atoms/utils/icon-resolver.d.ts.map +1 -1
- package/dist/atoms/utils/index.d.ts +4 -4
- package/dist/atoms/utils/metric-engine.d.ts +2 -10
- package/dist/atoms/utils/metric-engine.d.ts.map +1 -1
- package/dist/atoms/utils/tooltip-helpers.d.ts +1 -1
- package/dist/atoms/utils/tooltip-helpers.d.ts.map +1 -1
- package/dist/atoms/utils/ui-mapping.d.ts +6 -4
- package/dist/atoms/utils/ui-mapping.d.ts.map +1 -1
- package/dist/atoms/utils/utils.d.ts +7 -6
- package/dist/atoms/utils/utils.d.ts.map +1 -1
- package/dist/codegen/openapi/bulk-types.d.ts +4 -4
- package/dist/codegen/openapi/bulk-types.d.ts.map +1 -1
- package/dist/features/auth/components/LoginForm.d.ts.map +1 -1
- package/dist/features/auth/components/LogoutButton.d.ts.map +1 -1
- package/dist/features/auth/components/ProtectedRoute.d.ts +2 -2
- package/dist/features/auth/components/ProtectedRoute.d.ts.map +1 -1
- package/dist/features/auth/components/index.d.ts +3 -3
- package/dist/features/auth/hooks/auth-context.d.ts +3 -0
- package/dist/features/auth/hooks/auth-context.d.ts.map +1 -0
- package/dist/features/auth/hooks/index.d.ts +4 -3
- package/dist/features/auth/hooks/index.d.ts.map +1 -1
- package/dist/features/auth/hooks/use-auth.d.ts +3 -0
- package/dist/features/auth/hooks/use-auth.d.ts.map +1 -0
- package/dist/features/auth/hooks/useAuth.d.ts +3 -4
- package/dist/features/auth/hooks/useAuth.d.ts.map +1 -1
- package/dist/features/auth/hooks/useAuthContext.d.ts +1 -1
- package/dist/features/auth/hooks/useAuthContext.d.ts.map +1 -1
- package/dist/features/auth/hooks/usePermissions.d.ts +3 -3
- package/dist/features/auth/index.d.ts +3 -3
- package/dist/features/auth/providers/MockAuthProvider.d.ts +3 -4
- package/dist/features/auth/providers/MockAuthProvider.d.ts.map +1 -1
- package/dist/features/auth/providers/index.d.ts +2 -1
- package/dist/features/auth/providers/index.d.ts.map +1 -1
- package/dist/features/auth/providers/mock-auth-context.d.ts +3 -0
- package/dist/features/auth/providers/mock-auth-context.d.ts.map +1 -0
- package/dist/features/auth/providers/use-mock-auth.d.ts +3 -0
- package/dist/features/auth/providers/use-mock-auth.d.ts.map +1 -0
- package/dist/features/auth/services/mock-auth-service.d.ts +3 -3
- package/dist/features/auth/services/mock-auth-service.d.ts.map +1 -1
- package/dist/features/index.d.ts +1 -1
- package/dist/frontend-patterns.css +713 -576
- package/dist/index.d.ts +17 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +21400 -21788
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +21404 -21792
- package/dist/index.js.map +1 -1
- package/dist/molecules/forms/FormGroup.d.ts +2 -2
- package/dist/molecules/forms/FormGroup.d.ts.map +1 -1
- package/dist/molecules/forms/SearchInput.d.ts +1 -1
- package/dist/molecules/forms/SearchInput.d.ts.map +1 -1
- package/dist/molecules/forms/index.d.ts +2 -2
- package/dist/molecules/forms/index.d.ts.map +1 -1
- package/dist/molecules/index.d.ts +3 -3
- package/dist/molecules/layout/AppHeader/AppHeader.d.ts +1 -1
- package/dist/molecules/layout/AppHeader/AppHeader.d.ts.map +1 -1
- package/dist/molecules/layout/AppHeader/index.d.ts +1 -1
- package/dist/molecules/layout/BulkSelectionBar.d.ts +2 -2
- package/dist/molecules/layout/BulkSelectionBar.d.ts.map +1 -1
- package/dist/molecules/layout/DashboardWithSidePanel/DashboardWithSidePanel.d.ts +1 -1
- package/dist/molecules/layout/DashboardWithSidePanel/index.d.ts +1 -1
- package/dist/molecules/layout/NavigationContext.d.ts +3 -9
- package/dist/molecules/layout/NavigationContext.d.ts.map +1 -1
- package/dist/molecules/layout/PageTemplate.d.ts +1 -1
- package/dist/molecules/layout/PageTemplate.d.ts.map +1 -1
- package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts +4 -4
- package/dist/molecules/layout/SectionHeader/SectionHeader.d.ts.map +1 -1
- package/dist/molecules/layout/SectionHeader/index.d.ts +1 -1
- package/dist/molecules/layout/ShowcaseSection.d.ts +4 -4
- package/dist/molecules/layout/ShowcaseSection.d.ts.map +1 -1
- package/dist/molecules/layout/Sidebar.d.ts.map +1 -1
- package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts +1 -1
- package/dist/molecules/layout/SidebarButton/SidebarButton.d.ts.map +1 -1
- package/dist/molecules/layout/SidebarButton/index.d.ts +1 -1
- package/dist/molecules/layout/SidebarContext.d.ts +1 -8
- package/dist/molecules/layout/SidebarContext.d.ts.map +1 -1
- package/dist/molecules/layout/index.d.ts +14 -11
- package/dist/molecules/layout/index.d.ts.map +1 -1
- package/dist/molecules/layout/navigation-context.d.ts +9 -0
- package/dist/molecules/layout/navigation-context.d.ts.map +1 -0
- package/dist/molecules/layout/sidebar-context.d.ts +7 -0
- package/dist/molecules/layout/sidebar-context.d.ts.map +1 -0
- package/dist/molecules/layout/use-navigation.d.ts +2 -0
- package/dist/molecules/layout/use-navigation.d.ts.map +1 -0
- package/dist/molecules/layout/use-sidebar.d.ts +2 -0
- package/dist/molecules/layout/use-sidebar.d.ts.map +1 -0
- package/dist/molecules/navigation/NavMenu.d.ts +2 -2
- package/dist/molecules/navigation/NavMenu.d.ts.map +1 -1
- package/dist/molecules/navigation/Pagination.d.ts +2 -2
- package/dist/molecules/navigation/index.d.ts +2 -2
- package/dist/organisms/index.d.ts +1 -1
- package/dist/organisms/showcase/ComponentShowcasePage.d.ts +1 -1
- package/dist/organisms/showcase/ComponentShowcasePage.d.ts.map +1 -1
- package/dist/templates/AuthTemplate.d.ts +4 -4
- package/dist/templates/AuthTemplate.d.ts.map +1 -1
- package/dist/templates/ComponentShowcaseTemplate.d.ts +7 -7
- package/dist/templates/ComponentShowcaseTemplate.d.ts.map +1 -1
- package/dist/templates/DashboardTemplate.d.ts +3 -3
- package/dist/templates/DashboardTemplate.d.ts.map +1 -1
- package/dist/templates/DataTemplate.d.ts +3 -3
- package/dist/templates/DataTemplate.d.ts.map +1 -1
- package/dist/templates/EnhancedDataTemplate.d.ts +11 -11
- package/dist/templates/EnhancedDataTemplate.d.ts.map +1 -1
- package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts +2 -2
- package/dist/templates/EnhancedDataTemplate.hooks.bulk.d.ts.map +1 -1
- package/dist/templates/EnhancedDataTemplate.hooks.d.ts +4 -4
- package/dist/templates/EnhancedDataTemplate.hooks.d.ts.map +1 -1
- package/dist/templates/admin/AdminCRUDTemplate.d.ts +4 -4
- package/dist/templates/admin/AdminCRUDTemplate.d.ts.map +1 -1
- package/dist/templates/admin/AdminDashboardTemplate.d.ts +7 -7
- package/dist/templates/admin/AdminDashboardTemplate.d.ts.map +1 -1
- package/dist/templates/admin/AdminDetailTemplate.d.ts +4 -4
- package/dist/templates/admin/AdminDetailTemplate.d.ts.map +1 -1
- package/dist/templates/admin/index.d.ts +3 -3
- package/dist/templates/admin/index.d.ts.map +1 -1
- package/dist/templates/api/APIDataTemplate.d.ts +14 -9
- package/dist/templates/api/APIDataTemplate.d.ts.map +1 -1
- package/dist/templates/api/create-api-data-template.d.ts +4 -0
- package/dist/templates/api/create-api-data-template.d.ts.map +1 -0
- package/dist/templates/api/index.d.ts +3 -2
- package/dist/templates/api/index.d.ts.map +1 -1
- package/dist/templates/factory.d.ts +3 -3
- package/dist/templates/factory.d.ts.map +1 -1
- package/dist/templates/index.d.ts +8 -8
- package/dist/templates/index.d.ts.map +1 -1
- package/package.json +10 -7
- package/LICENSE +0 -19
- package/cli/cli/commands/generate-hooks.js +0 -291
- package/cli/cli/commands/init.js +0 -25
- package/cli/cli/commands/scaffold.js +0 -201
- package/cli/cli/index.js +0 -113
- package/cli/commands/generate-hooks.js +0 -291
- package/cli/commands/init.js +0 -25
- package/cli/commands/scaffold.js +0 -201
- package/cli/index.js +0 -6665
- package/cli/src/codegen/openapi/bulk-hook-generator.js +0 -252
- package/cli/src/codegen/openapi/bulk-types.js +0 -89
- package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts +0 -38
- package/dist/atoms/components/data/ActivityFeed/ActivityFeed.stories.d.ts.map +0 -1
- package/dist/codegen/index.d.ts +0 -7
- package/dist/codegen/index.d.ts.map +0 -1
- package/dist/codegen/openapi/bulk-hook-generator.d.ts +0 -40
- package/dist/codegen/openapi/bulk-hook-generator.d.ts.map +0 -1
- package/dist/codegen/openapi/client-generator.d.ts +0 -52
- package/dist/codegen/openapi/client-generator.d.ts.map +0 -1
- package/dist/codegen/openapi/confidence-scorer.d.ts +0 -30
- package/dist/codegen/openapi/confidence-scorer.d.ts.map +0 -1
- package/dist/codegen/openapi/hook-config.d.ts +0 -50
- package/dist/codegen/openapi/hook-config.d.ts.map +0 -1
- package/dist/codegen/openapi/hook-generator.d.ts +0 -108
- package/dist/codegen/openapi/hook-generator.d.ts.map +0 -1
- package/dist/codegen/openapi/index.d.ts +0 -27
- package/dist/codegen/openapi/index.d.ts.map +0 -1
- package/dist/codegen/openapi/parser.d.ts +0 -107
- package/dist/codegen/openapi/parser.d.ts.map +0 -1
- package/dist/codegen/openapi/type-generator.d.ts +0 -53
- package/dist/codegen/openapi/type-generator.d.ts.map +0 -1
- package/dist/generated/client/client.d.ts +0 -23
- package/dist/generated/client/client.d.ts.map +0 -1
- package/dist/generated/client/config.d.ts +0 -10
- package/dist/generated/client/config.d.ts.map +0 -1
- package/dist/generated/client/index.d.ts +0 -12
- package/dist/generated/client/index.d.ts.map +0 -1
- package/dist/generated/client/methods.d.ts +0 -591
- package/dist/generated/client/methods.d.ts.map +0 -1
- package/dist/generated/client/types.d.ts +0 -37
- package/dist/generated/client/types.d.ts.map +0 -1
- package/dist/generated/example.d.ts +0 -8
- package/dist/generated/example.d.ts.map +0 -1
- package/dist/generated/hooks/index.d.ts +0 -11
- package/dist/generated/hooks/index.d.ts.map +0 -1
- package/dist/generated/hooks/keys.d.ts +0 -59
- package/dist/generated/hooks/keys.d.ts.map +0 -1
- package/dist/generated/hooks/mutations.d.ts +0 -551
- package/dist/generated/hooks/mutations.d.ts.map +0 -1
- package/dist/generated/hooks/queries.d.ts +0 -426
- package/dist/generated/hooks/queries.d.ts.map +0 -1
- package/dist/generated/hooks/types.d.ts +0 -318
- package/dist/generated/hooks/types.d.ts.map +0 -1
- package/dist/generated/index.d.ts +0 -13
- package/dist/generated/index.d.ts.map +0 -1
- package/dist/generated/types/endpoints.d.ts +0 -1364
- package/dist/generated/types/endpoints.d.ts.map +0 -1
- package/dist/generated/types/index.d.ts +0 -11
- package/dist/generated/types/index.d.ts.map +0 -1
- package/dist/generated/types/parameters.d.ts +0 -8
- package/dist/generated/types/parameters.d.ts.map +0 -1
- package/dist/generated/types/responses.d.ts +0 -8
- package/dist/generated/types/responses.d.ts.map +0 -1
- package/dist/generated/types/schemas.d.ts +0 -652
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
615
|
-
|
|
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
|
|
4
|
-
*
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
4
|
-
*
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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;
|