@wakastellar/ui 2.3.5 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/stories/Button.d.ts +14 -0
- package/dist/stories/Button.stories.d.ts +8 -0
- package/dist/stories/Header.d.ts +11 -0
- package/dist/stories/Header.stories.d.ts +6 -0
- package/dist/stories/Page.d.ts +2 -0
- package/dist/stories/Page.stories.d.ts +6 -0
- package/package.json +11 -3
- package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
- package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
- package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
- package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
- package/src/blocks/chat/Chat.stories.tsx +466 -0
- package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
- package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
- package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
- package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
- package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
- package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
- package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
- package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
- package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
- package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/faq/FAQ.stories.tsx +416 -0
- package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
- package/src/blocks/footer/Footer.stories.tsx +328 -0
- package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
- package/src/blocks/header/WakaHeader.stories.tsx +455 -0
- package/src/blocks/headtab/Headtab.stories.tsx +369 -0
- package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
- package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
- package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
- package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
- package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
- package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
- package/src/blocks/layout/Layout.stories.tsx +373 -0
- package/src/blocks/login/Login.stories.tsx +443 -0
- package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
- package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
- package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
- package/src/blocks/profile/Profile.stories.tsx +371 -0
- package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
- package/src/blocks/settings/Settings.stories.tsx +520 -0
- package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
- package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
- package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
- package/src/blocks/wizard/Wizard.stories.tsx +683 -0
- package/src/components/accordion/Accordion.stories.tsx +93 -0
- package/src/components/alert/Alert.stories.tsx +95 -0
- package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
- package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
- package/src/components/avatar/Avatar.stories.tsx +104 -0
- package/src/components/button/Button.stories.tsx +12 -1
- package/src/components/calendar/Calendar.stories.tsx +102 -0
- package/src/components/card/Card.stories.tsx +125 -0
- package/src/components/checkbox/Checkbox.stories.tsx +100 -0
- package/src/components/code/Code.stories.tsx +402 -0
- package/src/components/collapsible/Collapsible.stories.tsx +123 -0
- package/src/components/command/Command.stories.tsx +207 -0
- package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
- package/src/components/dialog/Dialog.stories.tsx +157 -0
- package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
- package/src/components/form/Form.stories.tsx +413 -0
- package/src/components/hover-card/HoverCard.stories.tsx +148 -0
- package/src/components/input-otp/InputOTP.stories.tsx +255 -0
- package/src/components/label/Label.stories.tsx +68 -0
- package/src/components/menubar/Menubar.stories.tsx +278 -0
- package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
- package/src/components/popover/Popover.stories.tsx +199 -0
- package/src/components/progress/Progress.stories.tsx +104 -0
- package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
- package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
- package/src/components/select/Select.stories.tsx +146 -0
- package/src/components/separator/Separator.stories.tsx +117 -0
- package/src/components/sheet/Sheet.stories.tsx +195 -0
- package/src/components/skeleton/Skeleton.stories.tsx +114 -0
- package/src/components/slider/Slider.stories.tsx +157 -0
- package/src/components/switch/Switch.stories.tsx +114 -0
- package/src/components/table/Table.stories.tsx +153 -0
- package/src/components/tabs/Tabs.stories.tsx +155 -0
- package/src/components/textarea/Textarea.stories.tsx +116 -0
- package/src/components/toast/Toast.stories.tsx +160 -0
- package/src/components/toggle/Toggle.stories.tsx +125 -0
- package/src/components/tooltip/Tooltip.stories.tsx +133 -0
- package/src/components/typography/Typography.stories.tsx +207 -0
- package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
- package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
- package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
- package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
- package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
- package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
- package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
- package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
- package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
- package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
- package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
- package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
- package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
- package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
- package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
- package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
- package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
- package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
- package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
- package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
- package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
- package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
- package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
- package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
- package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
- package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
- package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
- package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
- package/src/components/waka-image/WakaImage.stories.tsx +255 -0
- package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
- package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
- package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
- package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
- package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
- package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
- package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
- package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
- package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
- package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
- package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
- package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
- package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
- package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
- package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
- package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
- package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
- package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
- package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
- package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
- package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
- package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
- package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
- package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
- package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
- package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
- package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
- package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
- package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
- package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
- package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
- package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
- package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
- package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
- package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
- package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
- package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
- package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
- package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
- package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
- package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
- package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
- package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
- package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
- package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
- package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
- package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
- package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
- package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
- package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import {
|
|
3
|
+
CICDBuilder,
|
|
4
|
+
defaultPipeline,
|
|
5
|
+
} from './index'
|
|
6
|
+
import type { Pipeline, PipelineStage, PipelineStep, StepType, StepStatus } from './index'
|
|
7
|
+
import * as React from 'react'
|
|
8
|
+
|
|
9
|
+
const meta: Meta<typeof CICDBuilder> = {
|
|
10
|
+
title: 'Blocks/CICDBuilder',
|
|
11
|
+
component: CICDBuilder,
|
|
12
|
+
parameters: {
|
|
13
|
+
layout: 'fullscreen',
|
|
14
|
+
docs: {
|
|
15
|
+
description: {
|
|
16
|
+
component:
|
|
17
|
+
'A CI/CD pipeline builder for creating and visualizing build, test, and deployment pipelines with drag-and-drop stages, step configuration, and YAML/JSON export.',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
tags: ['autodocs'],
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default meta
|
|
25
|
+
type Story = StoryObj<typeof CICDBuilder>
|
|
26
|
+
|
|
27
|
+
export const Default: Story = {
|
|
28
|
+
render: () => (
|
|
29
|
+
<div className="p-6">
|
|
30
|
+
<CICDBuilder
|
|
31
|
+
pipeline={defaultPipeline}
|
|
32
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
33
|
+
onRun={() => console.log('Run pipeline')}
|
|
34
|
+
onSave={() => console.log('Save pipeline')}
|
|
35
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
),
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const EmptyPipeline: Story = {
|
|
42
|
+
render: () => {
|
|
43
|
+
const emptyPipeline: Pipeline = {
|
|
44
|
+
id: 'new',
|
|
45
|
+
name: 'New Pipeline',
|
|
46
|
+
description: 'Configure your CI/CD pipeline',
|
|
47
|
+
stages: [],
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className="p-6">
|
|
52
|
+
<CICDBuilder
|
|
53
|
+
pipeline={emptyPipeline}
|
|
54
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
55
|
+
onRun={() => console.log('Run pipeline')}
|
|
56
|
+
onSave={() => console.log('Save pipeline')}
|
|
57
|
+
/>
|
|
58
|
+
</div>
|
|
59
|
+
)
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const ReadOnly: Story = {
|
|
64
|
+
render: () => (
|
|
65
|
+
<div className="p-6">
|
|
66
|
+
<CICDBuilder
|
|
67
|
+
pipeline={defaultPipeline}
|
|
68
|
+
readOnly
|
|
69
|
+
onRun={() => console.log('Run pipeline')}
|
|
70
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
),
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export const PipelineRunning: Story = {
|
|
77
|
+
render: () => {
|
|
78
|
+
const runningPipeline: Pipeline = {
|
|
79
|
+
...defaultPipeline,
|
|
80
|
+
stages: defaultPipeline.stages.map((stage, index) => ({
|
|
81
|
+
...stage,
|
|
82
|
+
status: index === 0 ? 'success' : index === 1 ? 'running' : 'pending',
|
|
83
|
+
steps: stage.steps.map((step, stepIndex) => ({
|
|
84
|
+
...step,
|
|
85
|
+
status: index === 0
|
|
86
|
+
? 'success'
|
|
87
|
+
: index === 1
|
|
88
|
+
? stepIndex === 0 ? 'success' : stepIndex === 1 ? 'running' : 'pending'
|
|
89
|
+
: 'pending',
|
|
90
|
+
})),
|
|
91
|
+
})),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<div className="p-6">
|
|
96
|
+
<CICDBuilder
|
|
97
|
+
pipeline={runningPipeline}
|
|
98
|
+
readOnly
|
|
99
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
100
|
+
/>
|
|
101
|
+
</div>
|
|
102
|
+
)
|
|
103
|
+
},
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export const PipelineFailed: Story = {
|
|
107
|
+
render: () => {
|
|
108
|
+
const failedPipeline: Pipeline = {
|
|
109
|
+
...defaultPipeline,
|
|
110
|
+
stages: defaultPipeline.stages.map((stage, index) => ({
|
|
111
|
+
...stage,
|
|
112
|
+
status: index < 2 ? 'success' : index === 2 ? 'failed' : 'skipped',
|
|
113
|
+
steps: stage.steps.map((step, stepIndex) => ({
|
|
114
|
+
...step,
|
|
115
|
+
status: index < 2
|
|
116
|
+
? 'success'
|
|
117
|
+
: index === 2
|
|
118
|
+
? stepIndex === 0 ? 'success' : stepIndex === 1 ? 'failed' : 'skipped'
|
|
119
|
+
: 'skipped',
|
|
120
|
+
})),
|
|
121
|
+
})),
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<div className="p-6">
|
|
126
|
+
<CICDBuilder
|
|
127
|
+
pipeline={failedPipeline}
|
|
128
|
+
readOnly
|
|
129
|
+
onRun={() => console.log('Retry pipeline')}
|
|
130
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
131
|
+
/>
|
|
132
|
+
</div>
|
|
133
|
+
)
|
|
134
|
+
},
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const PipelineSuccess: Story = {
|
|
138
|
+
render: () => {
|
|
139
|
+
const successPipeline: Pipeline = {
|
|
140
|
+
...defaultPipeline,
|
|
141
|
+
stages: defaultPipeline.stages.map(stage => ({
|
|
142
|
+
...stage,
|
|
143
|
+
status: 'success' as StepStatus,
|
|
144
|
+
steps: stage.steps.map(step => ({
|
|
145
|
+
...step,
|
|
146
|
+
status: 'success' as StepStatus,
|
|
147
|
+
})),
|
|
148
|
+
})),
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<div className="p-6">
|
|
153
|
+
<CICDBuilder
|
|
154
|
+
pipeline={successPipeline}
|
|
155
|
+
readOnly
|
|
156
|
+
onRun={() => console.log('Run again')}
|
|
157
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
)
|
|
161
|
+
},
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export const SimplePipeline: Story = {
|
|
165
|
+
render: () => {
|
|
166
|
+
const simplePipeline: Pipeline = {
|
|
167
|
+
id: 'simple',
|
|
168
|
+
name: 'Simple Build & Deploy',
|
|
169
|
+
trigger: {
|
|
170
|
+
branches: ['main'],
|
|
171
|
+
events: ['push'],
|
|
172
|
+
},
|
|
173
|
+
stages: [
|
|
174
|
+
{
|
|
175
|
+
id: 'build',
|
|
176
|
+
name: 'Build',
|
|
177
|
+
steps: [
|
|
178
|
+
{ id: 'install', name: 'Install', type: 'script', command: 'npm install' },
|
|
179
|
+
{ id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: 'deploy',
|
|
184
|
+
name: 'Deploy',
|
|
185
|
+
steps: [
|
|
186
|
+
{ id: 'deploy', name: 'Deploy to Production', type: 'deploy', command: 'npm run deploy' },
|
|
187
|
+
],
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<div className="p-6">
|
|
194
|
+
<CICDBuilder
|
|
195
|
+
pipeline={simplePipeline}
|
|
196
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
197
|
+
onRun={() => console.log('Run pipeline')}
|
|
198
|
+
onSave={() => console.log('Save pipeline')}
|
|
199
|
+
/>
|
|
200
|
+
</div>
|
|
201
|
+
)
|
|
202
|
+
},
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export const ComplexPipeline: Story = {
|
|
206
|
+
render: () => {
|
|
207
|
+
const complexPipeline: Pipeline = {
|
|
208
|
+
id: 'complex',
|
|
209
|
+
name: 'Full CI/CD Pipeline',
|
|
210
|
+
description: 'Complete pipeline with all stages',
|
|
211
|
+
trigger: {
|
|
212
|
+
branches: ['main', 'develop', 'release/*'],
|
|
213
|
+
events: ['push', 'pull_request', 'tag'],
|
|
214
|
+
schedule: '0 2 * * *',
|
|
215
|
+
},
|
|
216
|
+
stages: [
|
|
217
|
+
{
|
|
218
|
+
id: 'prepare',
|
|
219
|
+
name: 'Prepare',
|
|
220
|
+
steps: [
|
|
221
|
+
{ id: 'checkout', name: 'Checkout Code', type: 'script', command: 'git checkout $BRANCH' },
|
|
222
|
+
{ id: 'cache-restore', name: 'Restore Cache', type: 'cache' },
|
|
223
|
+
{ id: 'install', name: 'Install Dependencies', type: 'script', command: 'npm ci' },
|
|
224
|
+
],
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: 'build',
|
|
228
|
+
name: 'Build',
|
|
229
|
+
steps: [
|
|
230
|
+
{ id: 'lint', name: 'Lint', type: 'script', command: 'npm run lint' },
|
|
231
|
+
{ id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
|
|
232
|
+
{ id: 'cache-save', name: 'Save Cache', type: 'cache' },
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 'test',
|
|
237
|
+
name: 'Test',
|
|
238
|
+
steps: [
|
|
239
|
+
{ id: 'unit', name: 'Unit Tests', type: 'test', command: 'npm run test:unit' },
|
|
240
|
+
{ id: 'integration', name: 'Integration Tests', type: 'test', command: 'npm run test:integration' },
|
|
241
|
+
{ id: 'e2e', name: 'E2E Tests', type: 'test', command: 'npm run test:e2e', timeout: 600 },
|
|
242
|
+
{ id: 'coverage', name: 'Coverage Report', type: 'artifact', artifacts: ['coverage/**'] },
|
|
243
|
+
],
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: 'security',
|
|
247
|
+
name: 'Security',
|
|
248
|
+
steps: [
|
|
249
|
+
{ id: 'sast', name: 'SAST Scan', type: 'script', command: 'npm run security:sast' },
|
|
250
|
+
{ id: 'deps', name: 'Dependency Audit', type: 'script', command: 'npm audit --audit-level=high' },
|
|
251
|
+
{ id: 'secrets', name: 'Secret Scanning', type: 'script', command: 'gitleaks detect' },
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
id: 'package',
|
|
256
|
+
name: 'Package',
|
|
257
|
+
steps: [
|
|
258
|
+
{ id: 'docker', name: 'Build Docker Image', type: 'docker', image: 'app:$CI_COMMIT_SHA' },
|
|
259
|
+
{ id: 'push', name: 'Push to Registry', type: 'script', command: 'docker push $REGISTRY/app:$CI_COMMIT_SHA' },
|
|
260
|
+
{ id: 'artifact', name: 'Upload Artifacts', type: 'artifact', artifacts: ['dist/**', 'build/**'] },
|
|
261
|
+
],
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
id: 'deploy-staging',
|
|
265
|
+
name: 'Deploy Staging',
|
|
266
|
+
steps: [
|
|
267
|
+
{ id: 'deploy', name: 'Deploy to Staging', type: 'deploy', command: 'kubectl apply -f k8s/staging/' },
|
|
268
|
+
{ id: 'smoke', name: 'Smoke Tests', type: 'test', command: 'npm run test:smoke -- --env=staging' },
|
|
269
|
+
{ id: 'notify', name: 'Notify Team', type: 'notify' },
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
id: 'deploy-prod',
|
|
274
|
+
name: 'Deploy Production',
|
|
275
|
+
steps: [
|
|
276
|
+
{ id: 'approval', name: 'Approval Gate', type: 'approval', condition: "$CI_COMMIT_BRANCH == 'main'" },
|
|
277
|
+
{ id: 'deploy', name: 'Deploy to Production', type: 'deploy', command: 'kubectl apply -f k8s/production/' },
|
|
278
|
+
{ id: 'verify', name: 'Verify Deployment', type: 'test', command: 'npm run test:smoke -- --env=production' },
|
|
279
|
+
{ id: 'notify', name: 'Notify Stakeholders', type: 'notify' },
|
|
280
|
+
],
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
variables: {
|
|
284
|
+
NODE_ENV: 'production',
|
|
285
|
+
REGISTRY: 'gcr.io/my-project',
|
|
286
|
+
KUBECONFIG: '/secrets/kubeconfig',
|
|
287
|
+
},
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return (
|
|
291
|
+
<div className="p-6">
|
|
292
|
+
<CICDBuilder
|
|
293
|
+
pipeline={complexPipeline}
|
|
294
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
295
|
+
onRun={() => console.log('Run pipeline')}
|
|
296
|
+
onSave={() => console.log('Save pipeline')}
|
|
297
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
298
|
+
/>
|
|
299
|
+
</div>
|
|
300
|
+
)
|
|
301
|
+
},
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export const DockerPipeline: Story = {
|
|
305
|
+
render: () => {
|
|
306
|
+
const dockerPipeline: Pipeline = {
|
|
307
|
+
id: 'docker',
|
|
308
|
+
name: 'Docker Build & Push',
|
|
309
|
+
trigger: {
|
|
310
|
+
branches: ['main'],
|
|
311
|
+
events: ['push', 'tag'],
|
|
312
|
+
},
|
|
313
|
+
stages: [
|
|
314
|
+
{
|
|
315
|
+
id: 'build',
|
|
316
|
+
name: 'Build Image',
|
|
317
|
+
steps: [
|
|
318
|
+
{ id: 'docker-build', name: 'Build Docker Image', type: 'docker', image: 'myapp:$CI_COMMIT_SHA' },
|
|
319
|
+
{ id: 'docker-tag', name: 'Tag Image', type: 'script', command: 'docker tag myapp:$CI_COMMIT_SHA myapp:latest' },
|
|
320
|
+
],
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
id: 'test',
|
|
324
|
+
name: 'Test',
|
|
325
|
+
steps: [
|
|
326
|
+
{ id: 'container-test', name: 'Container Tests', type: 'test', command: 'docker run myapp:$CI_COMMIT_SHA npm test' },
|
|
327
|
+
{ id: 'security-scan', name: 'Security Scan', type: 'script', command: 'trivy image myapp:$CI_COMMIT_SHA' },
|
|
328
|
+
],
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
id: 'push',
|
|
332
|
+
name: 'Push',
|
|
333
|
+
steps: [
|
|
334
|
+
{ id: 'login', name: 'Login to Registry', type: 'script', command: 'docker login -u $DOCKER_USER -p $DOCKER_PASS' },
|
|
335
|
+
{ id: 'push', name: 'Push to Registry', type: 'script', command: 'docker push myregistry/myapp:$CI_COMMIT_SHA' },
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return (
|
|
342
|
+
<div className="p-6">
|
|
343
|
+
<CICDBuilder
|
|
344
|
+
pipeline={dockerPipeline}
|
|
345
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
346
|
+
onRun={() => console.log('Run pipeline')}
|
|
347
|
+
onSave={() => console.log('Save pipeline')}
|
|
348
|
+
/>
|
|
349
|
+
</div>
|
|
350
|
+
)
|
|
351
|
+
},
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export const Interactive: Story = {
|
|
355
|
+
render: () => {
|
|
356
|
+
const [pipeline, setPipeline] = React.useState<Pipeline>(defaultPipeline)
|
|
357
|
+
|
|
358
|
+
const handleRun = () => {
|
|
359
|
+
// Simulate pipeline execution
|
|
360
|
+
const stages = pipeline.stages.map(stage => ({
|
|
361
|
+
...stage,
|
|
362
|
+
status: 'pending' as StepStatus,
|
|
363
|
+
steps: stage.steps.map(step => ({ ...step, status: 'pending' as StepStatus })),
|
|
364
|
+
}))
|
|
365
|
+
setPipeline({ ...pipeline, stages })
|
|
366
|
+
|
|
367
|
+
// Simulate progress
|
|
368
|
+
let stageIndex = 0
|
|
369
|
+
let stepIndex = 0
|
|
370
|
+
|
|
371
|
+
const interval = setInterval(() => {
|
|
372
|
+
setPipeline(prev => {
|
|
373
|
+
const newStages = [...prev.stages]
|
|
374
|
+
|
|
375
|
+
if (stageIndex < newStages.length) {
|
|
376
|
+
const stage = { ...newStages[stageIndex] }
|
|
377
|
+
const steps = [...stage.steps]
|
|
378
|
+
|
|
379
|
+
if (stepIndex < steps.length) {
|
|
380
|
+
steps[stepIndex] = { ...steps[stepIndex], status: 'running' }
|
|
381
|
+
if (stepIndex > 0) {
|
|
382
|
+
steps[stepIndex - 1] = { ...steps[stepIndex - 1], status: 'success' }
|
|
383
|
+
}
|
|
384
|
+
stage.steps = steps
|
|
385
|
+
stage.status = 'running'
|
|
386
|
+
newStages[stageIndex] = stage
|
|
387
|
+
stepIndex++
|
|
388
|
+
} else {
|
|
389
|
+
steps[steps.length - 1] = { ...steps[steps.length - 1], status: 'success' }
|
|
390
|
+
stage.steps = steps
|
|
391
|
+
stage.status = 'success'
|
|
392
|
+
newStages[stageIndex] = stage
|
|
393
|
+
stageIndex++
|
|
394
|
+
stepIndex = 0
|
|
395
|
+
}
|
|
396
|
+
} else {
|
|
397
|
+
clearInterval(interval)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return { ...prev, stages: newStages }
|
|
401
|
+
})
|
|
402
|
+
}, 1000)
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const handleExport = (format: 'yaml' | 'json') => {
|
|
406
|
+
const content = format === 'json'
|
|
407
|
+
? JSON.stringify(pipeline, null, 2)
|
|
408
|
+
: `# Pipeline: ${pipeline.name}\nstages:\n${pipeline.stages.map(s => ` - ${s.name}`).join('\n')}`
|
|
409
|
+
|
|
410
|
+
alert(`Exported as ${format.toUpperCase()}:\n\n${content.slice(0, 500)}...`)
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return (
|
|
414
|
+
<div className="p-6">
|
|
415
|
+
<CICDBuilder
|
|
416
|
+
pipeline={pipeline}
|
|
417
|
+
onPipelineChange={setPipeline}
|
|
418
|
+
onRun={handleRun}
|
|
419
|
+
onSave={() => alert('Pipeline saved!')}
|
|
420
|
+
onExport={handleExport}
|
|
421
|
+
/>
|
|
422
|
+
</div>
|
|
423
|
+
)
|
|
424
|
+
},
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export const PipelineBuilder: Story = {
|
|
428
|
+
render: () => (
|
|
429
|
+
<div className="min-h-screen bg-muted/30">
|
|
430
|
+
<header className="bg-background border-b px-6 py-4">
|
|
431
|
+
<div className="flex items-center justify-between">
|
|
432
|
+
<div>
|
|
433
|
+
<h1 className="font-bold text-xl">Pipeline Builder</h1>
|
|
434
|
+
<p className="text-sm text-muted-foreground">Create and manage CI/CD pipelines</p>
|
|
435
|
+
</div>
|
|
436
|
+
<nav className="flex gap-4 text-sm">
|
|
437
|
+
<a href="#" className="text-foreground font-medium">Editor</a>
|
|
438
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Runs</a>
|
|
439
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Triggers</a>
|
|
440
|
+
<a href="#" className="text-muted-foreground hover:text-foreground">Variables</a>
|
|
441
|
+
</nav>
|
|
442
|
+
</div>
|
|
443
|
+
</header>
|
|
444
|
+
<main className="p-6">
|
|
445
|
+
<CICDBuilder
|
|
446
|
+
pipeline={defaultPipeline}
|
|
447
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
448
|
+
onRun={() => console.log('Run pipeline')}
|
|
449
|
+
onSave={() => console.log('Save pipeline')}
|
|
450
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
451
|
+
/>
|
|
452
|
+
</main>
|
|
453
|
+
</div>
|
|
454
|
+
),
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export const GitHubActionsStyle: Story = {
|
|
458
|
+
render: () => {
|
|
459
|
+
const ghaPipeline: Pipeline = {
|
|
460
|
+
id: 'gha',
|
|
461
|
+
name: 'CI',
|
|
462
|
+
trigger: {
|
|
463
|
+
branches: ['main', 'develop'],
|
|
464
|
+
events: ['push', 'pull_request'],
|
|
465
|
+
},
|
|
466
|
+
stages: [
|
|
467
|
+
{
|
|
468
|
+
id: 'build',
|
|
469
|
+
name: 'build',
|
|
470
|
+
steps: [
|
|
471
|
+
{ id: 'checkout', name: 'Checkout', type: 'script', command: 'actions/checkout@v4' },
|
|
472
|
+
{ id: 'setup', name: 'Setup Node.js', type: 'script', command: 'actions/setup-node@v4' },
|
|
473
|
+
{ id: 'install', name: 'Install', type: 'script', command: 'npm ci' },
|
|
474
|
+
{ id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
|
|
475
|
+
],
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
id: 'test',
|
|
479
|
+
name: 'test',
|
|
480
|
+
steps: [
|
|
481
|
+
{ id: 'test', name: 'Run Tests', type: 'test', command: 'npm test' },
|
|
482
|
+
{ id: 'upload', name: 'Upload Coverage', type: 'artifact', artifacts: ['coverage/**'] },
|
|
483
|
+
],
|
|
484
|
+
},
|
|
485
|
+
],
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
return (
|
|
489
|
+
<div className="p-6">
|
|
490
|
+
<CICDBuilder
|
|
491
|
+
pipeline={ghaPipeline}
|
|
492
|
+
onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
|
|
493
|
+
onRun={() => console.log('Run workflow')}
|
|
494
|
+
onExport={(format) => console.log('Export as:', format)}
|
|
495
|
+
/>
|
|
496
|
+
</div>
|
|
497
|
+
)
|
|
498
|
+
},
|
|
499
|
+
}
|