@vira-ui/cli 1.1.2 → 1.2.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/README.md +454 -1029
- package/dist/go/appYaml.js +30 -30
- package/dist/go/backendEnvExample.js +17 -17
- package/dist/go/backendReadme.js +14 -14
- package/dist/go/channelHelpers.js +25 -25
- package/dist/go/configGo.js +258 -258
- package/dist/go/dbGo.js +43 -43
- package/dist/go/dbYaml.js +7 -7
- package/dist/go/dockerCompose.js +48 -48
- package/dist/go/dockerComposeProd.js +78 -78
- package/dist/go/dockerfile.js +15 -15
- package/dist/go/eventHandlerTemplate.js +22 -22
- package/dist/go/eventsAPI.js +411 -411
- package/dist/go/goMod.js +16 -16
- package/dist/go/kafkaGo.js +67 -67
- package/dist/go/kafkaYaml.js +6 -6
- package/dist/go/kanbanHandlers.js +216 -216
- package/dist/go/mainGo.js +558 -558
- package/dist/go/readme.js +27 -27
- package/dist/go/redisGo.js +31 -31
- package/dist/go/redisYaml.js +4 -4
- package/dist/go/registryGo.js +38 -38
- package/dist/go/sqlcYaml.js +13 -13
- package/dist/go/stateStore.js +115 -115
- package/dist/go/typesGo.js +11 -11
- package/dist/index.js +472 -24
- package/dist/react/envExample.js +3 -3
- package/dist/react/envLocal.js +1 -1
- package/dist/react/indexCss.js +17 -17
- package/dist/react/indexHtml.js +12 -12
- package/dist/react/kanbanAppTsx.js +29 -29
- package/dist/react/kanbanBoard.js +58 -58
- package/dist/react/kanbanCard.js +60 -60
- package/dist/react/kanbanColumn.js +62 -62
- package/dist/react/kanbanModels.js +32 -32
- package/dist/react/mainTsx.js +12 -12
- package/dist/react/viteConfig.js +27 -27
- package/package.json +47 -45
- package/dist/go/useViraState.js +0 -160
- package/dist/go/useViraStream.js +0 -167
package/README.md
CHANGED
|
@@ -1,1029 +1,454 @@
|
|
|
1
|
-
# @vira-ui/cli
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
vira
|
|
106
|
-
|
|
107
|
-
#
|
|
108
|
-
vira
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
vira
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
vira
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
vira generate
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
vira
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
###
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
vira
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
# Генерация миграции
|
|
456
|
-
vira make migration create-users
|
|
457
|
-
# Создаёт: migrations/20240101120000_create-users.up.sql
|
|
458
|
-
# migrations/20240101120000_create-users.down.sql
|
|
459
|
-
|
|
460
|
-
# Выполнение миграций
|
|
461
|
-
vira db migrate # Применить все миграции
|
|
462
|
-
vira db up # Алиас для migrate
|
|
463
|
-
vira db rollback # Откатить последнюю миграцию
|
|
464
|
-
vira db down # Алиас для rollback
|
|
465
|
-
vira db status # Показать статус миграций
|
|
466
|
-
|
|
467
|
-
# С указанием URL базы данных
|
|
468
|
-
vira db migrate --db-url "postgres://user:pass@localhost/dbname?sslmode=disable"
|
|
469
|
-
# Или через переменную окружения
|
|
470
|
-
DATABASE_URL="postgres://user:pass@localhost/dbname?sslmode=disable" vira db migrate
|
|
471
|
-
|
|
472
|
-
# Генерация event handler
|
|
473
|
-
vira make event user.created
|
|
474
|
-
# Создаёт: backend/internal/events/user_created.go
|
|
475
|
-
# backend/internal/events/registry_user_created.go
|
|
476
|
-
|
|
477
|
-
# Генерация CRUD handlers
|
|
478
|
-
vira make crud user
|
|
479
|
-
# Создаёт: backend/internal/handlers/user_crud.go
|
|
480
|
-
# (ListUser, GetUser, CreateUser, UpdateUser, DeleteUser)
|
|
481
|
-
|
|
482
|
-
vira make crud product --model Product
|
|
483
|
-
# Создаёт CRUD handlers с указанной моделью
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
**Сгенерированные файлы:**
|
|
487
|
-
|
|
488
|
-
#### Handler
|
|
489
|
-
```go
|
|
490
|
-
// backend/internal/handlers/user.go
|
|
491
|
-
package handlers
|
|
492
|
-
|
|
493
|
-
import (
|
|
494
|
-
"encoding/json"
|
|
495
|
-
"net/http"
|
|
496
|
-
)
|
|
497
|
-
|
|
498
|
-
type UserResponse struct {
|
|
499
|
-
Message string `json:"message"`
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// User handles GET /user
|
|
503
|
-
func User(w http.ResponseWriter, r *http.Request) {
|
|
504
|
-
w.Header().Set("Content-Type", "application/json")
|
|
505
|
-
_ = json.NewEncoder(w).Encode(UserResponse{
|
|
506
|
-
Message: "User handler ok",
|
|
507
|
-
})
|
|
508
|
-
}
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
#### Model
|
|
512
|
-
```go
|
|
513
|
-
// backend/internal/models/User.go
|
|
514
|
-
package models
|
|
515
|
-
|
|
516
|
-
import "time"
|
|
517
|
-
|
|
518
|
-
type User struct {
|
|
519
|
-
ID string `db:"id"`
|
|
520
|
-
CreatedAt time.Time `db:"created_at"`
|
|
521
|
-
UpdatedAt time.Time `db:"updated_at"`
|
|
522
|
-
}
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
#### Migration
|
|
526
|
-
```sql
|
|
527
|
-
-- migrations/20240101120000_create-users.up.sql
|
|
528
|
-
-- +goose Up
|
|
529
|
-
-- TODO: add migration SQL here
|
|
530
|
-
|
|
531
|
-
-- migrations/20240101120000_create-users.down.sql
|
|
532
|
-
-- +goose Down
|
|
533
|
-
-- TODO: rollback SQL here
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
#### Event Handler
|
|
537
|
-
```go
|
|
538
|
-
// backend/internal/events/user_created.go
|
|
539
|
-
package events
|
|
540
|
-
|
|
541
|
-
import (
|
|
542
|
-
"context"
|
|
543
|
-
"encoding/json"
|
|
544
|
-
"github.com/gorilla/websocket"
|
|
545
|
-
)
|
|
546
|
-
|
|
547
|
-
// UserCreated handles event: user.created
|
|
548
|
-
func UserCreated(ctx context.Context, hub EventEmitter, conn *websocket.Conn, msg WSMessage) {
|
|
549
|
-
var payload map[string]any
|
|
550
|
-
if len(msg.Data) > 0 {
|
|
551
|
-
_ = json.Unmarshal(msg.Data, &payload)
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// TODO: implement domain logic here
|
|
555
|
-
// Example: hub.Emit(ChannelCustom("demo", "echo"), payload)
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
func init() {
|
|
559
|
-
Register("user.created", UserCreated)
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
// backend/internal/events/registry_user_created.go
|
|
563
|
-
package events
|
|
564
|
-
|
|
565
|
-
func init() {
|
|
566
|
-
Register("user.created", UserCreated)
|
|
567
|
-
}
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
#### CRUD Handler
|
|
571
|
-
```go
|
|
572
|
-
// backend/internal/handlers/user_crud.go
|
|
573
|
-
package handlers
|
|
574
|
-
|
|
575
|
-
import (
|
|
576
|
-
"encoding/json"
|
|
577
|
-
"net/http"
|
|
578
|
-
"github.com/gorilla/mux"
|
|
579
|
-
)
|
|
580
|
-
|
|
581
|
-
// ListUser handles GET /user
|
|
582
|
-
func ListUser(w http.ResponseWriter, r *http.Request) {
|
|
583
|
-
// Implementation
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// GetUser handles GET /user/{id}
|
|
587
|
-
func GetUser(w http.ResponseWriter, r *http.Request) {
|
|
588
|
-
// Implementation
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
// CreateUser handles POST /user
|
|
592
|
-
func CreateUser(w http.ResponseWriter, r *http.Request) {
|
|
593
|
-
// Implementation
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
// UpdateUser handles PUT /user/{id}
|
|
597
|
-
func UpdateUser(w http.ResponseWriter, r *http.Request) {
|
|
598
|
-
// Implementation
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
// DeleteUser handles DELETE /user/{id}
|
|
602
|
-
func DeleteUser(w http.ResponseWriter, r *http.Request) {
|
|
603
|
-
// Implementation
|
|
604
|
-
}
|
|
605
|
-
```
|
|
606
|
-
|
|
607
|
-
---
|
|
608
|
-
|
|
609
|
-
### `vira db` — Команды для работы с базой данных
|
|
610
|
-
|
|
611
|
-
Управление миграциями базы данных через goose.
|
|
612
|
-
|
|
613
|
-
**Подкоманды:**
|
|
614
|
-
|
|
615
|
-
#### `vira db migrate` (или `vira db up`)
|
|
616
|
-
Применить все неприменённые миграции.
|
|
617
|
-
|
|
618
|
-
**Опции:**
|
|
619
|
-
- `-d, --dir <directory>` — Директория с миграциями (по умолчанию: `migrations`)
|
|
620
|
-
- `--db-url <url>` — URL подключения к базе данных (или используйте переменную `DATABASE_URL`)
|
|
621
|
-
- `--driver <driver>` — Драйвер БД: `postgres`, `mysql`, `sqlite3` (по умолчанию: `postgres`)
|
|
622
|
-
|
|
623
|
-
**Примеры:**
|
|
624
|
-
```bash
|
|
625
|
-
# Использование переменной окружения
|
|
626
|
-
export DATABASE_URL="postgres://user:pass@localhost/mydb?sslmode=disable"
|
|
627
|
-
vira db migrate
|
|
628
|
-
|
|
629
|
-
# Или напрямую в команде
|
|
630
|
-
vira db migrate --db-url "postgres://user:pass@localhost/mydb?sslmode=disable"
|
|
631
|
-
|
|
632
|
-
# С указанием директории миграций
|
|
633
|
-
vira db migrate --dir migrations --db-url "postgres://..."
|
|
634
|
-
```
|
|
635
|
-
|
|
636
|
-
#### `vira db rollback` (или `vira db down`)
|
|
637
|
-
Откатить последнюю применённую миграцию.
|
|
638
|
-
|
|
639
|
-
**Опции:** те же, что у `migrate`
|
|
640
|
-
|
|
641
|
-
**Пример:**
|
|
642
|
-
```bash
|
|
643
|
-
vira db rollback
|
|
644
|
-
vira db rollback --db-url "postgres://user:pass@localhost/mydb?sslmode=disable"
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
#### `vira db status`
|
|
648
|
-
Показать статус всех миграций (какие применены, какие нет).
|
|
649
|
-
|
|
650
|
-
**Опции:** те же, что у `migrate`
|
|
651
|
-
|
|
652
|
-
**Пример:**
|
|
653
|
-
```bash
|
|
654
|
-
vira db status
|
|
655
|
-
```
|
|
656
|
-
|
|
657
|
-
**Примечание:** Для работы команд требуется установленный `goose`. CLI автоматически попытается установить его при первом использовании, если он не найден.
|
|
658
|
-
|
|
659
|
-
---
|
|
660
|
-
|
|
661
|
-
### `vira sync` — Синхронизация типов
|
|
662
|
-
|
|
663
|
-
Синхронизирует TypeScript типы из Go структур.
|
|
664
|
-
|
|
665
|
-
**Опции:**
|
|
666
|
-
- `--types` — Синхронизировать TypeScript типы (по умолчанию: `true`)
|
|
667
|
-
- `--backend <path>` — Путь к Go файлу (по умолчанию: `backend/internal/types/types.go`)
|
|
668
|
-
- `--frontend <path>` — Путь для TypeScript типов (по умолчанию: `frontend/src/vira-types.ts`)
|
|
669
|
-
- `--ui <path>` — Путь для TypeScript типов UI (по умолчанию: `ui/src/vira-types.ts`)
|
|
670
|
-
- `-w, --watch` — Watch mode: автоматическая синхронизация при изменениях (в разработке)
|
|
671
|
-
|
|
672
|
-
**Пример:**
|
|
673
|
-
```bash
|
|
674
|
-
vira sync --types
|
|
675
|
-
|
|
676
|
-
# С указанием путей
|
|
677
|
-
vira sync --backend backend/internal/types/types.go \
|
|
678
|
-
--frontend frontend/src/types/vira.ts \
|
|
679
|
-
--ui ui/src/types/vira.ts
|
|
680
|
-
```
|
|
681
|
-
|
|
682
|
-
**Что делает:**
|
|
683
|
-
1. Парсит Go структуры
|
|
684
|
-
2. Конвертирует Go типы в TypeScript
|
|
685
|
-
3. Генерирует TypeScript файлы с типами
|
|
686
|
-
4. Создаёт helper функции для каналов VRP
|
|
687
|
-
|
|
688
|
-
**Пример Go структуры:**
|
|
689
|
-
|
|
690
|
-
```go
|
|
691
|
-
// backend/internal/types/types.go
|
|
692
|
-
package types
|
|
693
|
-
|
|
694
|
-
type User struct {
|
|
695
|
-
ID string `json:"id"`
|
|
696
|
-
Name string `json:"name"`
|
|
697
|
-
Email string `json:"email"`
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
type Task struct {
|
|
701
|
-
ID string `json:"id"`
|
|
702
|
-
Title string `json:"title"`
|
|
703
|
-
Completed bool `json:"completed"`
|
|
704
|
-
}
|
|
705
|
-
```
|
|
706
|
-
|
|
707
|
-
**Сгенерированный TypeScript:**
|
|
708
|
-
|
|
709
|
-
```typescript
|
|
710
|
-
// frontend/src/vira-types.ts
|
|
711
|
-
// Auto-generated by vira sync --types. Do not edit manually.
|
|
712
|
-
|
|
713
|
-
export type ViraMessageType =
|
|
714
|
-
| 'handshake' | 'ack' | 'sub' | 'sub_ack' | 'unsub' | 'unsub_ack'
|
|
715
|
-
| 'update' | 'event' | 'diff' | 'ping' | 'pong' | 'error';
|
|
716
|
-
|
|
717
|
-
export enum ViraChannelEnum {
|
|
718
|
-
User = 'user',
|
|
719
|
-
Task = 'task',
|
|
720
|
-
Notifications = 'notifications',
|
|
721
|
-
Demo = 'demo',
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
export type ViraChannel =
|
|
725
|
-
| `${ViraChannelEnum.User}:${string}`
|
|
726
|
-
| `${ViraChannelEnum.Task}:${string}`
|
|
727
|
-
| `${ViraChannelEnum.Notifications}:${string}`
|
|
728
|
-
| ViraChannelEnum.Demo
|
|
729
|
-
| string;
|
|
730
|
-
|
|
731
|
-
export interface ViraDataMap {
|
|
732
|
-
User: User;
|
|
733
|
-
Task: Task;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
export type ViraAnyData = ViraDataMap[keyof ViraDataMap];
|
|
737
|
-
|
|
738
|
-
export interface User {
|
|
739
|
-
id: string;
|
|
740
|
-
name: string;
|
|
741
|
-
email: string;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
export interface Task {
|
|
745
|
-
id: string;
|
|
746
|
-
title: string;
|
|
747
|
-
completed: boolean;
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
// ... helper functions для каналов
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
---
|
|
754
|
-
|
|
755
|
-
### `vira proto` — VRP Protocol утилиты
|
|
756
|
-
|
|
757
|
-
Работа с Vira Reactive Protocol (VRP).
|
|
758
|
-
|
|
759
|
-
> **Примечание:** Некоторые функции VRP находятся в экспериментальной стадии в альфа-версиях.
|
|
760
|
-
|
|
761
|
-
**Подкоманды:**
|
|
762
|
-
|
|
763
|
-
#### `vira proto validate`
|
|
764
|
-
|
|
765
|
-
Валидирует схему VRP протокола и проверяет типы.
|
|
766
|
-
|
|
767
|
-
**Опции:**
|
|
768
|
-
- `--file <path>` — Путь к Go файлу с типами (по умолчанию: `backend/internal/types/types.go`)
|
|
769
|
-
|
|
770
|
-
**Примеры:**
|
|
771
|
-
```bash
|
|
772
|
-
# Валидация с файлом по умолчанию
|
|
773
|
-
vira proto validate
|
|
774
|
-
|
|
775
|
-
# Валидация с указанным файлом
|
|
776
|
-
vira proto validate --file backend/internal/types/models.go
|
|
777
|
-
```
|
|
778
|
-
|
|
779
|
-
**Что проверяется:**
|
|
780
|
-
- Наличие и корректность Go структур
|
|
781
|
-
- Соответствие структур требованиям VRP
|
|
782
|
-
- Наличие необходимых полей для каналов
|
|
783
|
-
|
|
784
|
-
#### `vira proto generate`
|
|
785
|
-
|
|
786
|
-
Генерирует документацию по каналам VRP и схемы протокола.
|
|
787
|
-
|
|
788
|
-
**Опции:**
|
|
789
|
-
- `--file <path>` — Путь к Go файлу с типами (по умолчанию: `backend/internal/types/types.go`)
|
|
790
|
-
- `--output <path>` — Директория для вывода (по умолчанию: `docs`)
|
|
791
|
-
|
|
792
|
-
**Примеры:**
|
|
793
|
-
```bash
|
|
794
|
-
# Генерация документации
|
|
795
|
-
vira proto generate
|
|
796
|
-
|
|
797
|
-
# С указанием путей
|
|
798
|
-
vira proto generate --file backend/internal/types/types.go --output docs/vrp
|
|
799
|
-
```
|
|
800
|
-
|
|
801
|
-
**Что генерируется:**
|
|
802
|
-
- `VRP_CHANNELS.md` — Документация по всем доступным каналам
|
|
803
|
-
- Описание типов данных для каждого канала
|
|
804
|
-
- Примеры использования с `useViraState`
|
|
805
|
-
|
|
806
|
-
---
|
|
807
|
-
|
|
808
|
-
### `vira doc` — Генерация документации
|
|
809
|
-
|
|
810
|
-
Генерирует документацию CLI команд в `docs/cli.md`.
|
|
811
|
-
|
|
812
|
-
```bash
|
|
813
|
-
vira doc
|
|
814
|
-
```
|
|
815
|
-
|
|
816
|
-
### `vira validate` — Валидация проекта
|
|
817
|
-
|
|
818
|
-
Проверяет структуру проекта и наличие необходимых файлов.
|
|
819
|
-
|
|
820
|
-
```bash
|
|
821
|
-
vira validate
|
|
822
|
-
```
|
|
823
|
-
|
|
824
|
-
**Что проверяется:**
|
|
825
|
-
- Наличие обязательных файлов (`package.json`, `vite.config.ts`, и т.д.)
|
|
826
|
-
- Структура директорий
|
|
827
|
-
- Конфигурационные файлы
|
|
828
|
-
|
|
829
|
-
---
|
|
830
|
-
|
|
831
|
-
## 🎨 Примеры
|
|
832
|
-
|
|
833
|
-
### Создание Fullstack проекта
|
|
834
|
-
|
|
835
|
-
```bash
|
|
836
|
-
# Создание проекта
|
|
837
|
-
vira create my-crm --template fullstack
|
|
838
|
-
|
|
839
|
-
cd my-crm
|
|
840
|
-
|
|
841
|
-
# Frontend: генерация компонентов
|
|
842
|
-
cd frontend
|
|
843
|
-
vira generate component ClientCard
|
|
844
|
-
vira generate service Client
|
|
845
|
-
vira generate page Clients
|
|
846
|
-
|
|
847
|
-
# Backend: генерация handlers
|
|
848
|
-
cd ../backend
|
|
849
|
-
vira make handler client
|
|
850
|
-
vira make model Client
|
|
851
|
-
vira make migration create-clients
|
|
852
|
-
|
|
853
|
-
# Синхронизация типов
|
|
854
|
-
cd ..
|
|
855
|
-
vira sync --types
|
|
856
|
-
|
|
857
|
-
# Запуск
|
|
858
|
-
cd frontend && npm install && npm run dev
|
|
859
|
-
cd ../backend && go mod tidy && go run ./cmd/api
|
|
860
|
-
```
|
|
861
|
-
|
|
862
|
-
### Синхронизация типов
|
|
863
|
-
|
|
864
|
-
```bash
|
|
865
|
-
# Создание Kanban reference app
|
|
866
|
-
vira create kanban-app --template kanban
|
|
867
|
-
|
|
868
|
-
cd kanban-app
|
|
869
|
-
|
|
870
|
-
# Генерация дополнительных компонентов
|
|
871
|
-
vira generate component TaskCard
|
|
872
|
-
vira generate service Task
|
|
873
|
-
|
|
874
|
-
# Backend: генерация event handlers
|
|
875
|
-
cd ../backend
|
|
876
|
-
vira make event kanban.card.create
|
|
877
|
-
vira make event kanban.card.move
|
|
878
|
-
vira make event kanban.card.delete
|
|
879
|
-
|
|
880
|
-
# Запуск
|
|
881
|
-
cd .. && npm install && npm run dev
|
|
882
|
-
```
|
|
883
|
-
|
|
884
|
-
### Пример 3: Работа с миграциями
|
|
885
|
-
|
|
886
|
-
```bash
|
|
887
|
-
# Создание миграции
|
|
888
|
-
vira make migration create-users
|
|
889
|
-
|
|
890
|
-
# Редактирование миграции
|
|
891
|
-
# migrations/20240101120000_create-users.up.sql
|
|
892
|
-
CREATE TABLE users (
|
|
893
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
894
|
-
name VARCHAR(255) NOT NULL,
|
|
895
|
-
email VARCHAR(255) UNIQUE NOT NULL,
|
|
896
|
-
created_at TIMESTAMP DEFAULT NOW()
|
|
897
|
-
);
|
|
898
|
-
|
|
899
|
-
# migrations/20240101120000_create-users.down.sql
|
|
900
|
-
DROP TABLE IF EXISTS users;
|
|
901
|
-
```
|
|
902
|
-
|
|
903
|
-
### Пример 4: Синхронизация типов
|
|
904
|
-
|
|
905
|
-
```bash
|
|
906
|
-
# 1. Определяем Go структуры
|
|
907
|
-
# backend/internal/types/types.go
|
|
908
|
-
type Product struct {
|
|
909
|
-
ID string `json:"id"`
|
|
910
|
-
Name string `json:"name"`
|
|
911
|
-
Price int64 `json:"price"`
|
|
912
|
-
}
|
|
913
|
-
```
|
|
914
|
-
|
|
915
|
-
# 2. Синхронизируем типы
|
|
916
|
-
vira sync --types
|
|
917
|
-
```
|
|
918
|
-
|
|
919
|
-
# 3. Используем в TypeScript
|
|
920
|
-
# frontend/src/components/ProductCard.tsx
|
|
921
|
-
import type { Product } from '../vira-types';
|
|
922
|
-
|
|
923
|
-
export function ProductCard({ product }: { product: Product }) {
|
|
924
|
-
return <div>{product.name} - ${product.price}</div>;
|
|
925
|
-
}
|
|
926
|
-
```
|
|
927
|
-
|
|
928
|
-
---
|
|
929
|
-
|
|
930
|
-
## ❓ FAQ
|
|
931
|
-
|
|
932
|
-
**Q: Можно ли использовать CLI без глобальной установки?**
|
|
933
|
-
A: Да! Используйте `npx @vira-ui/cli`.
|
|
934
|
-
|
|
935
|
-
**Q: Можно ли использовать CLI в существующем проекте?**
|
|
936
|
-
A: Да! Команды `generate` и `make` работают в любом проекте.
|
|
937
|
-
|
|
938
|
-
**Q: Как синхронизировать типы из нескольких Go файлов?**
|
|
939
|
-
A: Объедините структуры в один файл или используйте несколько вызовов `vira sync` с разными путями.
|
|
940
|
-
|
|
941
|
-
**Q: Как работает синхронизация типов?**
|
|
942
|
-
A: CLI парсит Go структуры, конвертирует типы в TypeScript и генерирует файлы с типами и helper функциями.
|
|
943
|
-
|
|
944
|
-
**Q: Поддерживаются ли другие языки backend?**
|
|
945
|
-
A: Сейчас поддерживается только Go. Поддержка других языков планируется в будущих версиях.
|
|
946
|
-
|
|
947
|
-
---
|
|
948
|
-
|
|
949
|
-
## 🔧 Разработка CLI
|
|
950
|
-
|
|
951
|
-
```bash
|
|
952
|
-
# Клонирование и установка
|
|
953
|
-
git clone https://github.com/skrolikov/vira-cli.git
|
|
954
|
-
cd vira-cli
|
|
955
|
-
npm install
|
|
956
|
-
|
|
957
|
-
# Сборка
|
|
958
|
-
npm run build
|
|
959
|
-
|
|
960
|
-
# Локальное использование
|
|
961
|
-
npm link
|
|
962
|
-
vira create test-app
|
|
963
|
-
```
|
|
964
|
-
|
|
965
|
-
## ✨ Что нового в v1.0.1
|
|
966
|
-
|
|
967
|
-
### Улучшенная генерация компонентов
|
|
968
|
-
- ✅ **Интерактивный режим** с опцией использования VRP
|
|
969
|
-
- ✅ **Интеграция с Vira UI** компонентами
|
|
970
|
-
- ✅ **Автоматическая генерация** VRP-enabled компонентов
|
|
971
|
-
- ✅ **Умный выбор props** с интерактивным добавлением типов
|
|
972
|
-
|
|
973
|
-
### Улучшенная генерация сервисов
|
|
974
|
-
- ✅ **Поддержка VRP** для сервисов
|
|
975
|
-
- ✅ **Генерация hooks** с `useViraState`
|
|
976
|
-
- ✅ **Интеграция с DI container**
|
|
977
|
-
|
|
978
|
-
### VRP Protocol утилиты
|
|
979
|
-
- ✅ **Реальная валидация** Go структур
|
|
980
|
-
- ✅ **Генерация документации** по каналам
|
|
981
|
-
- ✅ **Автоматическое определение** доступных каналов
|
|
982
|
-
|
|
983
|
-
### Новые команды
|
|
984
|
-
- ✅ `vira init` — инициализация проекта в существующей директории
|
|
985
|
-
- ✅ `vira generate test` — генерация тестов
|
|
986
|
-
- ✅ `vira make crud` — генерация CRUD handlers
|
|
987
|
-
- ✅ `vira validate` — валидация структуры проекта
|
|
988
|
-
|
|
989
|
-
## 🛣️ Roadmap
|
|
990
|
-
|
|
991
|
-
### v1.1 (В разработке)
|
|
992
|
-
- [ ] Watch mode для `vira sync`
|
|
993
|
-
- [ ] Поддержка других шаблонов (Vue, Svelte)
|
|
994
|
-
- [ ] Генерация Storybook историй
|
|
995
|
-
- [ ] Плагины для расширения функциональности
|
|
996
|
-
|
|
997
|
-
### v1.2 (Планируется)
|
|
998
|
-
- [ ] Шаблоны для микросервисов
|
|
999
|
-
- [ ] Интеграция с CI/CD
|
|
1000
|
-
- [ ] Генерация OpenAPI спецификаций
|
|
1001
|
-
- [ ] Автоматическая генерация событий из схем
|
|
1002
|
-
---
|
|
1003
|
-
|
|
1004
|
-
## 📄 License
|
|
1005
|
-
|
|
1006
|
-
MIT
|
|
1007
|
-
|
|
1008
|
-
---
|
|
1009
|
-
|
|
1010
|
-
## 🤝 Contributing
|
|
1011
|
-
|
|
1012
|
-
Мы приветствуем вклад! Пожалуйста, прочитайте [CONTRIBUTING.md](../../CONTRIBUTING.md) для деталей.
|
|
1013
|
-
|
|
1014
|
-
---
|
|
1015
|
-
|
|
1016
|
-
## 📞 Support
|
|
1017
|
-
|
|
1018
|
-
- **GitHub Issues**: [Создать issue](https://github.com/skrolikov/vira-cli/issues)
|
|
1019
|
-
- **Discussions**: [Обсуждения](https://github.com/skrolikov/vira-cli/discussions)
|
|
1020
|
-
|
|
1021
|
-
---
|
|
1022
|
-
|
|
1023
|
-
<div align="center">
|
|
1024
|
-
|
|
1025
|
-
**Сделано с ❤️ командой Vira**
|
|
1026
|
-
|
|
1027
|
-
[GitHub](https://github.com/skrolikov/vira-cli) • [Документация](https://vira.dev/cli) • [Примеры](https://vira.dev/examples)
|
|
1028
|
-
|
|
1029
|
-
</div>
|
|
1
|
+
# @vira-ui/cli
|
|
2
|
+
|
|
3
|
+
CLI инструмент для генерации проектов и кода на основе Vira Framework.
|
|
4
|
+
|
|
5
|
+
## 📦 Установка
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @vira-ui/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Или используйте через `npx`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @vira-ui/cli create my-project
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 🚀 Быстрый старт
|
|
18
|
+
|
|
19
|
+
### Создание нового проекта
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Интерактивный режим
|
|
23
|
+
vira create my-project
|
|
24
|
+
|
|
25
|
+
# С указанием шаблона
|
|
26
|
+
vira create my-project --template frontend
|
|
27
|
+
vira create my-project --template fullstack
|
|
28
|
+
vira create my-project --template kanban
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Инициализация в текущей директории
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
vira init
|
|
35
|
+
vira init --template frontend
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 📚 Команды
|
|
39
|
+
|
|
40
|
+
### Создание проектов
|
|
41
|
+
|
|
42
|
+
#### `vira create <name>`
|
|
43
|
+
|
|
44
|
+
Создает новый проект в указанной директории.
|
|
45
|
+
|
|
46
|
+
**Опции:**
|
|
47
|
+
- `-t, --template <template>` - Шаблон проекта (`frontend`, `fullstack`, `kanban`)
|
|
48
|
+
|
|
49
|
+
**Примеры:**
|
|
50
|
+
```bash
|
|
51
|
+
vira create my-app
|
|
52
|
+
vira create my-app --template fullstack
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### `vira init`
|
|
56
|
+
|
|
57
|
+
Инициализирует проект в текущей директории.
|
|
58
|
+
|
|
59
|
+
**Опции:**
|
|
60
|
+
- `-t, --template <template>` - Шаблон проекта
|
|
61
|
+
|
|
62
|
+
**Примеры:**
|
|
63
|
+
```bash
|
|
64
|
+
vira init
|
|
65
|
+
vira init --template frontend
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Генерация кода
|
|
69
|
+
|
|
70
|
+
#### `vira generate <type> <name>`
|
|
71
|
+
|
|
72
|
+
Генерирует компоненты, сервисы, страницы и другие артефакты.
|
|
73
|
+
|
|
74
|
+
**Типы:**
|
|
75
|
+
- `component` / `comp` - React компонент
|
|
76
|
+
- `service` - Сервис с DI
|
|
77
|
+
- `page` - Страница
|
|
78
|
+
- `model` - Модель данных
|
|
79
|
+
- `route` - Роут
|
|
80
|
+
- `test` - Тест
|
|
81
|
+
|
|
82
|
+
**Опции:**
|
|
83
|
+
- `-d, --dir <directory>` - Директория для вывода (по умолчанию: `src`)
|
|
84
|
+
- `-i, --interactive` - Интерактивный режим
|
|
85
|
+
- `--vrp` - Использовать Vira Reactive Protocol
|
|
86
|
+
- `--no-vrp` - Не использовать VRP
|
|
87
|
+
|
|
88
|
+
**Примеры:**
|
|
89
|
+
```bash
|
|
90
|
+
# Компонент
|
|
91
|
+
vira generate component Button
|
|
92
|
+
vira generate component UserCard --interactive
|
|
93
|
+
vira generate component TaskList --vrp
|
|
94
|
+
|
|
95
|
+
# Сервис
|
|
96
|
+
vira generate service user
|
|
97
|
+
vira generate service task --vrp --interactive
|
|
98
|
+
|
|
99
|
+
# Страница
|
|
100
|
+
vira generate page Dashboard
|
|
101
|
+
vira generate page Users --dir src/pages
|
|
102
|
+
|
|
103
|
+
# Модель
|
|
104
|
+
vira generate model User
|
|
105
|
+
vira generate model Product --dir src/models
|
|
106
|
+
|
|
107
|
+
# Роут
|
|
108
|
+
vira generate route users
|
|
109
|
+
vira generate route dashboard --dir src/routes
|
|
110
|
+
|
|
111
|
+
# Тест
|
|
112
|
+
vira generate test Button
|
|
113
|
+
vira generate test UserService
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Backend scaffolding (Go)
|
|
117
|
+
|
|
118
|
+
#### `vira make handler <name>`
|
|
119
|
+
|
|
120
|
+
Создает Go HTTP handler.
|
|
121
|
+
|
|
122
|
+
**Опции:**
|
|
123
|
+
- `-d, --dir <directory>` - Целевая директория
|
|
124
|
+
|
|
125
|
+
**Пример:**
|
|
126
|
+
```bash
|
|
127
|
+
vira make handler user
|
|
128
|
+
vira make handler product --dir backend/internal/handlers
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### `vira make migration <name>`
|
|
132
|
+
|
|
133
|
+
Создает SQL миграцию (up/down).
|
|
134
|
+
|
|
135
|
+
**Опции:**
|
|
136
|
+
- `-d, --dir <directory>` - Директория миграций (по умолчанию: `migrations`)
|
|
137
|
+
|
|
138
|
+
**Пример:**
|
|
139
|
+
```bash
|
|
140
|
+
vira make migration create-users
|
|
141
|
+
vira make migration add-email-to-users --dir backend/migrations
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### `vira make event <name>`
|
|
145
|
+
|
|
146
|
+
Создает Go event handler stub.
|
|
147
|
+
|
|
148
|
+
**Опции:**
|
|
149
|
+
- `-d, --dir <directory>` - Целевая директория
|
|
150
|
+
|
|
151
|
+
**Пример:**
|
|
152
|
+
```bash
|
|
153
|
+
vira make event user.created
|
|
154
|
+
vira make event task.updated --dir backend/internal/events
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### `vira make model <name>`
|
|
158
|
+
|
|
159
|
+
Создает Go model struct.
|
|
160
|
+
|
|
161
|
+
**Опции:**
|
|
162
|
+
- `-d, --dir <directory>` - Целевая директория
|
|
163
|
+
- `-f, --fields <fields>` - Поля через запятую (например: `name:string,email:string`)
|
|
164
|
+
|
|
165
|
+
**Примеры:**
|
|
166
|
+
```bash
|
|
167
|
+
vira make model User
|
|
168
|
+
vira make model Product --fields "name:string,price:number,description:string"
|
|
169
|
+
vira make model Client --dir backend/internal/models
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### `vira make crud <name>`
|
|
173
|
+
|
|
174
|
+
Создает CRUD handlers для ресурса.
|
|
175
|
+
|
|
176
|
+
**Опции:**
|
|
177
|
+
- `-d, --dir <directory>` - Целевая директория
|
|
178
|
+
- `-m, --model <model>` - Имя модели (по умолчанию: капитализированное имя ресурса)
|
|
179
|
+
|
|
180
|
+
**Пример:**
|
|
181
|
+
```bash
|
|
182
|
+
vira make crud user
|
|
183
|
+
vira make crud product --model Product
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Работа с базой данных
|
|
187
|
+
|
|
188
|
+
#### `vira db migrate`
|
|
189
|
+
|
|
190
|
+
Выполняет миграции базы данных.
|
|
191
|
+
|
|
192
|
+
**Опции:**
|
|
193
|
+
- `-d, --dir <directory>` - Директория миграций
|
|
194
|
+
- `--db-url <url>` - URL подключения к БД
|
|
195
|
+
- `--driver <driver>` - Драйвер БД (`postgres`, `mysql`, `sqlite3`)
|
|
196
|
+
|
|
197
|
+
**Пример:**
|
|
198
|
+
```bash
|
|
199
|
+
vira db migrate
|
|
200
|
+
vira db migrate --db-url postgres://user:pass@localhost/dbname
|
|
201
|
+
vira db migrate --driver mysql
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
#### `vira db rollback`
|
|
205
|
+
|
|
206
|
+
Откатывает последнюю миграцию.
|
|
207
|
+
|
|
208
|
+
**Пример:**
|
|
209
|
+
```bash
|
|
210
|
+
vira db rollback
|
|
211
|
+
vira db rollback --db-url postgres://user:pass@localhost/dbname
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
#### `vira db status`
|
|
215
|
+
|
|
216
|
+
Показывает статус миграций.
|
|
217
|
+
|
|
218
|
+
**Пример:**
|
|
219
|
+
```bash
|
|
220
|
+
vira db status
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### VRP (Vira Reactive Protocol)
|
|
224
|
+
|
|
225
|
+
#### `vira proto validate`
|
|
226
|
+
|
|
227
|
+
Валидирует схему VRP протокола.
|
|
228
|
+
|
|
229
|
+
**Опции:**
|
|
230
|
+
- `--file <path>` - Путь к файлу типов
|
|
231
|
+
|
|
232
|
+
**Пример:**
|
|
233
|
+
```bash
|
|
234
|
+
vira proto validate
|
|
235
|
+
vira proto validate --file backend/internal/types/types.go
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
#### `vira proto generate`
|
|
239
|
+
|
|
240
|
+
Генерирует документацию по VRP каналам.
|
|
241
|
+
|
|
242
|
+
**Опции:**
|
|
243
|
+
- `--file <path>` - Путь к файлу типов
|
|
244
|
+
- `--output <path>` - Директория для вывода
|
|
245
|
+
|
|
246
|
+
**Пример:**
|
|
247
|
+
```bash
|
|
248
|
+
vira proto generate
|
|
249
|
+
vira proto generate --output docs
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Синхронизация типов
|
|
253
|
+
|
|
254
|
+
#### `vira sync`
|
|
255
|
+
|
|
256
|
+
Синхронизирует TypeScript типы из Go structs.
|
|
257
|
+
|
|
258
|
+
**Опции:**
|
|
259
|
+
- `--types` - Синхронизировать типы (по умолчанию: true)
|
|
260
|
+
- `--backend <path>` - Путь к Go файлу типов
|
|
261
|
+
- `--from-models` - Генерировать из директории моделей
|
|
262
|
+
- `--models <path>` - Путь к директории моделей
|
|
263
|
+
- `--frontend <path>` - Путь для вывода TS типов (frontend)
|
|
264
|
+
- `--ui <path>` - Путь для вывода TS типов (ui)
|
|
265
|
+
- `-w, --watch` - Watch режим (автоматическая синхронизация)
|
|
266
|
+
|
|
267
|
+
**Примеры:**
|
|
268
|
+
```bash
|
|
269
|
+
# Синхронизация из types.go
|
|
270
|
+
vira sync --types
|
|
271
|
+
|
|
272
|
+
# Синхронизация из директории моделей
|
|
273
|
+
vira sync --types --from-models
|
|
274
|
+
|
|
275
|
+
# Watch режим
|
|
276
|
+
vira sync --types --watch
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Валидация проекта
|
|
280
|
+
|
|
281
|
+
#### `vira validate`
|
|
282
|
+
|
|
283
|
+
Валидирует структуру проекта и конфигурацию.
|
|
284
|
+
|
|
285
|
+
**Пример:**
|
|
286
|
+
```bash
|
|
287
|
+
vira validate
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Генерация документации
|
|
291
|
+
|
|
292
|
+
#### `vira doc`
|
|
293
|
+
|
|
294
|
+
Генерирует документацию CLI команд.
|
|
295
|
+
|
|
296
|
+
**Пример:**
|
|
297
|
+
```bash
|
|
298
|
+
vira doc
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## 📋 Шаблоны проектов
|
|
302
|
+
|
|
303
|
+
### Frontend
|
|
304
|
+
|
|
305
|
+
React + Vite + Vira UI проект:
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
vira create my-app --template frontend
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Структура:**
|
|
312
|
+
```
|
|
313
|
+
my-app/
|
|
314
|
+
├── src/
|
|
315
|
+
│ ├── components/
|
|
316
|
+
│ ├── services/
|
|
317
|
+
│ ├── pages/
|
|
318
|
+
│ ├── models/
|
|
319
|
+
│ └── main.tsx
|
|
320
|
+
├── package.json
|
|
321
|
+
├── vite.config.ts
|
|
322
|
+
└── tsconfig.json
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Fullstack
|
|
326
|
+
|
|
327
|
+
Frontend + Go Backend + Docker:
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
vira create my-app --template fullstack
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Структура:**
|
|
334
|
+
```
|
|
335
|
+
my-app/
|
|
336
|
+
├── frontend/ # React приложение
|
|
337
|
+
├── backend/ # Go backend
|
|
338
|
+
├── ui/ # UI пакет
|
|
339
|
+
├── migrations/ # SQL миграции
|
|
340
|
+
└── deploy/ # Docker compose файлы
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Kanban
|
|
344
|
+
|
|
345
|
+
Reference приложение с VRP:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
vira create kanban-app --template kanban
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Демонстрирует использование Vira Reactive Protocol для real-time синхронизации.
|
|
352
|
+
|
|
353
|
+
## 🎯 Примеры использования
|
|
354
|
+
|
|
355
|
+
### Создание компонента с VRP
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
vira generate component TaskCard --vrp --interactive
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Интерактивно создаст компонент с интеграцией VRP.
|
|
362
|
+
|
|
363
|
+
### Создание сервиса
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
vira generate service user --vrp
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Создаст сервис с поддержкой VRP для синхронизации состояния.
|
|
370
|
+
|
|
371
|
+
### Создание CRUD API
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# Backend: Go handlers
|
|
375
|
+
vira make crud user
|
|
376
|
+
|
|
377
|
+
# Frontend: Service
|
|
378
|
+
vira generate service user --vrp
|
|
379
|
+
|
|
380
|
+
# Frontend: Page
|
|
381
|
+
vira generate page Users
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Синхронизация типов
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
# После изменения Go моделей
|
|
388
|
+
vira sync --types --from-models
|
|
389
|
+
|
|
390
|
+
# TypeScript типы автоматически обновятся в frontend/src/vira-types.ts
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## 🔧 Конфигурация
|
|
394
|
+
|
|
395
|
+
CLI автоматически определяет структуру проекта. Для кастомизации можно использовать:
|
|
396
|
+
|
|
397
|
+
- `.vira.json` - Конфигурационный файл (планируется)
|
|
398
|
+
- Переменные окружения для путей
|
|
399
|
+
- Опции командной строки
|
|
400
|
+
|
|
401
|
+
## 📖 Примеры генерации
|
|
402
|
+
|
|
403
|
+
### Компонент с props
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
vira generate component Button --interactive
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Интерактивно спросит:
|
|
410
|
+
- Нужны ли props?
|
|
411
|
+
- Какие props?
|
|
412
|
+
- Использовать VRP?
|
|
413
|
+
- Использовать Vira UI?
|
|
414
|
+
|
|
415
|
+
### Сервис с VRP
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
vira generate service task --vrp
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
Создаст сервис с:
|
|
422
|
+
- VRP интеграцией
|
|
423
|
+
- CRUD методами
|
|
424
|
+
- Bulk операциями
|
|
425
|
+
- Автоматической синхронизацией
|
|
426
|
+
|
|
427
|
+
## 🐛 Troubleshooting
|
|
428
|
+
|
|
429
|
+
### Проблемы с миграциями
|
|
430
|
+
|
|
431
|
+
Если миграции не выполняются:
|
|
432
|
+
|
|
433
|
+
1. Проверьте `DATABASE_URL` в `.env`
|
|
434
|
+
2. Убедитесь, что `goose` установлен: `go install github.com/pressly/goose/v3/cmd/goose@latest`
|
|
435
|
+
3. Проверьте права доступа к БД
|
|
436
|
+
|
|
437
|
+
### Проблемы с синхронизацией типов
|
|
438
|
+
|
|
439
|
+
Если типы не синхронизируются:
|
|
440
|
+
|
|
441
|
+
1. Проверьте путь к Go файлам: `vira sync --backend backend/internal/types/types.go`
|
|
442
|
+
2. Используйте `--from-models` для генерации из директории моделей
|
|
443
|
+
3. Проверьте формат Go structs
|
|
444
|
+
|
|
445
|
+
## 📄 License
|
|
446
|
+
|
|
447
|
+
MIT
|
|
448
|
+
|
|
449
|
+
## 🔗 Связанные пакеты
|
|
450
|
+
|
|
451
|
+
- [`@vira-ui/core`](../core/README.md) - Базовый фреймворк
|
|
452
|
+
- [`@vira-ui/ui`](../ui/README.md) - UI компоненты
|
|
453
|
+
- [`@vira-ui/react`](../react/README.md) - React хуки для VRP
|
|
454
|
+
|