@manojkmfsi/monodog 1.1.37 → 1.1.39
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 +12 -0
- package/monodog-dashboard/dist/assets/index-C08ciT3A.js +20 -0
- package/monodog-dashboard/dist/assets/index-C08ciT3A.js.map +1 -0
- package/monodog-dashboard/dist/assets/index-Dc2vaUOq.css +1 -0
- package/monodog-dashboard/{index.html → dist/index.html} +2 -1
- package/monodog-dashboard/package.json +0 -3
- package/package.json +2 -2
- package/monodog-dashboard/THEME_SYSTEM.md +0 -309
- package/monodog-dashboard/__tests__/AuthCallbackPage.test.ts +0 -138
- package/monodog-dashboard/__tests__/ConfigInspector.test.ts +0 -33
- package/monodog-dashboard/__tests__/DependencyGraph.test.ts +0 -72
- package/monodog-dashboard/__tests__/HealthStatus.test.ts +0 -69
- package/monodog-dashboard/__tests__/LoginPage.test.ts +0 -79
- package/monodog-dashboard/__tests__/PackageDetail.test.ts +0 -22
- package/monodog-dashboard/__tests__/ReleaseManager.test.tsx +0 -510
- package/monodog-dashboard/__tests__/api-client.test.ts +0 -475
- package/monodog-dashboard/__tests__/components.test.ts +0 -117
- package/monodog-dashboard/__tests__/dashboard.utils.test.ts +0 -144
- package/monodog-dashboard/__tests__/dependency.utils.test.ts +0 -125
- package/monodog-dashboard/__tests__/monorepoService.unit.test.ts +0 -103
- package/monodog-dashboard/__tests__/packages.utils.test.ts +0 -37
- package/monodog-dashboard/__tests__/pages.test.ts +0 -103
- package/monodog-dashboard/package-lock.json +0 -4587
- package/monodog-dashboard/postcss.config.js +0 -6
- package/monodog-dashboard/src/components/App.tsx +0 -36
- package/monodog-dashboard/src/components/LoadingState.tsx +0 -18
- package/monodog-dashboard/src/components/PermissionGuard.tsx +0 -92
- package/monodog-dashboard/src/components/ProtectedRoute.tsx +0 -24
- package/monodog-dashboard/src/components/configuration/Configuration.tsx +0 -91
- package/monodog-dashboard/src/components/configuration/components/BrandingSettings.tsx +0 -128
- package/monodog-dashboard/src/components/configuration/components/ConfigurationHeader.tsx +0 -34
- package/monodog-dashboard/src/components/configuration/components/ConfigurationModal.tsx +0 -20
- package/monodog-dashboard/src/components/configuration/components/ConfigurationTabs.tsx +0 -30
- package/monodog-dashboard/src/components/configuration/components/FeatureToggles.tsx +0 -66
- package/monodog-dashboard/src/components/configuration/components/GeneralSettings.tsx +0 -77
- package/monodog-dashboard/src/components/configuration/components/MonorepoSettings.tsx +0 -179
- package/monodog-dashboard/src/components/configuration/components/index.ts +0 -8
- package/monodog-dashboard/src/components/configuration/types/config.types.ts +0 -52
- package/monodog-dashboard/src/components/configuration/utils/config.utils.tsx +0 -115
- package/monodog-dashboard/src/components/main-dashboard/Dashboard.tsx +0 -242
- package/monodog-dashboard/src/components/main-dashboard/Layout.tsx +0 -112
- package/monodog-dashboard/src/components/main-dashboard/components/Header.tsx +0 -47
- package/monodog-dashboard/src/components/main-dashboard/components/PackageDistribution.tsx +0 -35
- package/monodog-dashboard/src/components/main-dashboard/components/PackageSearchFilter.tsx +0 -47
- package/monodog-dashboard/src/components/main-dashboard/components/PackageTable.tsx +0 -87
- package/monodog-dashboard/src/components/main-dashboard/components/QuickActions.tsx +0 -60
- package/monodog-dashboard/src/components/main-dashboard/components/StatsCards.tsx +0 -73
- package/monodog-dashboard/src/components/main-dashboard/components/index.ts +0 -7
- package/monodog-dashboard/src/components/main-dashboard/types/dashboard.types.ts +0 -33
- package/monodog-dashboard/src/components/main-dashboard/utils/dashboard.utils.tsx +0 -70
- package/monodog-dashboard/src/components/modules/ci-integration/CIIntegration.tsx +0 -277
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildDetails.tsx +0 -228
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildList.tsx +0 -212
- package/monodog-dashboard/src/components/modules/ci-integration/components/BuildOverview.tsx +0 -158
- package/monodog-dashboard/src/components/modules/ci-integration/components/CIIntegrationHeader.tsx +0 -38
- package/monodog-dashboard/src/components/modules/ci-integration/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/ci-integration/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/ci-integration/components/PipelineStatus.tsx +0 -223
- package/monodog-dashboard/src/components/modules/ci-integration/components/index.ts +0 -8
- package/monodog-dashboard/src/components/modules/ci-integration/types/ci.types.ts +0 -97
- package/monodog-dashboard/src/components/modules/ci-integration/utils/ci.utils.tsx +0 -264
- package/monodog-dashboard/src/components/modules/config-inspector/ConfigInspector.tsx +0 -324
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigEditor.tsx +0 -93
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigInspectorHeader.tsx +0 -36
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigPreview.tsx +0 -89
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigSidebar.tsx +0 -141
- package/monodog-dashboard/src/components/modules/config-inspector/components/ConfigToolbar.tsx +0 -184
- package/monodog-dashboard/src/components/modules/config-inspector/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/config-inspector/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/config-inspector/components/ValidationPanel.tsx +0 -155
- package/monodog-dashboard/src/components/modules/config-inspector/components/index.ts +0 -9
- package/monodog-dashboard/src/components/modules/config-inspector/types/config.types.ts +0 -100
- package/monodog-dashboard/src/components/modules/config-inspector/utils/config.utils.tsx +0 -704
- package/monodog-dashboard/src/components/modules/dependency-graph/DependencyGraph.tsx +0 -224
- package/monodog-dashboard/src/components/modules/dependency-graph/components/CircularDependencies.tsx +0 -177
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyDetails.tsx +0 -192
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyGraphHeader.tsx +0 -30
- package/monodog-dashboard/src/components/modules/dependency-graph/components/DependencyList.tsx +0 -177
- package/monodog-dashboard/src/components/modules/dependency-graph/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphLegend.tsx +0 -89
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphStats.tsx +0 -141
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphToolbar.tsx +0 -107
- package/monodog-dashboard/src/components/modules/dependency-graph/components/GraphVisualization.tsx +0 -179
- package/monodog-dashboard/src/components/modules/dependency-graph/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/dependency-graph/components/index.ts +0 -11
- package/monodog-dashboard/src/components/modules/dependency-graph/types/dependency.types.ts +0 -105
- package/monodog-dashboard/src/components/modules/dependency-graph/utils/dependency.utils.tsx +0 -433
- package/monodog-dashboard/src/components/modules/health-status/HealthStatus.tsx +0 -739
- package/monodog-dashboard/src/components/modules/health-status/components/ErrorState.tsx +0 -25
- package/monodog-dashboard/src/components/modules/health-status/components/HealthActions.tsx +0 -122
- package/monodog-dashboard/src/components/modules/health-status/components/HealthAlerts.tsx +0 -151
- package/monodog-dashboard/src/components/modules/health-status/components/HealthMetrics.tsx +0 -132
- package/monodog-dashboard/src/components/modules/health-status/components/HealthStatusHeader.tsx +0 -30
- package/monodog-dashboard/src/components/modules/health-status/components/LoadingState.tsx +0 -16
- package/monodog-dashboard/src/components/modules/health-status/components/OverallHealthScore.tsx +0 -122
- package/monodog-dashboard/src/components/modules/health-status/components/PackageHealthList.tsx +0 -195
- package/monodog-dashboard/src/components/modules/health-status/types/health.types.ts +0 -80
- package/monodog-dashboard/src/components/modules/health-status/utils/health.utils.tsx +0 -220
- package/monodog-dashboard/src/components/modules/packages/PackageDetail.tsx +0 -255
- package/monodog-dashboard/src/components/modules/packages/PackagesOverview.tsx +0 -166
- package/monodog-dashboard/src/components/modules/packages/components/ConfigurationTab.tsx +0 -311
- package/monodog-dashboard/src/components/modules/packages/components/DependenciesTab.tsx +0 -154
- package/monodog-dashboard/src/components/modules/packages/components/ErrorState.tsx +0 -21
- package/monodog-dashboard/src/components/modules/packages/components/HealthMetricsTab.tsx +0 -275
- package/monodog-dashboard/src/components/modules/packages/components/LoadingState.tsx +0 -14
- package/monodog-dashboard/src/components/modules/packages/components/PackageDetailHeader.tsx +0 -167
- package/monodog-dashboard/src/components/modules/packages/components/PackageDetailTabs.tsx +0 -49
- package/monodog-dashboard/src/components/modules/packages/components/PackageStats.tsx +0 -70
- package/monodog-dashboard/src/components/modules/packages/components/PackagesTable.tsx +0 -163
- package/monodog-dashboard/src/components/modules/packages/components/RecentCommitsTab.tsx +0 -90
- package/monodog-dashboard/src/components/modules/packages/components/SearchAndFilter.tsx +0 -66
- package/monodog-dashboard/src/components/modules/packages/components/index.ts +0 -12
- package/monodog-dashboard/src/components/modules/packages/types/packages.types.ts +0 -101
- package/monodog-dashboard/src/components/modules/packages/utils/packages.utils.tsx +0 -178
- package/monodog-dashboard/src/components/pipeline/JobsList.tsx +0 -83
- package/monodog-dashboard/src/components/pipeline/LogViewer.tsx +0 -392
- package/monodog-dashboard/src/components/pipeline/PipelineManager.tsx +0 -562
- package/monodog-dashboard/src/components/pipeline/WorkflowRunsList.tsx +0 -272
- package/monodog-dashboard/src/components/pipeline/WorkflowTrigger.tsx +0 -182
- package/monodog-dashboard/src/components/pipeline/utils/pipeline.utils.tsx +0 -11
- package/monodog-dashboard/src/components/publish-control/PublishControl.tsx +0 -229
- package/monodog-dashboard/src/components/publish-control/components/ChangelogViewer.tsx +0 -103
- package/monodog-dashboard/src/components/publish-control/components/ErrorState.tsx +0 -23
- package/monodog-dashboard/src/components/publish-control/components/LoadingState.tsx +0 -10
- package/monodog-dashboard/src/components/publish-control/components/PackageReleaseTable.tsx +0 -140
- package/monodog-dashboard/src/components/publish-control/components/PublishHeader.tsx +0 -30
- package/monodog-dashboard/src/components/publish-control/components/QuickActionCards.tsx +0 -56
- package/monodog-dashboard/src/components/publish-control/components/ReleaseSchedule.tsx +0 -104
- package/monodog-dashboard/src/components/publish-control/components/index.ts +0 -8
- package/monodog-dashboard/src/components/publish-control/types/publish.types.ts +0 -39
- package/monodog-dashboard/src/components/publish-control/utils/publish.utils.ts +0 -59
- package/monodog-dashboard/src/components/release-manager/ReleaseManager.tsx +0 -342
- package/monodog-dashboard/src/components/release-manager/components/ChangesetPreview.tsx +0 -123
- package/monodog-dashboard/src/components/release-manager/components/ErrorState.tsx +0 -38
- package/monodog-dashboard/src/components/release-manager/components/LoadingState.tsx +0 -18
- package/monodog-dashboard/src/components/release-manager/components/PackageSelector.tsx +0 -137
- package/monodog-dashboard/src/components/release-manager/components/PublishConfirmation.tsx +0 -150
- package/monodog-dashboard/src/components/release-manager/components/ReleaseValidation.tsx +0 -138
- package/monodog-dashboard/src/components/release-manager/components/VersionBumpSelector.tsx +0 -142
- package/monodog-dashboard/src/components/release-manager/types/index.ts +0 -9
- package/monodog-dashboard/src/components/release-manager/types/release-manager.types.ts +0 -29
- package/monodog-dashboard/src/components/setup-guide/SetupGuide.tsx +0 -96
- package/monodog-dashboard/src/components/setup-guide/components/SetupHeader.tsx +0 -24
- package/monodog-dashboard/src/components/setup-guide/components/SetupModal.tsx +0 -24
- package/monodog-dashboard/src/components/setup-guide/components/SetupProgress.tsx +0 -29
- package/monodog-dashboard/src/components/setup-guide/components/StepContent.tsx +0 -272
- package/monodog-dashboard/src/components/setup-guide/components/StepNavigation.tsx +0 -62
- package/monodog-dashboard/src/components/setup-guide/components/index.ts +0 -6
- package/monodog-dashboard/src/components/setup-guide/types/setup.types.ts +0 -38
- package/monodog-dashboard/src/components/setup-guide/utils/setup.utils.ts +0 -79
- package/monodog-dashboard/src/constants/api-config.ts +0 -81
- package/monodog-dashboard/src/constants/index.ts +0 -9
- package/monodog-dashboard/src/constants/messages.ts +0 -40
- package/monodog-dashboard/src/icons/heroicons.ts +0 -65
- package/monodog-dashboard/src/icons/index.tsx +0 -1788
- package/monodog-dashboard/src/index.css +0 -175
- package/monodog-dashboard/src/main.tsx +0 -9
- package/monodog-dashboard/src/pages/AuthCallbackPage.tsx +0 -103
- package/monodog-dashboard/src/pages/CIPage.tsx +0 -6
- package/monodog-dashboard/src/pages/ConfigPage.tsx +0 -6
- package/monodog-dashboard/src/pages/DashboardPage.tsx +0 -6
- package/monodog-dashboard/src/pages/DependenciesPage.tsx +0 -6
- package/monodog-dashboard/src/pages/HealthPage.tsx +0 -6
- package/monodog-dashboard/src/pages/LoginPage.tsx +0 -77
- package/monodog-dashboard/src/pages/PackageDetailPage.tsx +0 -6
- package/monodog-dashboard/src/pages/PackagesPage.tsx +0 -6
- package/monodog-dashboard/src/pages/PipelinePage.tsx +0 -22
- package/monodog-dashboard/src/pages/PublishPage.tsx +0 -6
- package/monodog-dashboard/src/pages/ReleaseManagerPage.tsx +0 -9
- package/monodog-dashboard/src/pages/index.ts +0 -28
- package/monodog-dashboard/src/routes/AppRouter.tsx +0 -89
- package/monodog-dashboard/src/routes/AppRouterPages.tsx +0 -56
- package/monodog-dashboard/src/routes/index.ts +0 -10
- package/monodog-dashboard/src/routes/routes.config.ts +0 -94
- package/monodog-dashboard/src/services/api/api-client.ts +0 -189
- package/monodog-dashboard/src/services/api/index.ts +0 -30
- package/monodog-dashboard/src/services/api/types/api.types.ts +0 -63
- package/monodog-dashboard/src/services/auth-context.tsx +0 -344
- package/monodog-dashboard/src/services/monorepoService.ts +0 -733
- package/monodog-dashboard/src/services/permission-context.tsx +0 -193
- package/monodog-dashboard/src/theme/COMPONENT_UPDATES.md +0 -273
- package/monodog-dashboard/src/theme/INTEGRATION.md +0 -381
- package/monodog-dashboard/src/theme/README.md +0 -239
- package/monodog-dashboard/src/theme/examples.tsx +0 -386
- package/monodog-dashboard/src/theme/index.ts +0 -402
- package/monodog-dashboard/src/theme/migration-guide.md +0 -335
- package/monodog-dashboard/src/types/auth-context.types.ts +0 -51
- package/monodog-dashboard/src/types/component.types.ts +0 -96
- package/monodog-dashboard/src/types/icons.types.ts +0 -13
- package/monodog-dashboard/src/types/index.ts +0 -68
- package/monodog-dashboard/src/types/monorepo-service.types.ts +0 -53
- package/monodog-dashboard/src/types/permission-context.types.ts +0 -49
- package/monodog-dashboard/src/types/pipeline.types.ts +0 -89
- package/monodog-dashboard/src/types/routes.types.ts +0 -12
- package/monodog-dashboard/src/utils/cookies.ts +0 -47
- package/monodog-dashboard/tailwind.config.js +0 -68
- package/monodog-dashboard/tsconfig.app.json +0 -14
- package/monodog-dashboard/tsconfig.json +0 -17
- package/monodog-dashboard/tsconfig.node.json +0 -10
- package/monodog-dashboard/vite.config.ts +0 -9
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { Link } from 'react-router-dom';
|
|
2
|
-
import { ArrowUpIcon, ArrowDownIcon } from '../../../../icons/heroicons';
|
|
3
|
-
import { Package, PackageSorting } from '../types/packages.types';
|
|
4
|
-
import type { PackagesTableProps } from '../../../../types';
|
|
5
|
-
import {
|
|
6
|
-
getStatusColor,
|
|
7
|
-
getTypeColor,
|
|
8
|
-
formatDate,
|
|
9
|
-
formatVersion,
|
|
10
|
-
getPackageTypeIcon,
|
|
11
|
-
} from '../utils/packages.utils';
|
|
12
|
-
|
|
13
|
-
export default function PackagesTable({
|
|
14
|
-
packages,
|
|
15
|
-
sorting,
|
|
16
|
-
onSortChange,
|
|
17
|
-
}: PackagesTableProps) {
|
|
18
|
-
const handleSort = (field: PackageSorting['field']) => {
|
|
19
|
-
const newOrder =
|
|
20
|
-
sorting.field === field && sorting.order === 'asc' ? 'desc' : 'asc';
|
|
21
|
-
onSortChange({ field, order: newOrder });
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const getSortIcon = (field: string) => {
|
|
25
|
-
if (sorting.field !== field) return null;
|
|
26
|
-
return sorting.order === 'asc' ? (
|
|
27
|
-
<ArrowUpIcon className="w-4 h-4" />
|
|
28
|
-
) : (
|
|
29
|
-
<ArrowDownIcon className="w-4 h-4" />
|
|
30
|
-
);
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<div className="bg-white rounded-lg shadow border overflow-hidden">
|
|
35
|
-
<div className="overflow-x-auto">
|
|
36
|
-
<table className="w-full">
|
|
37
|
-
<thead className="bg-gray-50">
|
|
38
|
-
<tr>
|
|
39
|
-
<th
|
|
40
|
-
className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
|
|
41
|
-
onClick={() => handleSort('name')}
|
|
42
|
-
>
|
|
43
|
-
<div className="flex items-center space-x-1">
|
|
44
|
-
<span>Package</span>
|
|
45
|
-
{getSortIcon('name')}
|
|
46
|
-
</div>
|
|
47
|
-
</th>
|
|
48
|
-
<th
|
|
49
|
-
className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
|
|
50
|
-
onClick={() => handleSort('version')}
|
|
51
|
-
>
|
|
52
|
-
<div className="flex items-center space-x-1">
|
|
53
|
-
<span>Version</span>
|
|
54
|
-
{getSortIcon('version')}
|
|
55
|
-
</div>
|
|
56
|
-
</th>
|
|
57
|
-
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
|
58
|
-
Type
|
|
59
|
-
</th>
|
|
60
|
-
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
|
61
|
-
Status
|
|
62
|
-
</th>
|
|
63
|
-
<th
|
|
64
|
-
className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
|
|
65
|
-
onClick={() => handleSort('dependencies')}
|
|
66
|
-
>
|
|
67
|
-
<div className="flex items-center space-x-1">
|
|
68
|
-
<span>Dependencies</span>
|
|
69
|
-
{getSortIcon('dependencies')}
|
|
70
|
-
</div>
|
|
71
|
-
</th>
|
|
72
|
-
<th
|
|
73
|
-
className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
|
|
74
|
-
onClick={() => handleSort('lastUpdated')}
|
|
75
|
-
>
|
|
76
|
-
<div className="flex items-center space-x-1">
|
|
77
|
-
<span>Last Updated</span>
|
|
78
|
-
{getSortIcon('lastUpdated')}
|
|
79
|
-
</div>
|
|
80
|
-
</th>
|
|
81
|
-
<th className="hidden px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
|
82
|
-
Maintainers
|
|
83
|
-
</th>
|
|
84
|
-
</tr>
|
|
85
|
-
</thead>
|
|
86
|
-
<tbody className="bg-white divide-y divide-gray-200">
|
|
87
|
-
{packages.map(pkg => (
|
|
88
|
-
<tr key={pkg.name} className="hover:bg-gray-50">
|
|
89
|
-
<td className="px-6 py-4 whitespace-nowrap">
|
|
90
|
-
<div className="flex items-center">
|
|
91
|
-
<div className="text-2xl mr-3">
|
|
92
|
-
{getPackageTypeIcon(pkg.type)}
|
|
93
|
-
</div>
|
|
94
|
-
<div>
|
|
95
|
-
<Link
|
|
96
|
-
to={`/packages/${encodeURIComponent(pkg.name)}`}
|
|
97
|
-
className="text-sm font-medium text-blue-600 hover:text-blue-500"
|
|
98
|
-
>
|
|
99
|
-
{pkg.name}
|
|
100
|
-
</Link>
|
|
101
|
-
<div className="text-sm text-gray-500">
|
|
102
|
-
{pkg.description}
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
</td>
|
|
107
|
-
<td className="px-6 py-4 whitespace-nowrap">
|
|
108
|
-
<span className="text-sm font-mono text-gray-900">
|
|
109
|
-
{formatVersion(pkg.version)}
|
|
110
|
-
</span>
|
|
111
|
-
</td>
|
|
112
|
-
<td className="px-6 py-4 whitespace-nowrap">
|
|
113
|
-
<span
|
|
114
|
-
className={`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${getTypeColor(pkg.type)}`}
|
|
115
|
-
>
|
|
116
|
-
{pkg.type}
|
|
117
|
-
</span>
|
|
118
|
-
</td>
|
|
119
|
-
<td className="px-6 py-4 whitespace-nowrap">
|
|
120
|
-
<span
|
|
121
|
-
className={`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${getStatusColor(pkg.status)}`}
|
|
122
|
-
>
|
|
123
|
-
{pkg.status}
|
|
124
|
-
</span>
|
|
125
|
-
</td>
|
|
126
|
-
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
|
|
127
|
-
{Object.keys(pkg.dependencies).length > 0 && (
|
|
128
|
-
<div className="text-xs text-gray-500 mt-1">
|
|
129
|
-
{Object.keys(pkg.dependencies).slice(0, 3).join(', ')}
|
|
130
|
-
{Object.keys(pkg.dependencies).length > 3 &&
|
|
131
|
-
` +${Object.keys(pkg.dependencies).length - 3} more`}
|
|
132
|
-
</div>
|
|
133
|
-
)}
|
|
134
|
-
</td>
|
|
135
|
-
<td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
|
|
136
|
-
{formatDate(pkg.lastUpdated)}
|
|
137
|
-
</td>
|
|
138
|
-
<td className="px-6 py-4 whitespace-nowrap">
|
|
139
|
-
<div className="flex -space-x-1">
|
|
140
|
-
{pkg.maintainers.slice(0, 3).map((maintainer, index) => (
|
|
141
|
-
<div
|
|
142
|
-
key={maintainer}
|
|
143
|
-
className="inline-flex items-center justify-center h-6 w-6 rounded-full bg-gray-500 text-xs font-medium text-white"
|
|
144
|
-
title={maintainer}
|
|
145
|
-
>
|
|
146
|
-
{maintainer.charAt(0).toUpperCase()}
|
|
147
|
-
</div>
|
|
148
|
-
))}
|
|
149
|
-
{pkg.maintainers.length > 3 && (
|
|
150
|
-
<div className="inline-flex items-center justify-center h-6 w-6 rounded-full bg-gray-300 text-xs font-medium text-gray-600">
|
|
151
|
-
+{pkg.maintainers.length - 3}
|
|
152
|
-
</div>
|
|
153
|
-
)}
|
|
154
|
-
</div>
|
|
155
|
-
</td>
|
|
156
|
-
</tr>
|
|
157
|
-
))}
|
|
158
|
-
</tbody>
|
|
159
|
-
</table>
|
|
160
|
-
</div>
|
|
161
|
-
</div>
|
|
162
|
-
);
|
|
163
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { PackageDetail } from '../types/packages.types';
|
|
2
|
-
import type { RecentCommitsTabProps } from '../../../../types';
|
|
3
|
-
import { getCommitTypeColor, formatDate } from '../utils/packages.utils';
|
|
4
|
-
|
|
5
|
-
export default function RecentCommitsTab({
|
|
6
|
-
packageData,
|
|
7
|
-
}: RecentCommitsTabProps) {
|
|
8
|
-
return (
|
|
9
|
-
<div className="py-6">
|
|
10
|
-
<h3 className="text-lg font-medium text-gray-900 mb-4">Recent Commits</h3>
|
|
11
|
-
|
|
12
|
-
<div className="space-y-4">
|
|
13
|
-
{packageData.commits.map(commit => (
|
|
14
|
-
<div
|
|
15
|
-
key={commit.hash}
|
|
16
|
-
className="bg-white border rounded-lg p-4 hover:shadow-md transition-shadow"
|
|
17
|
-
>
|
|
18
|
-
<div className="flex items-start justify-between">
|
|
19
|
-
<div className="flex-1">
|
|
20
|
-
<div className="flex items-center space-x-3 mb-2">
|
|
21
|
-
<span
|
|
22
|
-
className={`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${getCommitTypeColor(commit.type)}`}
|
|
23
|
-
>
|
|
24
|
-
{commit.type}
|
|
25
|
-
</span>
|
|
26
|
-
<span className="text-sm font-mono text-gray-500">
|
|
27
|
-
{commit.hash}
|
|
28
|
-
</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
<p className="text-sm font-medium text-gray-900 mb-2">
|
|
32
|
-
{commit.message}
|
|
33
|
-
</p>
|
|
34
|
-
|
|
35
|
-
<div className="flex items-center space-x-4 text-sm text-gray-500">
|
|
36
|
-
<span>by {commit.author}</span>
|
|
37
|
-
<span>{formatDate(commit.date)}</span>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
<div className="hidden ml-4">
|
|
42
|
-
<button className="text-blue-600 hover:text-blue-500 text-sm">
|
|
43
|
-
View Diff
|
|
44
|
-
</button>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
))}
|
|
49
|
-
</div>
|
|
50
|
-
|
|
51
|
-
{packageData.commits.length === 0 && (
|
|
52
|
-
<div className="text-center py-8">
|
|
53
|
-
<div className="text-gray-400 text-4xl mb-2">📝</div>
|
|
54
|
-
<p className="text-gray-500">No recent commits found</p>
|
|
55
|
-
</div>
|
|
56
|
-
)}
|
|
57
|
-
|
|
58
|
-
{/* Commit Summary */}
|
|
59
|
-
<div className="mt-6 bg-gray-50 border border-gray-200 rounded-lg p-4">
|
|
60
|
-
<h4 className="font-medium text-gray-900 mb-2">Commit Summary</h4>
|
|
61
|
-
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm">
|
|
62
|
-
<div>
|
|
63
|
-
<span className="font-medium text-gray-800">Features:</span>
|
|
64
|
-
<span className="ml-2 text-gray-600">
|
|
65
|
-
{packageData.commits.filter(c => c.type === 'feat').length}
|
|
66
|
-
</span>
|
|
67
|
-
</div>
|
|
68
|
-
<div>
|
|
69
|
-
<span className="font-medium text-gray-800">Fixes:</span>
|
|
70
|
-
<span className="ml-2 text-gray-600">
|
|
71
|
-
{packageData.commits.filter(c => c.type === 'fix').length}
|
|
72
|
-
</span>
|
|
73
|
-
</div>
|
|
74
|
-
<div>
|
|
75
|
-
<span className="font-medium text-gray-800">Chores:</span>
|
|
76
|
-
<span className="ml-2 text-gray-600">
|
|
77
|
-
{packageData.commits.filter(c => c.type === 'chore').length}
|
|
78
|
-
</span>
|
|
79
|
-
</div>
|
|
80
|
-
<div>
|
|
81
|
-
<span className="font-medium text-gray-800">Breaking:</span>
|
|
82
|
-
<span className="ml-2 text-gray-600">
|
|
83
|
-
{packageData.commits.filter(c => c.type === 'breaking').length}
|
|
84
|
-
</span>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { MagnifyingGlassIcon, FunnelIcon } from '../../../../icons/heroicons';
|
|
2
|
-
import { PackageFilters } from '../types/packages.types';
|
|
3
|
-
import type { SearchAndFilterProps } from '../../../../types';
|
|
4
|
-
|
|
5
|
-
export default function SearchAndFilter({
|
|
6
|
-
filters,
|
|
7
|
-
onFiltersChange,
|
|
8
|
-
availableTypes,
|
|
9
|
-
availableStatuses,
|
|
10
|
-
}: SearchAndFilterProps) {
|
|
11
|
-
return (
|
|
12
|
-
<div className="bg-white p-6 rounded-lg shadow border">
|
|
13
|
-
<div className="flex flex-col md:flex-row md:items-center md:justify-between space-y-4 md:space-y-0 md:space-x-4">
|
|
14
|
-
{/* Search */}
|
|
15
|
-
<div className="flex-1 relative">
|
|
16
|
-
<MagnifyingGlassIcon className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-5 w-5" />
|
|
17
|
-
<input
|
|
18
|
-
type="text"
|
|
19
|
-
placeholder="Search packages by name, description, or tags..."
|
|
20
|
-
value={filters.search}
|
|
21
|
-
onChange={e =>
|
|
22
|
-
onFiltersChange({ ...filters, search: e.target.value })
|
|
23
|
-
}
|
|
24
|
-
className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
25
|
-
/>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
{/* Filters */}
|
|
29
|
-
<div className="flex items-center space-x-4">
|
|
30
|
-
<div className="flex items-center space-x-2">
|
|
31
|
-
<FunnelIcon className="h-5 w-5 text-gray-400" />
|
|
32
|
-
<select
|
|
33
|
-
value={filters.type}
|
|
34
|
-
onChange={e =>
|
|
35
|
-
onFiltersChange({ ...filters, type: e.target.value })
|
|
36
|
-
}
|
|
37
|
-
className="border border-gray-300 rounded-lg px-3 py-2 focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
38
|
-
>
|
|
39
|
-
<option value="all">All Types</option>
|
|
40
|
-
{availableTypes.map(type => (
|
|
41
|
-
<option key={type} value={type}>
|
|
42
|
-
{type.charAt(0).toUpperCase() + type.slice(1)}
|
|
43
|
-
</option>
|
|
44
|
-
))}
|
|
45
|
-
</select>
|
|
46
|
-
</div>
|
|
47
|
-
|
|
48
|
-
<select
|
|
49
|
-
value={filters.status}
|
|
50
|
-
onChange={e =>
|
|
51
|
-
onFiltersChange({ ...filters, status: e.target.value })
|
|
52
|
-
}
|
|
53
|
-
className="border border-gray-300 rounded-lg px-3 py-2 focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
54
|
-
>
|
|
55
|
-
<option value="all">All Status</option>
|
|
56
|
-
{availableStatuses.map(status => (
|
|
57
|
-
<option key={status} value={status}>
|
|
58
|
-
{status.charAt(0).toUpperCase() + status.slice(1)}
|
|
59
|
-
</option>
|
|
60
|
-
))}
|
|
61
|
-
</select>
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
);
|
|
66
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// Export all packages module components for easier imports
|
|
2
|
-
export { default as LoadingState } from './LoadingState';
|
|
3
|
-
export { default as ErrorState } from './ErrorState';
|
|
4
|
-
export { default as PackageStats } from './PackageStats';
|
|
5
|
-
export { default as SearchAndFilter } from './SearchAndFilter';
|
|
6
|
-
export { default as PackagesTable } from './PackagesTable';
|
|
7
|
-
export { default as PackageDetailHeader } from './PackageDetailHeader';
|
|
8
|
-
export { default as PackageDetailTabs } from './PackageDetailTabs';
|
|
9
|
-
export { default as DependenciesTab } from './DependenciesTab';
|
|
10
|
-
export { default as RecentCommitsTab } from './RecentCommitsTab';
|
|
11
|
-
export { default as HealthMetricsTab } from './HealthMetricsTab';
|
|
12
|
-
export { default as ConfigurationTab } from './ConfigurationTab';
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
// Shared types for packages module components
|
|
2
|
-
|
|
3
|
-
import type { DependencyInfo } from '@/services/monorepoService';
|
|
4
|
-
import type { PackageHealth } from '../../health-status/types/health.types';
|
|
5
|
-
|
|
6
|
-
export interface Package {
|
|
7
|
-
name: string;
|
|
8
|
-
version: string;
|
|
9
|
-
type: 'app' | 'lib' | 'tool' | 'service';
|
|
10
|
-
status: 'healthy' | 'warning' | 'error' | 'building';
|
|
11
|
-
lastUpdated: string;
|
|
12
|
-
dependencies: string[];
|
|
13
|
-
maintainers: string[];
|
|
14
|
-
tags: string[];
|
|
15
|
-
description: string;
|
|
16
|
-
path: string;
|
|
17
|
-
private?: boolean;
|
|
18
|
-
scripts?: Record<string, string>;
|
|
19
|
-
peerDependencies?: string[];
|
|
20
|
-
devDependencies?: string[];
|
|
21
|
-
dependents: string[];
|
|
22
|
-
packageHealth: PackageHealth;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface Dependency {
|
|
26
|
-
name: string;
|
|
27
|
-
version: string;
|
|
28
|
-
latest: string;
|
|
29
|
-
status: 'up-to-date' | 'outdated' | 'major-update';
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface Commit {
|
|
33
|
-
hash: string;
|
|
34
|
-
message: string;
|
|
35
|
-
author: string;
|
|
36
|
-
date: string;
|
|
37
|
-
type: 'feat' | 'fix' | 'chore' | 'breaking';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface PackageDetail {
|
|
41
|
-
name: string;
|
|
42
|
-
version: string;
|
|
43
|
-
type: 'app' | 'lib' | 'tool';
|
|
44
|
-
status: 'healthy' | 'warning' | 'error';
|
|
45
|
-
description: string;
|
|
46
|
-
lastUpdated: string;
|
|
47
|
-
dependencies: Dependency[];
|
|
48
|
-
devDependencies: Dependency[];
|
|
49
|
-
peerDependencies: Dependency[];
|
|
50
|
-
maintainers: string[];
|
|
51
|
-
tags: string[];
|
|
52
|
-
repository: string;
|
|
53
|
-
license: string;
|
|
54
|
-
scripts: Record<string, string>;
|
|
55
|
-
commits: Commit[];
|
|
56
|
-
packageHealth: PackageHealth;
|
|
57
|
-
buildStatus: 'success' | 'failed' | 'running' | 'unknown';
|
|
58
|
-
testCoverage: number;
|
|
59
|
-
lintStatus: 'pass' | 'fail' | 'warning';
|
|
60
|
-
dependenciesInfo: DependencyInfo[];
|
|
61
|
-
path: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface PackageStats {
|
|
65
|
-
total: number;
|
|
66
|
-
healthy: number;
|
|
67
|
-
warnings: number;
|
|
68
|
-
errors: number;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface PackageFilters {
|
|
72
|
-
search: string;
|
|
73
|
-
type: string;
|
|
74
|
-
status: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface PackageSorting {
|
|
78
|
-
field: 'name' | 'version' | 'lastUpdated' | 'dependencies';
|
|
79
|
-
order: 'asc' | 'desc';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export type PackageDetailTab =
|
|
83
|
-
| 'overview'
|
|
84
|
-
| 'dependencies'
|
|
85
|
-
| 'commits'
|
|
86
|
-
| 'health'
|
|
87
|
-
| 'config';
|
|
88
|
-
|
|
89
|
-
export interface PackageDetailTabsProps {
|
|
90
|
-
activeTab: PackageDetailTab;
|
|
91
|
-
onTabChange: (tab: PackageDetailTab) => void;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface LoadingStateProps {
|
|
95
|
-
message?: string;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export interface ErrorStateProps {
|
|
99
|
-
error: string;
|
|
100
|
-
onRetry?: () => void;
|
|
101
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Package,
|
|
3
|
-
PackageStats,
|
|
4
|
-
PackageFilters,
|
|
5
|
-
PackageSorting,
|
|
6
|
-
} from '../types/packages.types';
|
|
7
|
-
import { BuildingLibraryIcon } from '../../../../icons/heroicons';
|
|
8
|
-
import { RocketLaunchIcon } from '../../../../icons/heroicons';
|
|
9
|
-
import { CubeIcon } from '../../../../icons/heroicons';
|
|
10
|
-
// Calculate package statistics
|
|
11
|
-
export const calculatePackageStats = (packages: Package[]): PackageStats => {
|
|
12
|
-
return {
|
|
13
|
-
total: packages.length,
|
|
14
|
-
healthy: packages.filter(p => p.status === 'healthy').length,
|
|
15
|
-
warnings: packages.filter(p => p.status === 'warning').length,
|
|
16
|
-
errors: packages.filter(p => p.status === 'error').length,
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// Get unique package types
|
|
21
|
-
export const getUniquePackageTypes = (packages: Package[]): string[] => {
|
|
22
|
-
return [...new Set(packages.map(pkg => pkg.type))];
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// Get unique package statuses
|
|
26
|
-
export const getUniquePackageStatuses = (packages: Package[]): string[] => {
|
|
27
|
-
return [...new Set(packages.map(pkg => pkg.status))];
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// Filter packages based on search, type, and status
|
|
31
|
-
export const filterPackages = (
|
|
32
|
-
packages: Package[],
|
|
33
|
-
filters: PackageFilters
|
|
34
|
-
): Package[] => {
|
|
35
|
-
return packages.filter(pkg => {
|
|
36
|
-
const matchesSearch =
|
|
37
|
-
pkg.name.toLowerCase().includes(filters.search.toLowerCase()) ||
|
|
38
|
-
pkg.description.toLowerCase().includes(filters.search.toLowerCase());
|
|
39
|
-
// ||
|
|
40
|
-
// pkg.tags.some(tag =>
|
|
41
|
-
// tag.toLowerCase().includes(filters.search.toLowerCase())
|
|
42
|
-
// )
|
|
43
|
-
const matchesType = filters.type === 'all' || pkg.type === filters.type;
|
|
44
|
-
const matchesStatus =
|
|
45
|
-
filters.status === 'all' || pkg.status === filters.status;
|
|
46
|
-
|
|
47
|
-
return matchesSearch && matchesType && matchesStatus;
|
|
48
|
-
});
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
// Sort packages
|
|
52
|
-
export const sortPackages = (
|
|
53
|
-
packages: Package[],
|
|
54
|
-
sorting: PackageSorting
|
|
55
|
-
): Package[] => {
|
|
56
|
-
return [...packages].sort((a, b) => {
|
|
57
|
-
let aValue: any;
|
|
58
|
-
let bValue: any;
|
|
59
|
-
|
|
60
|
-
switch (sorting.field) {
|
|
61
|
-
case 'name':
|
|
62
|
-
aValue = a.name.toLowerCase();
|
|
63
|
-
bValue = b.name.toLowerCase();
|
|
64
|
-
break;
|
|
65
|
-
case 'version':
|
|
66
|
-
aValue = a.version;
|
|
67
|
-
bValue = b.version;
|
|
68
|
-
break;
|
|
69
|
-
case 'lastUpdated':
|
|
70
|
-
aValue = new Date(a.lastUpdated);
|
|
71
|
-
bValue = new Date(b.lastUpdated);
|
|
72
|
-
break;
|
|
73
|
-
case 'dependencies':
|
|
74
|
-
aValue = Object.keys(a.dependencies).length;
|
|
75
|
-
bValue = Object.keys(b.dependencies).length;
|
|
76
|
-
break;
|
|
77
|
-
default:
|
|
78
|
-
return 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (aValue < bValue) return sorting.order === 'asc' ? -1 : 1;
|
|
82
|
-
if (aValue > bValue) return sorting.order === 'asc' ? 1 : -1;
|
|
83
|
-
return 0;
|
|
84
|
-
});
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
// Get status color classes
|
|
88
|
-
export const getStatusColor = (status: string): string => {
|
|
89
|
-
switch (status) {
|
|
90
|
-
case 'healthy':
|
|
91
|
-
return 'bg-green-100 text-green-800';
|
|
92
|
-
case 'warning':
|
|
93
|
-
return 'bg-yellow-100 text-yellow-800';
|
|
94
|
-
case 'error':
|
|
95
|
-
return 'bg-red-100 text-red-800';
|
|
96
|
-
case 'building':
|
|
97
|
-
return 'bg-blue-100 text-blue-800';
|
|
98
|
-
default:
|
|
99
|
-
return 'bg-gray-100 text-gray-800';
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
// Get type color classes
|
|
104
|
-
export const getTypeColor = (type: string): string => {
|
|
105
|
-
switch (type) {
|
|
106
|
-
case 'app':
|
|
107
|
-
return 'bg-blue-100 text-blue-800';
|
|
108
|
-
case 'lib':
|
|
109
|
-
return 'bg-purple-100 text-purple-800';
|
|
110
|
-
case 'tool':
|
|
111
|
-
return 'bg-orange-100 text-orange-800';
|
|
112
|
-
case 'service':
|
|
113
|
-
return 'bg-green-100 text-green-800';
|
|
114
|
-
default:
|
|
115
|
-
return 'bg-gray-100 text-gray-800';
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
// Get dependency status color classes
|
|
120
|
-
export const getDependencyStatusColor = (status: string): string => {
|
|
121
|
-
switch (status) {
|
|
122
|
-
case 'up-to-date':
|
|
123
|
-
return 'bg-green-100 text-green-800';
|
|
124
|
-
case 'outdated':
|
|
125
|
-
return 'bg-yellow-100 text-yellow-800';
|
|
126
|
-
case 'major-update':
|
|
127
|
-
return 'bg-red-100 text-red-800';
|
|
128
|
-
default:
|
|
129
|
-
return 'bg-gray-100 text-gray-800';
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
// Get commit type color classes
|
|
134
|
-
export const getCommitTypeColor = (type: string): string => {
|
|
135
|
-
switch (type) {
|
|
136
|
-
case 'feature':
|
|
137
|
-
return 'bg-blue-100 text-blue-800';
|
|
138
|
-
case 'fix':
|
|
139
|
-
return 'bg-green-100 text-green-800';
|
|
140
|
-
case 'chore':
|
|
141
|
-
return 'bg-gray-100 text-gray-800';
|
|
142
|
-
case 'breaking':
|
|
143
|
-
return 'bg-red-100 text-red-800';
|
|
144
|
-
default:
|
|
145
|
-
return 'bg-gray-100 text-gray-800';
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
// Format date for display
|
|
150
|
-
export const formatDate = (dateString: string): string => {
|
|
151
|
-
const date = new Date(dateString);
|
|
152
|
-
return date.toLocaleDateString('en-US', {
|
|
153
|
-
year: 'numeric',
|
|
154
|
-
month: 'short',
|
|
155
|
-
day: 'numeric',
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
// Format version for display
|
|
160
|
-
export const formatVersion = (version: string): string => {
|
|
161
|
-
return version.startsWith('v') ? version : `v${version}`;
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// Get package type icon
|
|
165
|
-
export const getPackageTypeIcon = (type: string): React.ReactNode => {
|
|
166
|
-
switch (type) {
|
|
167
|
-
case 'app':
|
|
168
|
-
return <RocketLaunchIcon className="w-6 h-6 text-primary-600" />;
|
|
169
|
-
case 'lib':
|
|
170
|
-
return <BuildingLibraryIcon className="w-6 h-6 text-primary-600" />;
|
|
171
|
-
case 'tool':
|
|
172
|
-
return '🔧';
|
|
173
|
-
case 'service':
|
|
174
|
-
return '🌐';
|
|
175
|
-
default:
|
|
176
|
-
return <CubeIcon className="w-6 h-6 text-primary-600" />;
|
|
177
|
-
}
|
|
178
|
-
};
|